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 序列预测只输出输入的最后一步的主要内容,如果未能解决你的问题,请参考以下文章

使用 Keras LSTM 进行多步提前时间序列预测的多个输出

如何处理keras中多变量LSTM的多步时间序列预测

Keras LSTM实现多维输入输出时序预测实践详解

Keras中的LSTM

LSTM Keras 网络的常量输出和预测语法

Keras深度学习实战(33)——基于LSTM的序列预测模型