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

torch.cat负维度拼接疑问:dim=-3与dim=3的差异及约束

理解PyTorch中沿负维度的拼接操作

先搞懂负维度到底是什么意思

PyTorch里的负维度是从张量末尾往前数的索引,拿你手里的4维张量(格式为 [batch_size, channels, height, width])举例,维度索引对应关系是:

  • dim=0 → batch维度(第一维)
  • dim=1 → 通道维度(第二维)
  • dim=2 → 高度维度(第三维)
  • dim=3 → 宽度维度(第四维)
  • dim=-1 → 宽度维度(最后一维,对应dim=3)
  • dim=-2 → 高度维度(倒数第二维,对应dim=2)
  • dim=-3 → 通道维度(倒数第三维,对应dim=1)

所以你写的 dim=-3,本质就是沿通道维度做拼接。

你的例子里具体发生了什么?

你有4个形状全是 torch.Size([1, 256, 7, 7]) 的张量:

  • 每个张量的batch是1,通道数256,空间尺寸7x7
  • 沿dim=-3(通道维度)拼接时,PyTorch会把这4个张量的通道数直接相加:256×4=1024
  • 而其他维度(batch、高度、宽度)完全保持不变,所以最终 x_6 的形状是 torch.Size([1, 1024, 7, 7])

可视化的话,可以把每个张量想象成256张7x7的特征图,拼接后就是把这4组特征图全部堆在一起,变成1024张7x7的特征图,batch和空间大小完全没变。

如果设置dim=3会怎么样?

dim=3对应4维张量的宽度维度(最后一维),这时候拼接会在宽度方向把4个张量连起来:

  • 每个张量的宽度是7,拼接后宽度变成7×4=28
  • 其他维度(batch、通道、高度)保持不变
  • 最终 x_6 的形状会是 torch.Size([1, 256, 7, 28])

可视化的话,就是把4个7x7的特征图在水平方向(宽度方向)并排拼接,变成一张7x28的大特征图,通道数和batch数还是原来的样子。

拼接维度dim的核心约束条件

要成功使用 torch.cat,必须遵守一个铁规则:

所有参与拼接的张量,除了拼接维度之外的所有其他维度,尺寸必须完全一致

举几个例子帮你理解:

  • 合法情况:你例子里的4个张量,除了拼接的通道维度(dim=-3),其他维度(batch=1、height=7、width=7)都完全对齐,所以可以正常拼接
  • 非法情况1:如果其中一个张量的形状是 [2,256,7,7](batch变成2),其他还是 [1,256,7,7],沿dim=-3拼接会直接报错,因为batch维度(dim=0)尺寸不匹配
  • 非法情况2:如果其中一个张量的形状是 [1,256,14,7](height变成14),其他还是 [1,256,7,7],沿dim=-3拼接也会报错,因为height维度(dim=2)尺寸不匹配

简单说,只有你指定的拼接维度可以有不同的尺寸(最终会累加),其他所有维度必须严格对齐,不能有任何差异。

内容的提问来源于stack exchange,提问作者sai_varshittha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:52:33