TensorFlow 2 LSTM仅产生1个预测

时间:2019-12-04 14:49:50

标签: python tensorflow keras lstm

我有一个形状数据集(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)

我要预测的值通常在1100到1400之间。我得到的MAE约为1200。我的预测都相同。因此,如果我这样做:

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粘贴到观测值的右侧,因此我得到了一个二维77424、432数组,然后使用一个常规的多层密集模型,但我觉得这不是最佳解决方案,因为我的数据是时间序列数据。

有人可以建议我在这里做错什么吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

不确定为什么会停留在该值上,但是可能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)
])