本文共 1407 字,大约阅读时间需要 4 分钟。
网络在训练过程中,中间层的权重在不断发生变化,导致该层输出数据的分布发生改变,这种数据分布的改变称为’Internal Covariate Shift’。
为了解决Internal Covariate Shift现象,Sergey Ioffe and Christian Szegedy提出了BatchNormalization算法,This operation simply zero-centers and normalizes each input, then scales and shifts the result using two new parameter vectors per layer: one for scaling, the other for shifting,具体步骤如下所示:
在推理过程中,输入的batch size可能很小,甚至是1,因此求得的均值和标准差不具有代表性,实际此时输入的均值 μ B和标准差σ B实际采用的是整个训练集的均值和标准差,而这两个值在训练过程中是随着训练的推进逐渐迭代更新的,而不是训练完后再在整个数据集上计算均值和标准差,这两个在训练过程中不断迭代更新的均值和标准差分别称为moving_mean, moving_variance,是由训练集决定的,不需训练。
由以上所述可知,一个BatchNormalization层涉及到的参数包含在四个矩阵(向量)中,分别是gamma, beta, moving_mean, moving_variance,这四个矩阵的元素数都是相同的,即等于输入个数(或者输入通道数),其中一半是可训练的,而另一半是不需要训练的。
按下式计算:
FLOPs = 2*C*W*H
C是BatchNormalization层的输入通道数,W和H分别是BatchNormalization层输入特征图的宽和高分辨率,2指的是包括乘法和加法。
实际应用中往往将BatchNormalization层合并到卷积层,而不单独考虑其计算量。
转载地址:http://harti.baihongyu.com/