You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置return_sequences=False的LSTM输出形状不符合预期问题咨询

问题:设置return_sequences=False的LSTM输出形状不符合预期,导致Concatenate层报错

我的代码实现

输入数据构建

# 输入数据构建
x1= tf.data.Dataset.from_tensor_slices((X))
x2= tf.data.Dataset.from_tensor_slices((Xphysio))
output = tf.data.Dataset.from_tensor_slices((y))
combined_dataset = tf.data.Dataset.zip(((inputs_hydro, inputs_static), output))
input_dataset = combined_dataset.batch(batch_size_by_file)

模型代码

y = tf.keras.layers.LSTM(100, return_sequences=False, stateful=False)(input_dataset[0])

merge_2_input = tf.keras.layers.Concatenate(axis=1)([y, input_dataset[1]])

output = tf.keras.layers.Dense(100)(merge_2_input )

数据形状与问题

我的X数据形状为[nb_sample, 10, 3],按预期设置return_sequences=False的LSTM层应该输出形状[100](对应每个样本的最终状态),但实际输出形状是[10,100],最终导致Concatenate层报错。

报错日志

A `Concatenate` layer requires inputs with matching shapes except for the concatenation axis. Received: input_shape=[(10, 100), (256, 17)]

Call arguments received by layer "feed_back" "                 f"(type FeedBack):
  • inputs=('tf.Tensor(shape=(256, 10, 3), dtype=float32)', 'tf.Tensor(shape=(256, 17), dtype=float32)')
  • training=True

问题原因与解决方法

核心原因

直接用input_dataset[0]作为LSTM层的输入是错误的——input_dataset是批量后的Dataset对象,并非模型可直接接收的张量。当你取input_dataset[0]时,返回的是单批数据,但Keras模型的层需要接收由Input层定义的占位符张量,而非直接传入Dataset的元素。

从报错里的输入张量形状(256, 10, 3)能看到,批量大小为256,LSTM层若正确接收输入,return_sequences=False时应输出(256, 100),而非(10,100)——你看到的错误形状是输入传递方式错误导致的维度混乱。

正确实现步骤

  1. 定义输入层:为两个输入分别定义Input层,明确特征维度(无需指定样本数/批量大小):
# 定义输入层
input_hydro = tf.keras.layers.Input(shape=(10, 3))  # 对应X的形状[nb_sample,10,3]
input_static = tf.keras.layers.Input(shape=(17,))    # 对应Xphysio的形状[nb_sample,17]
  1. 搭建模型数据流:
# 处理时序输入:LSTM输出形状为(None, 100),None对应批量大小
lstm_out = tf.keras.layers.LSTM(100, return_sequences=False, stateful=False)(input_hydro)

# 拼接时序输出与静态输入:拼接后形状为(None, 100+17)=(None, 117)
merged = tf.keras.layers.Concatenate(axis=1)([lstm_out, input_static])

# 定义输出层
output = tf.keras.layers.Dense(100)(merged)

# 构建完整模型
model = tf.keras.Model(inputs=[input_hydro, input_static], outputs=output)
  1. 用Dataset训练模型:无需手动提取Dataset元素,直接传入model.fit()即可:
model.fit(input_dataset, epochs=...)

错误点总结

Keras层需要接收张量输入(由Input层定义或其他层的输出),而非直接传入Dataset对象的元素。错误的输入传递方式导致LSTM的维度计算混乱,进而触发Concatenate层的形状不匹配报错。

内容的提问来源于stack exchange,提问作者Jonathan Roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:32:41