pytorch-Broadcasting广播机制
Broadcasting是一种没有copy数据的expand
Key idea:
- 不过两个维度不相同,在前面插入维度1
- 扩张维度1到相同的维度
例如:Feature maps:[4,32,14,14]
Bias:[32,1,1]=>[1,32,1,1]=>[4,32,14,14]
A:[32,1,1]=>[1,32,1,1]=>[4,32,14,14]
B:[4,32,14,14]
这里就可以进行相同维度的相加
比如说一个[4,1]+[1,2]
那么这个[4,1]可以再复制列变为[4,2]
[1,2]可以再复制4行变为[4,2]
Why broadcasting
假如说我们有一个班级[class, students, scores],现在我们要让班级里面的全部学生都加5分,假如[4,32,8]+5.0,也就是说[4,32,8]+[1],我们知道[4, 32, 8] + [4, 32, 8]这个是可以加的,这时候就用到了broadcasting,同时也省去了大量的内存消耗。
Is it broadcasting-able?
Match from Last dim!
▪ If current dim=1, expand to same
▪ If either has no dim, insert one dim and expand to same
▪ otherwise, NOT broadcasting-able
首先用1将那个小的维度的tensor扩展成大的维度相同的维度,然后将1扩张成两者的相同维度,如果有两个维度不相同,并且都不是1的话,则不能broadcasting
这里注意要都从右端进行匹配:
A:[ ]
B: [ ]
就是这样补充
我们看个例子吧:
a=torch.randn(2,3,4)
b=torch.randn(2,3)
a+b
#The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimension 2
但是这样是可以的
也就是(2,3,4)+(2,3)是不可以的,(2,3,4)+(3,4)是可以的,因为他们是右看齐的。
Situation 1:
▪ [4, 32, 14, 14]
▪ [1, 32, 1, 1] => [4, 32, 14, 14]
Situation 2
▪ [4, 32, 14, 14]
▪ [14, 14] => [1, 1, 14, 14] => [4, 32, 14, 14]
Situation 3
▪ [4, 32, 14, 14]
▪ [2, 32, 14, 14]
▪ Dim 0 has dim, can NOT insert and expand to same
▪ Dim 0 has distinct dim, NOT size 1
▪ NOT broadcasting-able
Situation 4
▪ [4, 32, 14, 14]
▪ [4, 32, 14]
这样是不行的,因为我们要右看齐,match from
last dim
Situation 5
▪ [4, 3, 32, 32]
▪ + [32, 32]
▪ + [3, 1, 1]
▪ + [1, 1, 1, 1]
这都是可以的