我在一个由不同来源组成的大型数据集上训练 RNN。我不希望一组的历史溢出到下一组。这意味着我想在一组结束时重置隐藏状态,然后再发送下一组。我怎样才能用 Keras 做到这一点?该文档声称您可以进入低级配置。
我想要做的是在每次输入新数据集时重置 lstm 隐藏状态,因此不会受到前一个数据集的影响。见行
prevh = Hout[t-1] if t > 0 else h0
来自 Karpathy 的简单 python 实现 https://gist.github.com/karpathy/587454dc0146a6ae21fc 第 45 行
如果我找到 lstm 层并在其上调用 reset,我担心这会消除权重和偏差的整个训练,而不仅仅是 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 中重置 hout 的地方。
最佳答案
To reset the states of your model, call
.reset_states()
on either a specific layer, or on your entire model. source
所以如果你有一个数据集列表:
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()
会执行您期望的操作,请随时查看源代码。
关于hidden - 我可以在 Keras 的输入数据集之间重置 RNN 的隐藏状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42591068/