TensorFlow中tf.concat与tf.stack的区别与使用

Ruby
Ruby
发布时间:2026-10-11 | 4人浏览过
原创

本文介绍TensorFlow中两种主要的张量拼接方式:tf.concat与tf.stack。tf.concat沿现有轴拼接,保持维度数不变;tf.stack沿新轴拼接,增加维度。通过具体代码示例展示不同axis参数下的输出结果差异,帮助开发者根据需求选择合适的拼接方法。

TensorFlow 提供的两种拼接方式

在 TensorFlow 中,处理张量(Tensor)拼接主要有两个函数:tf.concat 和 tf.stack。它们的核心区别在于对“轴(axis)”的处理方式不同。

  • tf.concat(values, axis, name='concat'):按照指定的、已经存在的轴进行拼接。拼接后张量的维度数(rank)保持不变。
  • tf.stack(values, axis=0, name='stack'):按照指定的、新建的轴进行拼接。拼接后张量的维度数会增加 1。

代码实例解析

为了直观理解两者的区别,我们定义两个形状相同的二维张量 t1 和 t2 进行演示。

t1 = [[1, 2, 3], [4, 5, 6]]
t2 = [[7, 8, 9], [10, 11, 12]]

1. tf.concat 的使用

tf.concat 要求参与拼接的张量在除了指定轴(axis)之外的其他维度上形状必须一致。它不会创建新的维度,而是将数据沿着指定的轴“拉长”。

# 沿 axis=0 拼接(按行拼接)
# 结果形状:[2,3] + [2,3] => [4, 3]
tf.concat([t1, t2], 0) 
# 输出: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

# 沿 axis=1 拼接(按列拼接)
# 结果形状:[2,3] + [2,3] => [2, 6]
tf.concat([t1, t2], 1) 
# 输出: [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]

2. tf.stack 的使用

tf.stack 同样要求参与拼接的张量形状完全一致。与 concat 不同,stack 会在指定的位置插入一个新的轴(维度),并将原始张量放入这个新轴中。因此,输出张量的维度数比输入张量多 1。

# 沿 axis=0 拼接(在最外层堆叠)
# 结果形状:[2,3] + [2,3] => [2, 2, 3]
tf.stack([t1, t2], 0) 
# 输出: [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]

# 沿 axis=1 拼接(在第二层插入新轴)
# 结果形状:[2,3] + [2,3] => [2, 2, 3]
tf.stack([t1, t2], 1) 
# 输出: [[[1, 2, 3], [7, 8, 9]], [[4, 5, 6], [10, 11, 12]]]

# 沿 axis=2 拼接(在最内层插入新轴)
# 结果形状:[2,3] + [2,3] => [2, 3, 2]
tf.stack([t1, t2], 2) 
# 输出: [[[1, 7], [2, 8], [3, 9]], [[4, 10], [5, 11], [6, 12]]]

总结

选择 tf.concat 还是 tf.stack,取决于你是否需要增加张量的维度。如果希望保持原有的维度结构,仅将数据沿某个方向连接,使用 tf.concat;如果希望将多个张量组合成一个更高维度的张量(例如用于批量处理或构建序列),则使用 tf.stack。理解 axis 参数在两种函数中的不同行为,是正确使用 TensorFlow 张量操作的关键。

以上就是TensorFlow中tf.concat与tf.stack区别与使用的详细内容,更多关于TensorFlow张量操作的技术资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表