我一直在尝试使用 stateful LSTM model
创建一个 keras
,我几乎弄清楚了训练部分,但我没有得到预测部分。
所以,假设我们有 10000 个时间序列数据点。我们用前面的 9000 个进行训练,另外 1000 个用于测试。因此,当我们开始训练时,我们将窗口长度设置为 2,并在将输入(X
)设置为第一个数据点并将输出(y
)设置为第二个时向前滑动窗口数据点。
当我们训练时,模型会收敛,因为它是有状态的。终于我们完成了训练。
现在,我们剩下一个模型和一些测试数据。问题从这里开始。我们测试第一个数据点。
它返回一个猜测值。不错。
我们得到一个输出。但是,问题是,因为我们使用的是有状态模型,而且我们只有一个值作为输入,所以模型要找出下一个值的唯一方法是从前一个时间序列的记忆中。
但是由于我们没有在测试集的第一个数据点上训练数据,时间序列被破坏了,模型会认为测试集的第二个数据点是测试集上的第一个数据点!
所以,我的问题是,
keras
是否会处理这个问题并在预测时自动训练网络?答案 0 :(得分:1)
对于有状态的 LSTM,如果将按照您的预测在其单元格中保留信息。如果您在火车或测试数据集中随机选取任何点并对其进行重复预测,您的答案每次都会改变,因为它会不断查看这些数据并在每次预测时使用它。获得可重复答案的唯一方法是调用 reset_states()
。
您应该在每个训练时期之后调用 reset_states()
,并且当您保存模型时,这些单元格应该是空的。然后,如果您想开始对测试集进行预测,您可以对最后 n 个训练点进行预测(无需将值保存在任何地方),然后在到达第一个测试点后开始保存值。
在预测之前为模型设定种子通常是一种很好的做法。如果我想对 test_set[10:20,:]
进行评估,我可以先让模型在 test_set[:10,:]
上进行预测以播种模型,然后在达到我感兴趣的范围后开始保存我的预测值。
要解决进一步训练的问题,您无需进一步训练模型进行预测。训练将仅用于调整模型的权重。查看此博客以了解有关 Stateful vs Stateless LSTM 的更多信息。