在Keras中,我能否重置RNN的隐藏状态以在输入数据集之间进行处理?

3
我正在对一个由不同来源组成的大型数据集进行RNN训练。我不想让一个数据集的历史影响到下一个数据集。这意味着我想在发送下一个数据集之前重置隐藏状态。如何使用Keras实现这一点?文档声称可以进入低级配置。
我的目标是每当喂入新的数据集时重置lstm隐藏状态,以便不会传递先前数据集的影响。请参见该行代码。
prevh = Hout[t-1] if t > 0 else h0

从Karpathy的简单Python实现中

https://gist.github.com/karpathy/587454dc0146a6ae21fc

第45行

如果我找到LSTM层并对其进行重置,我担心这将清除所有权重和偏差的训练,而不仅仅是Hout。

以下是训练循环代码:

for iteration in range(1, 10):
    for key in X_dict:
        X = X_dict[key]
        y = y_dict[key]
        history=model.fit(X, y, batch_size=batch_size, callbacks=cbks, nb_epoch=1,verbose=0)

每一次循环都会从一个市场输入数据。这就是我喜欢在LSTM中重置小时的地方。


为什么要重置隐藏状态?因为这是学习潜在特征的地方。 - Camron_Godbout
1个回答

2
要重置模型的状态,请在特定层或整个模型上调用.reset_states()来源。如果您有一个数据集列表:
for ds in datasets :
    model.reset_states()
    model.fit(ds['inputs'],ds['targets'],...)

这是您在寻找的内容吗?
编辑:
for iteration in range(1, 10):
    for key in X_dict:
        model.reset_states() # reset the states of all the LSTM's of your network
        #model.layers[lstm_layer_index].reset_states() # reset the states of this specific LSTM layer
        X = X_dict[key]
        y = y_dict[key]
        history=model.fit(X, y, batch_size=batch_size, callbacks=cbks, nb_epoch=1,verbose=0)

以下是如何应用它。

LSTM默认情况下不是有状态的,这意味着它们在处理完一个序列后不会保留隐藏状态。当开始新的序列时,初始状态将被设置为0。如果选择了stateful=True,那么它将保留上一个序列的最后隐藏状态(输出),以便在批处理中初始化下一个序列。就像序列在继续一样。

执行model.reset_states()将只重置那些保存在内存中的最后隐藏状态为0,就像序列从头开始。

如果您不信任.reset_states()能够达到您的期望结果,请随时查看源代码。


我很难找到如何重置单个图层的方法。如果您能提供更多相关代码就好了。我在帖子中进一步解释了我要重置什么。 - bhomass
请展示你的代码,我需要看看你现在在做什么,然后我会告诉你如何实现你想要的功能。你是通过批处理来输入你的网络吗?你想要每个样本或者一大批样本/批次之后将隐藏状态重置为0吗? - Nassim Ben
让我先用语言解释一下。在大量批处理之后重置。我在一个循环中,这个重置应该发生在每个循环的顶部。 - bhomass
好的,那请展示一下你的循环以及你想要重置的位置,我会调整我的回答,可以吗? - Nassim Ben
循环代码如下所示。不确定它为什么有助于答案,但希望它能够起到作用。 - bhomass
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接