今天总结一下之前学习的批归一化层也就是Batch Normalize层。
PyTorch中的BN层:
在PyTorch的torch.nn模块中提供三种归一化操作,分别用于不同的输入数据:
-
BatchNorm1d(num_features, eps=1e-5, momentum=0.1, affine=True, track_running_stats=True)一般用于输入数据是,由2d数据组成的3d数据。 -
BatchNorm2d(num_features, eps=1e-5, momentum=0.1, affine=True, track_running_stats=True)一般用于输入数据是,由3d数据组成的4d数据。(这一个是最常用的,例如一个图片是3通道,组成一个batch就是4d数据了) -
BatchNorm3d(num_features, eps=1e-5, momentum=0.1, affine=True, track_running_stats=True)一般用于输入数据是,由4d数据组成的5d数据。
从上面看,这三种函数的参数是一致的(不同的PyTorch应该有所差异),现在看看这些参数的作用:
-
num_features:一般是输入的数据的通道数,(这个要自己设定,没有默认值哦); -
eps=1e-5:为数值或者计算稳定性添加到分母中的一个值,个人理解就是计算公式最后面分母中的ε(诶普西龙); -
momentum=0.1:用于running_mean和running_var的计算添加的一个参数,其计算公式为:
解释: 是历史的统计量,而 是当前的观察值,或者当前batch计算得出的平均值或者方差。最终求得值,一般作为在预测阶段时的均值和方差。 -
affine=True:这个表示是否需要可变参数γ(伽马)和β(贝塔),默认是需要; -
track_running_stats=True:running_mean和running_var会跟踪不同batch数据的mean和variance,但仍然是用每个batch的mean和variance做normalization。(有的版本已经没有这个参数了,而且这个情况比较多可以参考知乎:链接);
BN层的计算过程:
(1)先给出大神论文中的计算过程和公式:
(2)一个简单直观的举例:
这样就不用多解释了,最后基本可以获得一个组均值为 β 、方差为 γ^2的分布的新数据。案例参考链接
BN的作用和意义:
(1)BN层的作用和优点:
- 防止“梯度弥散”
- 加速网络收敛速度
- 可以使用较大的学习率
- 可代替其他正则方式,例如Dropout等
(2)不足的地方:
- 有文献显示,并不是所有的数据集都适合BN操作。
(3)如果想深入了解,推荐学习链接:
[1]:https://blog.csdn.net/HMH2_YY/article/details/86493985
[2]:https://zhuanlan.zhihu.com/p/33173246
[3]:https://blog.csdn.net/qq_25737169/article/details/79048516