在Keras中使用有状态LSTM:在fit、evaluate和predict时重置状态?

我想进一步探讨何时重置状态的问题。

有状态LSTM:何时重置状态?

假设我这样训练一个有状态模型:

for i in range(epochs):    model.fit(X_train, y_train, epochs=1, batch_size=1, shuffle=False)    model.reset_states()

我的训练集和测试集来自于同一个时间序列数据集,且测试集紧跟在训练集之后。

接下来,我想评估测试集并获取预测结果数组。

score = model.evaluate(X_test, y_test, batch_size=1, verbose=True)prediction = model.predict(X_test, batch_size=1)

我觉得在训练循环结束时重置模型状态会导致评估或预测步骤在数据集的开始部分出现错误。确实如此吗?如果数据在测试集中继续顺序进行,我是否应该在最后一个epoch不重置状态?

此外,在评估测试集后,我是否需要将模型的状态恢复到训练集结束时的状态,然后再尝试预测?我应该复制模型吗?保存并重新加载它?


回答:

确实,如果你在评估测试集之前重置状态,它会假设测试序列是一个全新的序列。它将从头开始。如果整个序列的一般行为不随时间变化,可能错误不会太大。但我不会冒险。

如果测试序列是训练序列的延续,那么为了获得最佳结果,它应该从适当的状态开始。

但我建议你这样做:

  • 重置状态(这些状态受到了在最后一个epoch开始时尚未训练的权重的影响)
  • 评估训练序列(以创建新的、最新的状态)
  • 评估测试序列

然后这样做:

  • 重置状态(评估需要改变状态)
  • 预测训练序列(重新创建状态)
  • 预测测试序列

未回答的问题:我不知道evaluate方法是否会将状态恢复到之前的状态。但我相信它不会。你可能需要评估足够长的序列来填满你的内存,然后你就得分批评估。

题外话:链接问题中的误解:

在Keras中,样本就是序列。对于循环层,批次中的维度是:

  • (sequences, timeSteps, features),其中序列的数量、样本的数量和批次大小是完全相同的东西。(查看文档以确认第二个维度是序列中的“步骤”:https://keras.io/layers/recurrent/

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注