在Keras中,训练完一个有状态的LSTM模型后,是否需要在预测时重新训练模型?

我一直在尝试使用keras创建一个stateful LSTM模型,训练部分我基本已经弄明白了,但是预测部分我还不太清楚。

假设我们有10000个时间序列数据点。我们使用前9000个进行训练,其余1000个用于测试。在开始训练时,我们将窗口长度设置为2,并在设置输入(X)为第一个数据点和输出(y)为第二个数据点时向前滑动窗口。X as input and y as output

随着训练的进行,由于其有状态的特性,模型会收敛。最后,我们完成了训练。

现在,我们有了一个模型和一些测试数据。问题从这里开始。我们测试第一个数据点。enter image description here

它返回了一个猜测值。很好。

我们测试测试集的第二个数据点。enter image description here

我们得到了一个输出。但是,问题在于因为我们使用的是有状态的模型,并且我们只输入了一个值,模型唯一能推断下一个值的方式就是依赖于之前时间序列的记忆。

但是由于我们没有在测试集的第一个数据点上进行训练,时间序列被打断了,模型会认为测试集的第二个数据点是测试集的第一个数据点!

所以,我的疑问是,

  1. keras是否会处理这个问题,并在预测时自动训练网络?
  2. 还是我需要在预测时训练网络?
  3. 或者是否有其他原因让我可以继续预测而无需进一步训练模型?

回答:

对于有状态的LSTM模型,它会在预测时保留其单元格中的信息。如果你从训练或测试数据集中随机选择一个点并反复预测,你每次的答案都会有所不同,因为它不断看到这些数据并在每次预测时使用它们。唯一能得到可重复答案的方法是调用reset_states()

你应该在每个训练周期后以及保存模型时调用reset_states(),这样那些单元格应该为空。然后,如果你想开始对测试集进行预测,你可以先对最后n个训练点进行预测(不保存任何值),然后一旦到达你的第一个测试点,就开始保存值。

在预测前为模型播种通常是一个好做法。如果我想评估test_set[10:20,:],我可以先让模型预测test_set[:10,:]来播种模型,然后一旦到达我感兴趣的范围,就开始保存我的预测值。

关于进一步训练的问题,你不需要进一步训练模型来进行预测。训练仅用于调整模型的权重。请查看此博客以获取更多关于有状态与无状态LSTM的信息。

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中创建了一个多类分类项目。该项目可以对…

发表回复

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