Keras 中的 LSTM 序列预测只输出输入的最后一步
Posted
技术标签:
【中文标题】Keras 中的 LSTM 序列预测只输出输入的最后一步【英文标题】:LSTM Sequence Prediction in Keras just outputs last step in the input 【发布时间】:2018-06-25 10:47:10 【问题描述】:我目前正在使用 Tensorflow 作为后端与 Keras 合作。我有一个 LSTM 序列预测模型,如下所示,我用它来预测数据系列中的前一步(输入 30 步 [每步有 4 个特征],输出预测的第 31 步)。
model = Sequential()
model.add(LSTM(
input_dim=4,
output_dim=75,
return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(
150,
return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(
output_dim=4))
model.add(Activation("linear"))
model.compile(loss="mse", optimizer="rmsprop")
return model
我遇到的问题是,在训练模型并对其进行测试之后——即使使用相同的数据进行训练——它的输出本质上是输入中的第 30 步。我的第一个想法是我的数据模式必须太复杂而无法准确预测,至少对于这个相对简单的模型来说,所以它可以返回的最佳答案本质上是输入的最后一个元素。为了限制过度拟合的可能性,我尝试将训练时期降低到 1,但出现了相同的行为。不过,我以前从未观察过这种行为,并且我之前曾使用过这种类型的数据并取得了成功的结果(对于上下文,我使用的是从具有主动稳定器的复杂物理系统上的 4 个点获取的振动数据;使用了预测在用于稳定的 pid 循环中,因此为什么,至少现在,我使用更简单的模型来保持快速)。
这听起来像是最可能的原因,还是有人有其他想法?有没有人见过这种行为?如果它有助于可视化,这里是一个振动点的预测与所需输出相比的样子(注意,这些屏幕截图放大了一个非常大的数据集的较小选择 - 正如@MarcinMożejko 注意到我没有缩放完全相同次,因此图像之间的任何偏移量都是由于这个原因,目的是显示预测和真实数据之间的水平偏移量每个图像内):
...并与输入的第 30 步相比:
注意:Keras 模型看到的每个数据点都是许多实际测量值的平均值,平均值的窗口会及时处理。这样做是因为在我可以测量的最小分辨率下,振动数据非常混乱,所以我使用这种移动平均技术来预测更大的运动(无论如何,这是更重要的抵消)。这就是为什么第一张图像中的偏移量显示为许多点而不是一个,它是“一个平均值”或 100 个单独的偏移点。 .
-----编辑 1,用于从输入数据集 'X_test, y_test' 获取上图所示的代码-----
model_1 = lstm.build_model() # The function above, pulled from another file 'lstm'
model_1.fit(
X_test,
Y_test,
nb_epoch=1)
prediction = model_1.predict(X_test)
temp_predicted_sensor_b = (prediction[:, 0] + 1) * X_b_orig[:, 0]
sensor_b_y = (Y_test[:, 0] + 1) * X_b_orig[:, 0]
plot_results(temp_predicted_sensor_b, sensor_b_y)
plot_results(temp_predicted_sensor_b, X_b_orig[:, 29])
对于上下文:
X_test.shape = (41541, 30, 4)
Y_test.shape = (41541, 4)
X_b_orig 是来自 b 传感器的原始(如上所述平均)数据。当绘制以撤消标准化以改进预测时,这乘以预测和输入数据。它有形状 (41541, 30)。
----编辑2----
这是一个完整项目设置的链接,用于演示此行为:
https://github.com/ebirck/lstm_sequence_prediction
【问题讨论】:
提供一个可重现的例子 我将更新我的答案以包含我如何获取绘图数据的其余代码,但如果您想重现我的结果,我必须上传我的训练数据集这是几个 MB 的 .csv 文件 - 我应该怎么做? 你能把它缩小到更小的尺寸吗?如果没有复制能力,我认为您不会得到有意义的答案。 是的,我将使用一个子集(约 1000 个数据点而不是现在的 50k)进行测试,以确保该行为仍然存在并尽快上传,感谢您的建议 实际上 - 如果你仔细观察 - 第一个和最后一个示例中的LSTM
输出是不同的。通常 - 第一个看起来有点滞后 gt。你能举出更多例子吗?
【参考方案1】:
那是因为对于您的数据(股票数据?),第 31 个值的最佳预测是第 30 个值本身。模型是正确的并且适合数据。 我在预测股票数据方面也有类似的经验。
【讨论】:
那么,我们可以说 LSTM 以及所有的神经网络都是无用的吗?因为我也有同样的问题。 不,您只需要保留预测值.. 我也有同样的问题.. 只是不确定要填充多少.. 因为我似乎需要填充 2.. 不确定为什么.pred2=np.pad(pred,(train_end+2,0),'constant', constant_values=np.nan)
以上是关于Keras 中的 LSTM 序列预测只输出输入的最后一步的主要内容,如果未能解决你的问题,请参考以下文章