使用tf.concat拼接张量后如何正确访问原单个输入张量?
拼接张量后的原始张量访问方法
核心底层逻辑
tf.concat 执行拼接操作时,会严格按照传入的张量列表顺序,沿指定轴顺次排布元素,全程不会对原元素做重排、打乱或变换,因此完全可以通过边界切片直接还原访问任意一个原始拼接块的内容,不需要额外维护独立的张量列表。
对应你示例代码的访问方式
你的示例是沿axis=0拼接两个形状完全一致的张量:
- 原始x的形状是
(100, 120, 14),y的形状是(100, 120, 14) - 拼接完成后z的整体形状为
(200, 120, 14),第0轴的200个长度单位中,前100个位置对应原x的全部内容,后100个位置对应原y的全部内容
对应的访问代码: - 还原完整原始x张量:
x_back = z[:100, :, :],等价写法是x_back = z[:tf.shape(x)[0], ...] - 还原完整原始y张量:
y_back = z[100:, :, :],等价写法是y_back = z[tf.shape(x)[0]:, ...]
通用场景的访问规则
不管拼接轴是哪个维度、参与拼接的张量形状是否一致,都可以按照统一规则计算切片边界:
- 按输入的张量列表顺序,逐段累加每个张量在拼接轴上的长度,每段累加结果对应的范围,就是该原始张量在拼接后张量上的位置
- 举例:如果沿
axis=2拼接x(形状(100,120,14))和y(形状(100,120,20)),拼接后z的第2轴总长度为34,那么x对应的切片是z[:, :, :14],y对应的切片是z[:, :, 14:] - 如果不想手动计算切片边界,可以直接调用
tf.split按原始拆分长度切分还原,比如对应你的示例:x_back, y_back = tf.split(z, num_or_size_splits=[100, 100], axis=0),和手动切片的执行效果完全一致
注意事项
- 切片还原的结果和原始输入张量完全等价,不存在精度或内容损失
- 批量管理多块拼接内容时,可以提前把每个块在拼接轴上的长度存入列表,遍历即可快速生成对应切片,不需要硬编码固定数值
内容的提问来源于stack exchange,提问作者mariya
相关产品推荐
相关产品推荐

