预期的ndim = 3,找到的ndim = 2

时间:2019-01-29 08:01:36

标签: python tensorflow keras lstm

我是Keras的新手,我正在尝试实现Sequence to Sequence 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

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

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

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))