首页 文章

Keras中的LSTM序列预测仅输出输入中的最后一步

提问于
浏览
1

我目前正在使用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注意到我没有完全相同因此,图像之间的任何偏移都是由于这一点,目的是显示每个图像中预测和真实数据之间的水平偏移):

enter image description here

......与输入的第30步相比:

enter image description here

注意: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

1 回答

  • 0

    那是因为对于你的数据(股票数据?),第31个值的最佳预测是第30个值本身 . 模型是正确的并且适合数据 . 我也有预测股票数据的类似经验 .

相关问题