我想进一步探讨何时重置状态的问题。
假设我这样训练一个有状态模型:
for i in range(epochs): model.fit(X_train, y_train, epochs=1, batch_size=1, shuffle=False) model.reset_states()
我的训练集和测试集来自于同一个时间序列数据集,且测试集紧跟在训练集之后。
接下来,我想评估测试集并获取预测结果数组。
score = model.evaluate(X_test, y_test, batch_size=1, verbose=True)prediction = model.predict(X_test, batch_size=1)
我觉得在训练循环结束时重置模型状态会导致评估或预测步骤在数据集的开始部分出现错误。确实如此吗?如果数据在测试集中继续顺序进行,我是否应该在最后一个epoch不重置状态?
此外,在评估测试集后,我是否需要将模型的状态恢复到训练集结束时的状态,然后再尝试预测?我应该复制模型吗?保存并重新加载它?
回答:
确实,如果你在评估测试集之前重置状态,它会假设测试序列是一个全新的序列。它将从头开始。如果整个序列的一般行为不随时间变化,可能错误不会太大。但我不会冒险。
如果测试序列是训练序列的延续,那么为了获得最佳结果,它应该从适当的状态开始。
但我建议你这样做:
- 重置状态(这些状态受到了在最后一个epoch开始时尚未训练的权重的影响)
- 评估训练序列(以创建新的、最新的状态)
- 评估测试序列
然后这样做:
- 重置状态(评估需要改变状态)
- 预测训练序列(重新创建状态)
- 预测测试序列
未回答的问题:我不知道evaluate
方法是否会将状态恢复到之前的状态。但我相信它不会。你可能需要评估足够长的序列来填满你的内存,然后你就得分批评估。
题外话:链接问题中的误解:
在Keras中,样本就是序列。对于循环层,批次中的维度是:
(sequences, timeSteps, features)
,其中序列的数量、样本的数量和批次大小是完全相同的东西。(查看文档以确认第二个维度是序列中的“步骤”:https://keras.io/layers/recurrent/)