Keras 错误不兼容的形状:[32,168,24] 与 [32,24]

Keras error Incompatible shapes: [32,168,24] vs. [32,24]

我正在为时间序列预测训练神经网络。我的数据如下所示:

train_generator = TimeseriesGenerator(X, y, length=7*24, stride=24, batch_size=32)
print(X.shape, y.shape)
>>>((126336, 3), (126336, 24))

训练在此架构上运行良好:

model = Sequential()
model.add(LSTM(16, return_sequences=True, input_shape=(7*24, X.shape[1]))) 
model.add(Dropout(0.3))
model.add(LSTM(32, return_sequences=True, input_shape=(7*24, X.shape[1])))
model.add(Dropout(0.3))
model.add(LSTM(64))
model.add(Dense(24))

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mse'])
model.fit(train_generator, validation_data=val_generator, epochs=15, verbose=1)

但是,我尝试在这个更简单的架构上进行训练:

model = Sequential()
model.add(LSTM(32, return_sequences=True, input_shape=(7*24, X.shape[1])))
model.add(Dense(24))

在第二种情况下,我收到一条错误消息:

InvalidArgumentError:  Incompatible shapes: [32,168,24] vs. [32,24]

我做错了什么?如何在第二种架构上进行培训?是否有我必须考虑的一般规则,以便没有形状不兼容?发送

这是因为您将 return_sequences 设置为 True,并且您将其直接发送到密集层。在原始模型中,您有 2 个 LSTM 层 returning 序列(这是 LSTM -> LSTM 所必需的),但是您的最后一个 LSTM 层没有 return 序列到您的输出层。这就是它起作用的原因。

只需在您的简单模型中将其设置为 False 即可。你也可以去掉这个参数,因为默认是 False。

详细说明 return_sequences,在 LSTM 层中,您使用来自多个时间步长的信息来进行预测。这就是为什么 LSTM 层的输入形状需要时间序列格式的信息,而不仅仅是批量大小和特征数量。要将一个 LSTM 的输出传递给另一个,您需要为所有这些时间步长提供层的输出,因此您会得到一个尺寸为 32x168[= 的输出形状20=]x24 在你的情况下。

如果你想让LSTM的输出送到一个dense layer,你只想传递当前时间点的信息,所以你的输出应该是size batch_size x n_features而不是 batch_size x n_time_steps x n_features.