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
相关产品推荐
相关产品推荐

