我正在训练神经网络进行时间序列预测。我的数据如下所示:
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]
我做错了什么?我怎样才能使第二种体系结构的培训成为可能?有没有一个我必须考虑的通用规则来避免形状不兼容?Tnx
这是因为您将return_sequences设置为True,并且您将其直接发送到密集层。在原始模型中,您有2个LSTM层返回序列(这是LSTM ->LSTM),但是上一个LSTM层没有将序列返回到输出层。这就是它成功的原因。
在你的简单模型中设置为False,它就会起作用。你也可以去掉这个参数,因为默认值是False。
为了详细说明return_sequences,在LSTM层中,您使用来自多个时间步长的信息来进行预测。这就是为什么LSTM层的输入形状需要时间序列格式的信息,而不仅仅是批量大小和特征数量。要将一个LSTM的输出传递给另一个LSTM,需要为所有这些时间步骤提供该层的输出,这样就可以得到一个尺寸为32x168的输出形状。你的情况是x24。
如果你想让LSTM输出发送到一个密集层,你只想传递当前时间点的信息,所以你的输出应该是size batch_size x n_features,而不是batch_size x n_time_steps x n_features。