Pytorch中的广播机制

文章目录

翻译自Pytorch官方文档 BROADCASTING SEMANTICS

在Pytorch中,两个张量形状不同有时也可以进行运算,这涉及到了Pytorch中的广播机制,也就是Pytorch会自动扩充两个张量,使两个张量的形状相同,然后再进行运算,下面具体说明。

广播条件

如果两个张量满足下面两个条件,就可以广播:

  1. 每个张量都至少有一个维度
  2. 对两个张量的维度从后往前处理,维度的大小(这个维度的长度)必须要么相等,要么其中一个为1,或者其中一个张量后面不存在维度了。

上面说的比较抽象,下面举几个例子:

>>> 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是可广播的,结果的张量大小按如下方式计算:

  1. 如果x和y的维度数量不同,对维度数量少的张量增加新的维度,且维度大小为1,使得两个张量的维度数量相同
  2. 对每个维度,结果的维度大小是x和y的维度大小的最大值。(其实如果某个维度大小不同,那么有一个维度大小肯定是1)

下面举几个例子:

>>> 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
  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值