Keras中的LSTM序列预测只输出输入

时间:2018-01-16 16:50:31

标签: tensorflow keras lstm sequences

我目前正在使用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 :(得分:2)

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