我一直在尝试使用keras
创建一个stateful LSTM模型
,训练部分我基本已经弄明白了,但是预测部分我还不太清楚。
假设我们有10000个时间序列数据点。我们使用前9000个进行训练,其余1000个用于测试。在开始训练时,我们将窗口长度设置为2,并在设置输入(X
)为第一个数据点和输出(y
)为第二个数据点时向前滑动窗口。
随着训练的进行,由于其有状态的特性,模型会收敛。最后,我们完成了训练。
现在,我们有了一个模型和一些测试数据。问题从这里开始。我们测试第一个数据点。
它返回了一个猜测值。很好。
我们得到了一个输出。但是,问题在于因为我们使用的是有状态的模型,并且我们只输入了一个值,模型唯一能推断下一个值的方式就是依赖于之前时间序列的记忆。
但是由于我们没有在测试集的第一个数据点上进行训练,时间序列被打断了,模型会认为测试集的第二个数据点是测试集的第一个数据点!
所以,我的疑问是,
keras
是否会处理这个问题,并在预测时自动训练网络?- 还是我需要在预测时训练网络?
- 或者是否有其他原因让我可以继续预测而无需进一步训练模型?
回答:
对于有状态的LSTM模型,它会在预测时保留其单元格中的信息。如果你从训练或测试数据集中随机选择一个点并反复预测,你每次的答案都会有所不同,因为它不断看到这些数据并在每次预测时使用它们。唯一能得到可重复答案的方法是调用reset_states()
。
你应该在每个训练周期后以及保存模型时调用reset_states()
,这样那些单元格应该为空。然后,如果你想开始对测试集进行预测,你可以先对最后n个训练点进行预测(不保存任何值),然后一旦到达你的第一个测试点,就开始保存值。
在预测前为模型播种通常是一个好做法。如果我想评估test_set[10:20,:]
,我可以先让模型预测test_set[:10,:]
来播种模型,然后一旦到达我感兴趣的范围,就开始保存我的预测值。
关于进一步训练的问题,你不需要进一步训练模型来进行预测。训练仅用于调整模型的权重。请查看此博客以获取更多关于有状态与无状态LSTM的信息。