根本区别在于是否新增维度:torch.cat在现有维度拼接,要求除拼接维外其余维度一致;torch.stack新增维度堆叠,要求所有维度完全相同。

torch.cat 和 torch.stack 的根本区别在哪
关键看维度:如果想把多个 tensor 拼成更长的同一维(比如把 3 个 [2, 4] 拼成 [6, 4]),用 torch.cat;如果想新增一个维度把它们“堆叠”起来(比如变成 [3, 2, 4]),必须用 torch.stack。混淆这两者是报错最常见原因——torch.cat 要求除拼接维外其余维度完全一致,而 torch.stack 要求所有维度都一致。
torch.cat 报 “Sizes of tensors must match except in dimension” 怎么修
这是典型形状不匹配错误。比如你有 a = torch.randn(2, 3)、b = torch.randn(2, 4),直接 torch.cat([a, b], dim=1) 就会崩,因为第 0 维都是 2,但第 1 维 3 ≠ 4。
- 检查每个张量的
.shape,确认只有一维允许不同(即你要传给dim=的那一维) - 常用补救:用
torch.nn.functional.pad对齐尺寸,或用torch.unsqueeze先升维再 cat(但这时往往该用 stack) -
dim参数别写错:dim=0是按行拼(竖着接),dim=1是按列拼(横着接),负索引如dim=-1也合法
torch.stack 必须所有 tensor 形状完全一样吗
是的,一个都不能差。哪怕只是 [2, 3] 和 [2, 3, 1] 都不行——后者多了一维。stack 的本质是“把 N 个同形张量打包进新 batch”,所以输入必须严格同形。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 常见误操作:试图用
torch.stack合并不同长度的序列(比如 NLP 中变长句子)。这不行,得先 pad 到等长,再 stack - 如果只是想加一个维度(比如把标量列表转为 1D tensor),用
torch.tensor([...])更直接,不用 stack - 性能提示:stack 比 cat 多一次内存拷贝,因要分配新维度空间;若只是临时拼接做计算,cat 通常更快
实际合并列表里一堆 tensor 的惯用写法
别手写 torch.cat([t0, t1, t2, ...]),直接传 list。但注意 list 不能为空,且元素必须是 tensor(不是 numpy 或 python list)。
立即学习“Python免费学习笔记(深入)”;
ts = [torch.randn(2, 5) for _ in range(3)] # 正确 merged = torch.cat(ts, dim=0) # → [6, 5] stacked = torch.stack(ts, dim=0) # → [3, 2, 5] <h1>错误示例(容易忽略)</h1><p>bad_list = [torch.randn(2, 5), [1, 2, 3]] # 混了 tensor 和 list torch.cat(bad_list, dim=0) # TypeError: expected Tensor as element 1
真正麻烦的是混合设备(CPU + CUDA)或混合 dtype(float32 + int64)——cat 和 stack 都会直接报错,必须提前统一。

















