Eri*_*ric 2 sequences lstm keras tensorflow
我目前正在使用 Keras 使用 Tensorflow 作为后端。我有一个如下所示的 LSTM 序列预测模型,我用它来预测数据系列中的一步(输入 30 个步骤 [每个步骤有 4 个特征],输出预测步骤 31)。
\n\nmodel = Sequential()\n\nmodel.add(LSTM(\n input_dim=4,\n output_dim=75,\n return_sequences=True))\nmodel.add(Dropout(0.2))\n\nmodel.add(LSTM(\n 150,\n return_sequences=False))\nmodel.add(Dropout(0.2))\n\nmodel.add(Dense(\n output_dim=4))\nmodel.add(Activation("linear"))\n\nmodel.compile(loss="mse", optimizer="rmsprop")\nreturn model\n
Run Code Online (Sandbox Code Playgroud)\n\n我遇到的问题是,在训练模型并测试它之后 - 即使使用与训练相同的数据 - 它输出的内容本质上是输入中的第 30 步。我的第一个想法是我的数据模式必须太复杂而无法准确预测,至少对于这个相对简单的模型来说是如此,因此它可以返回的最佳答案本质上是输入的最后一个元素。为了限制过度拟合的可能性,我尝试将训练时期减少到 1,但出现了相同的行为。不过,我以前从未观察到过这种行为,而且我以前曾使用过此类数据并取得了成功的结果(就上下文而言,我使用的是从具有主动稳定器的复杂物理系统上的 4 个点获取的振动数据;预测在 pid 循环中用于稳定,因此,至少现在,我使用更简单的模型来保持速度快)。
\n\n这听起来是最有可能的原因,还是有人有其他想法?以前有人见过这种行为吗?如果它有助于可视化,这里是一个振动点与所需输出相比的预测结果(注意,这些屏幕截图放大了非常大的数据集的较小选择 - 正如 @MarcinMo\xc5\xbcejko 注意到我没有缩放两次都完全相同,因此图像之间的任何偏移都是由于此原因,目的是显示每个图像内的预测和真实数据之间的水平偏移):
\n\n\n\n...与输入的第 30 步相比:
\n\n\n\n注意:Keras 模型看到的每个数据点都是许多实际测量值的平均值,并且平均值的窗口随时间进行处理。这样做是因为振动数据在我可以测量的最小分辨率下非常混乱,因此我使用这种移动平均技术来预测较大的运动(无论如何,这是要抵消的更重要的运动)。这就是为什么第一幅图像中的偏移量出现了很多点而不是一个点,它是“一个平均值”或 100 个单独的偏移点。\n 。
\n\n-----编辑1,用于从输入数据集\'X_test,y_test\'获取上面显示的图的代码-----
\n\nmodel_1 = lstm.build_model() # The function above, pulled from another file \'lstm\'\n\nmodel_1.fit(\n X_test,\n Y_test,\n nb_epoch=1)\n\nprediction = model_1.predict(X_test)\n\ntemp_predicted_sensor_b = (prediction[:, 0] + 1) * X_b_orig[:, 0]\n\nsensor_b_y = (Y_test[:, 0] + 1) * X_b_orig[:, 0]\n\nplot_results(temp_predicted_sensor_b, sensor_b_y)\nplot_results(temp_predicted_sensor_b, X_b_orig[:, 29])\n
Run Code Online (Sandbox Code Playgroud)\n\n对于上下文:
\n\nX_test.shape = (41541, 30, 4)
\n\nY_test.shape = (41541, 4)
\n\nX_b_orig 是来自 b 传感器的原始数据(如上所述进行平均)。当绘图时,将其乘以预测和输入数据以撤消我为改进预测所做的标准化。它的形状为 (41541, 30)。
\n\n----编辑2----
\n\n以下是演示此行为的完整项目设置的链接:
\n\n\n 归档时间: |
|
查看次数: |
3537 次 |
最近记录: |