Broadcast 是python 中很重要的一种机制,尤其是深度学习兴起之后,其被广泛运用于CNN网络结构中。 下面我们介绍一下 Broadcast 机制。
Broadcast 的核心原则有三条:
- 从最小的维度进行匹配(最后一个维度)
- 如果当前维数为1, 扩充至相同维数
- 如果当前没有维数,先增加一维,再扩充至相同维数
我们通过几个具体的例子来解释上面3条准则。我们以一个BCHW(样本个数,通道数,每个图像的高,每个图像的宽)格式的数据为例:
python 中的 Broadcast
若我们想要对一个训练集中采取一个平移操作:
准则3
a 是 由100 张3通道,像素为32*24 图片组成的数组, b 是对每个图片想要进行的平移操作(准则3)
若我们想要对图片的颜色进行操作(准则3)
若我们想要对颜色和像素同时操作(准则3)
准则2
回到只对图片的像素操作
import numpy as np
a = np.random.rand(100, 3, 32, 24)
b3 = np.random.rand(16, 12)
(a + b3).shape
返回结果
怎么会出错了呢? 16*2=32, 12*2 =24, 之后按照准则三增加维数,再进行扩充,应该没有什么问题。
原因在于违背了准则二:
从这样一个角度来理解: 给定一个2维数据和1维数据,如果他们能够相加, 我们希望1维数据没有的那些维度,他们的特性是一样的,也就是说他们相加的值是一样的。比方说
我们希望得到broadcast 之后的b 为
之后与a相加。 这样做的问题在于 b 新增的维度对应的向量为[2,1,2,1], 也就是说我们新增的维度有一个非均匀的先验假设,这显示是不符合实际的, 从这一点我们便可以看出准则2的必要性。
准则1
如果我们想对通道进行变换, 从程序中便可以看出准则1的必要性.
a = np.random.rand(100, 3, 32, 24)
b = np.random.rand(3) # 错: 违背了准则2
c = np.random.rand(3, 1, 1) # 对
tensorflow,pytorch 中的 Broadcast
只需将上面的 numpy 换成tensorflow,torch 即可。