在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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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