发布时间:2022-08-19 14:03
BN层的优点
1)加快训练速度,防止过拟合。
2)可以避免激活函数进入非线性饱和区,从而造成梯度弥散问题。
不用理会拟合中的droupout、L2正则化项的参数选择,采用BN算法可以省去这两项或者只需要小的L2正则化约束。原因,BN算法后,参数进行了归一化,原本经过激活函数没有太大影响的神经元分布变得明显,经过一个激活函数以后,神经元会自动削弱或者去除一些神经元,就不用再对其进行dropout。另外就是L2正则化,由于每次训练都进行了归一化,就很少发生由于数据分布不同导致的参数变动过大,带来的参数不断增大。
3)BN层本质上是一个归一化网络层,可以替代局部响应归一化层(LRN层)。
4)可以打乱样本训练顺序(这样就不可能出现同一张照片被多次选择用来训练)论文中提到可以提高1%的精度。
在数据处理的时候,我们一般都对输入样本进行零均值化,降低输入样本之间的差异性,加速网络的训练。但是在网络的训练过程中,每层的数据分布不一样,导致参数不断的适应新的分布。这将网络的训练更加困难。
有些人首先提出在每层增加PCA
白化(先对数据进行去相关然后再进行归一化),这样基本满足了数据的0均值、单位方差、弱相关性。但是这样是不可取的,因为在白化过程中会计算协方差矩阵、求逆等操作,计算量会很大,另外,在反向传播时,白化的操作不一定可微。因此,在此背景下BN
算法开始出现。
, 是可以学习的参数,用来增加 鲁棒性,可以恢复原始的数据分布。
nn.BatchNorm2d(self, num_features, eps=1e-5, momentum=0.1, affine=True, track_running_stats=True)
num_features,输入数据的通道数,归一化时需要的均值和方差是在每个通道中计算的
eps,用来防止归一化时除以0
momentum,滑动平均的参数,用来计算running_mean和running_var
affine,是否进行仿射变换,即缩放操作
track_running_stats,是否记录训练阶段的均值和方差,即running_mean和running_var
参考文献:
BN算法(Batch Normalization)的原理和作用_我是天才很好的博客-CSDN博客_bn算法
一文搞懂BN的原理及其实现过程(Batch Normalization)_jhsignal的博客-CSDN博客_bn的原理
Pytorch-BN层详细解读_Nicetomeetu-的博客-CSDN博客_bn层 pytorch