Broadcasting
- expand(与上一节说的expand功能相同,可以扩展维度,但是这里是自动的,扩展的时候不需要拷贝数据)
- without coping data
broadcast实施
- 从最小的维度开始匹配,如果前面没有维度的话,插入一个新的维度
- 插入的维度的size为1,我们把它扩张成与要计算的tensor相同的size
例如:feature maps:[4,32,14,14]
假设要对这个tensor增加一个偏置值,因此我们的偏置是添加在每一个channel上面的,因此我们需要的偏置的数量一共是32个,为了让bias符合broadcast的条件,插入两个1的维度
bias:[32,1,1] =>[1,32,1,1]=>[4,32,14,14]
size一致,可以进行对应位置元素相加
broadcast存在的意义
实例1
学校成绩单的统计:[class,students,socres]=[4,32,8]
现在我们发现学生的成绩太低了或者今年的考试太难了,校长决定给每个学生都加5分,意味着[4,32,8]这个tensor必须和一个相同shape的tensor相加,5分很明显是一个标量或者是一个维度为1的向量[4,32,8] + [5.0]
要理解数据的内容和数据的shape之间的区别
我们希望能够按照规则来完成相加操作,但是又不希望这个步骤由我们自己做
如果要自己做的话
[5.0]的dimension为1 [1].unsqueeze(0).unsqueeze(0) 变成[c,s,score]=[1,1,1]再使用.expand_as(A)会把[1,1,1]变成[4,32,8]即跟A的shape一样
我们想要[4,32,8]和[1]这样的操作是运行的,但是又要确保数学上单的规则即相加的shape必须一致也就是[4,32,8]必须和[4,32,8]相叠加,所以可以用broadcast,不需要写onsqueeze和expand
什么情况可以使用广播?
首先需要有两个tensor一个A和一个B,小维度指定大维度随意,例如上面加5分这个例子,最后一维这个属性是我们指定的规则来做,即每一门课都加0.5分,如果[5.0]的前面没有维度就插入1维,再来比较,如果shape上面的维度是1意味着1适合于这条轴上所有的案例因此把它扩张成为相同的地方,已经是1的地方也把它扩张成为相同的,其他的地方就是不能广播
比如a的tensor[4,32,8],4个班级每个班级32个人8门课成绩,我们希望每门课成绩都加5分给b的tensor的shape是[1],如果1之前没有任何维度,就意味着维度都适合即对于每个学生、每个班级都适合,此时成绩的维度也是1,即对八门课也都适合,所以会广播成[4,32,8]
或者不希望对所有的课都加5分,比如发现英语考完了,给b的tensor为[8] [0,0,5,0,0,0,0,0]英语考完了加5分其他的都不加分, 没有维度的都扩张成1,但是加分的维度已经是8了即意味着不是所有的维度都要加5分,而是哪一门课程加几分,所以最终的tensor是[4,32,8]
不符合规则的情况
A还是[4,32,8],B为[4]=[0,0,0,5]这个4怎么理解呢?我们有8门课,但是你只给了4门课的信息,不知道该怎么加,所以没办法完成自动扩展
具体案例
不管对于哪一个图片或者哪一个通道来说都叠加一个14×14的长宽
只给了两张照片的参数,剩下两张照片的参数没有给,不知道怎么加