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

如何在TensorFlow/Keras中拼接(None,1,n)与(None,None,m)形状的张量?

解决LSTM输出与时序数据拼接的形状不兼容问题

问题核心是Out1的时间步维度为1,而ts的时间步维度是可变的(None),两者无法直接在最后一维拼接,必须先将Out1的时间步扩展到与ts一致的长度。

具体实现步骤

  1. 获取时序数据的时间步长度
    通过Lambda层提取ts的时间步维度(即第二维度的大小),这个值会根据输入批量自动适配。
  2. 扩展Out1的时间步维度
    使用Lambda层结合tf.tile,将Out1在时间步维度上重复,使其形状从(None,1,n)变为(None, T, n)(T为ts的时间步长度)。
  3. 执行拼接操作
    此时两个张量的时间步维度一致,可通过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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:47:19