本文介绍一下tensor运算的广播机制,先来看看官方文档:

官方文档:https://pytorch.org/docs/stable/notes/broadcasting.html#broadcasting-semantics
两个tensor要支持广播,则必须满足以下条件
1, 每个tensor都最起码有1维;
2,从后往前数,两个tensor的纬度要么相等,要么其中一个是1,要么其中一个不存在;
接下来,通过示例来说明:

示例一:相同维度支持广播
x, y的维度信息相同,支持广播

示例二:0维不支持
x维度为0,不支持广播

示例三:维度为1或不存在,支持广播
从后往前数,第一维x,y都为1,相同;
第二维x为4,y为1,满足其中一个为1;
第三维x和y相同,都为3;
第四维y不存在;
满足条件,x和y支持广播

示例四:不满足条件,不支持广播
此示例x和y的倒数第三维不满足条件,x为2,y为3,所以不支持广播。
ok,现在相信大家已经明白了两个tensor要支持广播所要满足的条件。那么如果支持广播了,对于维度不一样的两个tensor运算时是怎么处理的呢?接下来就来介绍介绍。先看看官方文档:

广播tensor的运算规则, 来源:https://pytorch.org/docs/stable/notes/broadcasting.html#broadcasting-semantics
1, 首先给维度少的那个tensor填充上1(这里的1并不是填充1这个数字,而是增加维度,维度的值和原先一样),让两个tensor维度相等;
2, 运算结果的每一维大小等于两个tensor对应维度的维度大的那个。
规则也很简单,相信读者对以下示例结果不再感到困惑:

广播运算法则
有一个情况需要注意下,pytorch的运算会返回一个新值,不会更新变量,除非你把结果赋值给它:

x,y的声明

相加
x.add(y)之后会返回运算结果,但x的值不会变,除非你将结果赋值给它: x = x.add(y)
或者用pytorch提供的内部方法:

add_ method
这个操作会直接在x上边进行操作,等价与 x = x.add(y)
而上面提到的广播运算机制,其实是会改变tensor形状的,如果是就地运算且填充之后改变了x的形状,则会报错:

广播填充改变了x的形状,导致报错
这个case也需要大家注意一下。