在 Keras 中,在训练有状态 LSTM 模型后,是否必须在预测值时重新训练模型?

时间:2021-02-02 12:31:07

标签: python tensorflow machine-learning keras deep-learning

我一直在尝试使用 stateful LSTM model 创建一个 keras,我几乎弄清楚了训练部分,但我没有得到预测部分。

所以,假设我们有 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. 或者是否有其他原因使我能够继续预测而不进一步训练模型?

1 个答案:

答案 0 :(得分:1)

对于有状态的 LSTM,如果将按照您的预测在其单元格中保留信息。如果您在火车或测试数据集中随机选取任何点并对其进行重复预测,您的答案每次都会改变,因为它会不断查看这些数据并在每次预测时使用它。获得可重复答案的唯一方法是调用 reset_states()

您应该在每个训练时期之后调用 reset_states(),并且当您保存模型时,这些单元格应该是空的。然后,如果您想开始对测试集进行预测,您可以对最后 n 个训练点进行预测(无需将值保存在任何地方),然后在到达第一个测试点后开始保存值。

在预测之前为模型设定种子通常是一种很好的做法。如果我想对 test_set[10:20,:] 进行评估,我可以先让模型在 test_set[:10,:] 上进行预测以播种模型,然后在达到我感兴趣的范围后开始保存我的预测值。

要解决进一步训练的问题,您无需进一步训练模型进行预测。训练将仅用于调整模型的权重。查看此博客以了解有关 Stateful vs Stateless LSTM 的更多信息。