微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Keras 错误不兼容的形状:[32,168,24] 与 [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,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,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的输出形状em>在您的情况下为 x24。

如果你想让 LSTM 输出被发送到一个密集层,你只想传递有关当前时间点的信息,所以你的输出应该是 size batch_size x n_features 而不是 batch_size x n_time_steps x n_features。>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。