我一直在尝试使用 keras
创建一个有状态 LSTM 模型
,我几乎弄清楚了训练部分,但我没有得到预测部分.
那么,假设我们有 10000 个时间序列数据点。我们使用前面的 9000 个用于训练,另外 1000 个用于测试。因此,当我们开始训练时,我们将窗口长度设置为 2,并在将输入 (X
) 设置为第一个数据点并设置输出 (y
) 作为第二个数据点。
在我们训练时,模型会收敛,因为它是有状态的。最后我们完成了训练。
现在,我们只剩下一个模型和一些测试数据。问题从这里开始。我们测试第一个数据点。
它返回一个猜测值。不错。
我们得到一个输出。但是,问题在于,因为我们使用的是有状态模型,而且我们只有一个值作为输入,所以模型计算出下一个值的唯一方法是从先前时间序列的内存中获取。
但由于我们没有在测试集的第一个数据点上训练数据,时间序列被打破,模型会认为测试集上的第二个数据点是测试集上的第一个数据点!
所以,我的问题是,
keras
是否会处理此问题并自动训练网络进行预测?- 还是我必须像我预测的那样训练网络
- 还是有其他一些原因使我能够在不进一步训练模型的情况下继续进行预测?
最佳答案
对于有状态 LSTM,如果会像您预测的那样在其单元格中保留信息。如果您要在训练或测试数据集中取任何随机点并对其进行重复预测,您的答案每次都会改变,因为它会不断看到这些数据并在每次预测时使用它。获得可重复答案的唯一方法是调用 reset_states()
。
您应该在每个训练时期后调用 reset_states()
,并且当您保存模型时,这些单元格应该是空的。然后,如果您想开始对测试集进行预测,您可以对最后 n 个训练点进行预测(无需在任何地方保存值),然后在到达第一个测试点后开始保存值。
在预测之前为模型播种通常是一种很好的做法。如果我想在 test_set[10:20,:]
上进行评估,我可以让模型先在 test_set[:10,:]
上进行预测,然后开始为模型播种一旦达到我感兴趣的范围,就保存我的预测值。
要解决进一步的训练问题,您不需要进一步训练模型来进行预测。训练将仅用于调整模型的权重。查看此博客以获取有关 Stateful vs Stateless LSTM 的更多信息.
关于python - 在 Keras 中,训练有状态 LSTM 模型后,是否必须在预测值时重新训练模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66009779/