翻译自Pytorch官方文档 BROADCASTING SEMANTICS
在Pytorch中,两个张量形状不同有时也可以进行运算,这涉及到了Pytorch中的广播机制,也就是Pytorch会自动扩充两个张量,使两个张量的形状相同,然后再进行运算,下面具体说明。
如果两个张量满足下面两个条件,就可以广播:
上面说的比较抽象,下面举几个例子:
>>> x=torch.empty(5,7,3)
>>> y=torch.empty(5,7,3)
# 相同的形状总是可以广播的
>>> x=torch.empty((0,))
>>> y=torch.empty(2,2)
# 不能广播,因为两个张量都必须只有一个维度
# 可以将尾部对齐
>>> x=torch.empty(5,3,4,1)
>>> y=torch.empty( 3,1,1)
# x和y可以广播
# 倒数第一个维度:x size == y size == 1
# 倒数第二个维度: y has size 1
# 倒数第三个维度 == y size
# 倒数第四个维度: y后面不再有维度了
# but:
>>> x=torch.empty(3,2,4,1)
>>> y=torch.empty( 3,1,1)
# x和y不能广播,因为倒数第三个维度大小不同,且没有为1的
如果两个张量x, y是可广播的,结果的张量大小按如下方式计算:
下面举几个例子:
>>> x=torch.empty(5,1,4,1)
>>> y=torch.empty( 3,1,1)
>>> (x+y).size()
torch.Size([5, 3, 4, 1])
>>> x=torch.empty(1)
>>> y=torch.empty(3,1,7)
>>> (x+y).size()
torch.Size([3, 1, 7])
>>> x=torch.empty(5,2,4,1)
>>> y=torch.empty(3,1,1)
>>> (x+y).size()
RuntimeError: The size of tensor a (2) must match the size of tensor b (3) at non-singleton dimension 1