我可以在Keras的输入数据集之间重置RNN的隐藏状态吗?

时间:2017-03-04 01:30:39

标签: hidden keras recurrent-neural-network

我正在一个由不同来源组成的大型数据集上训练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的地方。

1 个答案:

答案 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()能够达到您的期望,请随时转到源代码。