【问题标题】:expected ndim=3, found ndim=2预期 ndim=3,发现 ndim=2
【发布时间】:2019-06-22 07:14:10
【问题描述】:

我是 Keras 的新手,我正在尝试实现一个序列到序列 LSTM。 特别是,我有一个包含 9 个特征的数据集,我想预测 5 个连续值。

我将训练集和测试集分开,它们的形状分别是:

X TRAIN (59010, 9)

X TEST (25291, 9)

Y TRAIN (59010, 5)

Y TEST (25291, 5)

LSTM 目前非常简单:

model = Sequential()
model.add(LSTM(100, input_shape=(9,), return_sequences=True))
model.compile(loss="mean_absolute_error", optimizer="adam", metrics= ['accuracy'])

history = model.fit(X_train,y_train,epochs=100, validation_data=(X_test,y_test))

但我有以下错误:

ValueError:输入 0 与层 lstm_1 不兼容:预期 ndim=3,发现 ndim=2

谁能帮帮我?

【问题讨论】:

标签: python tensorflow keras lstm


【解决方案1】:

LSTM 层期望输入的形状为(batch_size, timesteps, input_dim)。在 keras 中,您需要将 (timesteps, input_dim) 传递给 input_shape 参数。但是您正在设置 input_shape (9,)。此形状不包括时间步长维度。该问题可以通过为时间维度的 input_shape 添加额外维度来解决。例如,添加值为 1 的额外维度可能是简单的解决方案。为此,您必须重塑输入数据集(X Train)和 Y 形状。但这可能是有问题的,因为时间分辨率为 1 并且您正在输入长度为一个序列。将长度为 1 的序列作为输入,使用 LSTM 似乎不是正确的选择。

x_train = x_train.reshape(-1, 1, 9)
x_test  = x_test.reshape(-1, 1, 9)
y_train = y_train.reshape(-1, 1, 5)
y_test = y_test.reshape(-1, 1, 5)

model = Sequential()
model.add(LSTM(100, input_shape=(1, 9), return_sequences=True))
model.add(LSTM(5, input_shape=(1, 9), return_sequences=True))
model.compile(loss="mean_absolute_error", optimizer="adam", metrics= ['accuracy'])

history = model.fit(X_train,y_train,epochs=100, validation_data=(X_test,y_test))

【讨论】:

  • 非常感谢。我做了同样的事情,但我仍然遇到同样的问题。有什么帮助吗?
  • 为什么添加这个确实解决了我的问题!因为我想构建一个 LSTM 自动编码器,所以我有 X 和 y 的形状数据(804、291)。我刚刚添加了` X = tf.convert_to_tensor(scaled_features.to_numpy().reshape(-1, 804, 291), np.float32) y = tf.convert_to_tensor(scaled_features.to_numpy().reshape(-1, 804, 291 ), np.float32)` 现在它可以工作了。你能告诉我为什么吗!
  • 我注意到我在训练过程中 adam 优化器丢失了 nan。知道为什么会这样吗?
  • 你用的是哪个loss?
  • 感谢您的回复。我确实通过删除 0 和 1 解决了 nan 和 infinity 损失,但这可能会影响我结果的可信度!我尝试了正则化、l2、clipnorm 等,但我仍然在 9.06 左右出现损失!请问有什么建议吗?
猜你喜欢
  • 2021-04-05
  • 2021-04-08
  • 1970-01-01
  • 2021-02-14
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
相关资源
最近更新 更多