我目前正在使用 Keras 使用 Tensorflow 作为后端。我有一个 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 https://github.com/ebirck/lstm_sequence_prediction