【问题标题】:TensorFlow 2 LSTM produces only 1 predictionTensorFlow 2 LSTM 仅产生 1 个预测
【发布时间】:2019-12-04 14:49:50
【问题描述】:

我有一个形状数据集 (77424, 144)。然后我创建一个上移 1 的副本和一个上移 2 的版本,并将它们堆叠成一个 77422、3、144 3d 数组。

因此,时间步 0 中的 2/3/4 观察结果如下所示,其中前 4 列是年/月/日/小时:

      0     1     2     3        4    ...   139   140   141   142  143
2      2011.0  12.0  31.0  21.0  13911.0  ...  0.00  0.11  38.0  36.0  9.0
3      2011.0  12.0  31.0  20.0  14635.0  ...  0.00  0.20  38.0  36.0  9.0
4      2011.0  12.0  31.0  19.0  15254.0  ...  0.00  0.18  38.0  36.0  9.0

然后在时间步 1,它是这样的:

      0     1     2     3        4    ...  139   140   141   142  143
2      2011.0  12.0  31.0  22.0  13100.0  ...  0.0  0.17  38.0  35.0  9.0
3      2011.0  12.0  31.0  21.0  13911.0  ...  0.0  0.11  38.0  36.0  9.0
4      2011.0  12.0  31.0  20.0  14635.0  ...  0.0  0.20  38.0  36.0  9.0

您可能已经猜到,时间步 2 如下所示:

      0     1     2     3        4    ...  139   140   141   142  143
2      2011.0  12.0  31.0  23.0  12410.0  ...  0.0  0.25  39.0  35.0  9.0
3      2011.0  12.0  31.0  22.0  13100.0  ...  0.0  0.17  38.0  35.0  9.0
4      2011.0  12.0  31.0  21.0  13911.0  ...  0.0  0.11  38.0  36.0  9.0

然后我将这个 3-D 77422、3、144 数组输入到 LSTM 中,但得到的结果非常糟糕。具体来说,网络是:

model = tf.keras.models.Sequential([
tf.keras.layers.LSTM(50),
tf.keras.layers.Dense(1)
])

optimizer = tf.keras.optimizers.Adam()

model.compile(loss='mse',
            optimizer=optimizer,
            metrics=['mae', 'mse'], epochs=50, verbose=0)

我试图预测的一般范围是 1,100 到 1,400。我的 MAE 大约是 1,200。我的预测都是同一个数字。所以如果我这样做:

predictions = model.predict(X_test)
print(predictions)

我得到:

[[62.61828]
 [62.61828]
 [62.61828]
 ...
 [62.61828]
 [62.61828]
 [62.61828]]

我试过了:

  • 颠倒时间步的堆叠顺序

  • 颠倒观察的顺序,使最新的(2018 年)在顶部,最旧的在底部

  • 改变 LSTM 中的神经元数量

  • 尝试了 GRU,结果几乎相同

  • 我已仔细确保我正在翻转 Y 向量(我试图预测的变量)以匹配输入数据的各种翻转。

到目前为止,我最好的解决方案是构建一个巨大的表格,将 t-1 和 t-2 粘贴到观测值的右侧,所以我最终得到一个 2-D 77424、432 数组,然后使用常规预测多层密集模型,但我觉得这不是最好的解决方案,因为我的数据是时间序列数据。

谁能建议我在这里可能做错了什么?

谢谢!

【问题讨论】:

  • 你的loss太高,说明模型没有学习或者训练不够,这种情况下看预测没有意义。
  • 我用它来诊断为什么我的损失会如此之高,这确实解释了这一点。问题是为什么模型在每个输入上预测相同的值。如果我使用相同数量的数据来训练其他类型的模型,我会得到很好的结果。这让我怀疑我错误地使用了 LSTM,而不是我没有足够的数据。

标签: python tensorflow keras lstm


【解决方案1】:

不确定为什么它会停留在该值,但可能 1000 和 1400 远远超出了模型/优化器对训练的预期。

一个想法是尝试使用'sgd' 优化器来查看Adam 是否正在剪裁某些内容。

另一个想法是使用一个模型,使 Dense 输出的值更接近预期(大约 0 和 1)。

model = tf.keras.models.Sequential([
tf.keras.layers.LSTM(50),
tf.keras.layers.Dense(1),
tf.keras.layers.Lambda(lambda x: 300*x + 1100)
])

您还可以使用以下命令强制输出 1000 到 1500 之间:

tf.keras.layers.LSTM(50),
tf.keras.layers.Dense(1, activation = 'sigmoid'),
tf.keras.layers.Lambda(lambda x: 500*x + 1000)
])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 2017-05-28
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2017-09-14
    • 2018-03-09
    • 2021-12-02
    相关资源
    最近更新 更多