我正在一个由不同来源组成的大型数据集上训练RNN。我不希望一套的历史溢出到下一个。这意味着我想在一组结束时重置隐藏状态,然后再发送。我怎么能用Keras做到这一点?该文档声称您可以进入低级配置。
我想要做的是每次输入新数据集时重置lstm隐藏状态,因此不会转发来自prev数据集的影响。见行
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)
来自Karpathy的简单python实现 https://gist.github.com/karpathy/587454dc0146a6ae21fc 第45行
如果我找到了lstm层并调用了重置,我担心这会消除整个权重和偏差的训练,而不仅仅是Hout
这是训练循环代码
UserSchema.methods.comparePassword = function(password) {
if (!this.password) { return false; }
return bcrypt.compareSync( password, this.password );
};
循环中的每个回合都会从单个市场中提供数据。这就是我喜欢在lstm中重置hout的地方。
答案 0 :(得分:2)
要重置模型的状态,请在特定图层或整个模型上调用
.reset_states()
。 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()
能够达到您的期望,请随时转到源代码。