批归一化BN层总结
今天总结一下之前学习的批归一化层也就是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.****.net/HMH2_YY/article/details/86493985
[2]:https://zhuanlan.zhihu.com/p/33173246
[3]:https://blog.****.net/qq_25737169/article/details/79048516