如何在TensorFlow/Keras中拼接(None,1,n)与(None,None,m)形状的张量?
解决LSTM输出与时序数据拼接的形状不兼容问题
问题核心是Out1的时间步维度为1,而ts的时间步维度是可变的(None),两者无法直接在最后一维拼接,必须先将Out1的时间步扩展到与ts一致的长度。
具体实现步骤
- 获取时序数据的时间步长度
通过Lambda层提取ts的时间步维度(即第二维度的大小),这个值会根据输入批量自动适配。 - 扩展
Out1的时间步维度
使用Lambda层结合tf.tile,将Out1在时间步维度上重复,使其形状从(None,1,n)变为(None, T, n)(T为ts的时间步长度)。 - 执行拼接操作
此时两个张量的时间步维度一致,可通过Concatenate层在最后一维(特征维度)拼接,得到目标形状(None, None, n+m)。
代码示例
import tensorflow as tf from tensorflow.keras.layers import LSTM, Lambda, Concatenate # 假设已定义lstm1和ts输入(lstm1需设置return_sequences=True以输出(None,1,n)) lstm1 = LSTM(n, return_sequences=True) Out1 = lstm1(...) # 输入到lstm1的张量需确保输出时间步为1 # 获取ts的时间步长度 time_steps = Lambda(lambda x: tf.shape(x)[1])(ts) # 扩展Out1的时间步维度 out1_repeated = Lambda( lambda inputs: tf.tile(inputs[0], [1, inputs[1], 1]) )([Out1, time_steps]) # 拼接张量 concat_tensor = Concatenate(axis=-1)([out1_repeated, ts]) # 输入到第二个LSTM层 lstm2 = LSTM(..., return_sequences=True)(concat_tensor)
关键说明
- 若
lstm1未设置return_sequences=True,输出会是(None,n),需先通过Reshape((1,n))调整形状后再执行后续操作。 tf.tile的重复参数[1, time_steps, 1]表示:批量维度不重复,时间步维度重复time_steps次,特征维度不重复,完全匹配需求。
内容的提问来源于stack exchange,提问作者hl037_
相关产品推荐
相关产品推荐

