期望维度为3,但实际维度为2。

22

我是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: 输入的维度和要求不符,lstm_1层期望输入3维数据,但实际输入是2维数据

有没有人能帮助我?


这是创建LSTM/RNN数据的最快和正确的方法:https://dev59.com/7loU5IYBdhLWcg3w5pua#62570576 - Marco Cerliani
1个回答

32

LSTM层期望输入具有形状为(batch_size, timesteps, input_dim)的形式。在Keras中,您需要将(timesteps, input_dim)传递给input_shape参数。但是您正在设置input_shape(9,)。该形状不包括时间步骤维度。问题可以通过为时间维度添加额外的维度来解决。例如,通过添加值为1的额外维度可能是一个简单的解决方案。为此,您必须重塑输入数据集(X Train)和Y形状。但是,这可能会有问题,因为时间分辨率为1,并且您正在提供长度为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))

非常感谢。我做了完全相同的事情,但是我仍然遇到了相同的问题。能请教一下吗? - Avv
为什么添加这个代码就解决了我的问题!我有一个形状为(804,291)的数据,因为我想构建一个LSTM自编码器。我只是添加了以下代码: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)现在它可以正常工作了。请问您能告诉我为什么吗? - Avv
我注意到在训练过程中,使用adam优化器时出现了损失值为nan的情况。请问这是为什么呢? - Avv
你使用哪种损失函数? - Mitiku
感谢您的回复。我通过删除0和1来解决NAN和无穷大损失问题,但这可能会影响我的结果可信度!我尝试了正则化、L2、clipnorm等方法,但仍然得到9.06左右的损失!请问有什么建议吗? - Avv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接