PyTorch中维度不同的两个张量如何实现拼接操作
PyTorch 不同维度张量拼接及维度转换解决方案
报错根因
torch.cat 要求参与拼接的所有张量必须满足两个条件:总维度数完全相同、除拼接维度外其余所有维度的尺寸完全一致。你当前两个张量维度数分别为2和3,不满足要求因此触发报错。
方案1:升维2维张量后拼接(保留3维输出结构)
该方案适合你需要输出3维张量的场景,2维转3维不会丢失任何数据,仅需新增一个长度为1的维度即可,可通过两种方式实现:
- 调用
torch.unsqueeze方法指定位置新增维度 - 用
None索引快速新增维度
示例代码如下:
import torch tensor_2d = torch.randn(64, 100) # 形状 [64, 100] 的2维张量 tensor_3d = torch.randn(64, 100, 256) # 形状 [64, 100, 256] 的3维张量 # 给2维张量新增最后一维,形状变为 [64, 100, 1] # 方法1:unsqueeze 实现 tensor_2d_3d = tensor_2d.unsqueeze(dim=2) # 方法2:None 索引实现,效果与上方完全一致 tensor_2d_3d = tensor_2d[..., None] # 沿最后一维(dim=2)拼接,输出形状为 [64, 100, 257] concat_result = torch.cat([tensor_2d_3d, tensor_3d], dim=2)
注意:新增维度仅修改张量的逻辑结构,不会修改底层存储的数值,完全不会丢失数据。
方案2:降维3维张量后拼接(保留2维输出结构)
该方案适合你需要输出2维张量的场景,3维转2维可通过 flatten 方法合并连续维度实现,不会丢失任何数据,后续可通过 reshape 还原为原始3维结构。
示例代码如下:
# 先升维拼接得到3维结果后,再合并后两维为2维 concat_result_2d = torch.cat([tensor_2d.unsqueeze(2), tensor_3d], dim=2).flatten(start_dim=1) # 输出形状为 [64, 100*257] = [64, 25700]
如果你不需要保留序列维度的对应关系,也可以直接单独降维3维张量后再根据业务逻辑调整2维张量的形状拼接,只要保证除拼接维度外其余尺寸一致即可。
其他可选方案
- 临时运算场景可以用
torch.broadcast_to将2维张量广播到和3维张量相同的形状,无需复制数据即可直接进行元素级运算,适合不需要持久化存储拼接结果的场景。 - 神经网络训练场景下,可以分别给两个维度的张量接入适配的线性层,将特征维度对齐后再拼接,无需手动调整张量维度。
内容的提问来源于stack exchange,提问作者Atefeh Rashidi
相关产品推荐
相关产品推荐

