如何在PyTorch中沿axis 0实现张量无循环广播相加?
解决方案
要实现第二个示例的广播加法,核心是调整张量a的维度结构,让它满足PyTorch的广播规则。
PyTorch的广播规则是从最后一维开始向前匹配:
- 第一个示例中,
a形状为(20,),b为(20,20),a会自动被广播为(20,20)(在前方补维度并复制数据),因此能直接相加。 - 第二个示例中,
a是(32,20),b是(32,20,20),直接匹配时a缺少最后一维,导致维度不兼容。只需给a增加一个长度为1的最后一维,让它的形状变为(32,20,1),就能和b的维度结构对齐,触发广播机制。
具体实现有几种简洁方式:
- 方法一:用
unsqueeze指定新增维度位置
a = torch.rand(32, 20) b = torch.rand(32, 20, 20) result = a.unsqueeze(-1) + b # a.unsqueeze(-1) 形状变为(32,20,1)
- 方法二:用索引语法快速新增维度
a = torch.rand(32, 20) b = torch.rand(32, 20, 20) result = a[:, :, None] + b
- 方法三:用
view手动调整形状
a = torch.rand(32, 20) b = torch.rand(32, 20, 20) result = a.view(32, 20, 1) + b
以上方式都能让a被自动广播到(32,20,20)的形状,完成逐元素加法,全程无需循环。
内容的提问来源于stack exchange,提问作者Theodor A
相关产品推荐
相关产品推荐

