批归一化BN层总结

今天总结一下之前学习的批归一化层也就是Batch Normalize层。

PyTorch中的BN层:

PyTorchtorch.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应该有所差异),现在看看这些参数的作用

  1. num_features:一般是输入的数据的通道数,(这个要自己设定,没有默认值哦);

  2. eps=1e-5:为数值或者计算稳定性添加到分母中的一个值,个人理解就是计算公式最后面分母中的ε(诶普西龙);

  3. momentum=0.1:用于running_meanrunning_var的计算添加的一个参数,其计算公式为:
    x ^ new = ( 1 − momentum ) × x ^ + momemtum × x t \hat{x}_\text{new} = (1 - \text{momentum}) \times \hat{x} + \text{momemtum} \times x_t x^new=(1momentum)×x^+momemtum×xt 解释: x ^ \hat{x} x^ 是历史的统计量,而 x t x_t xt 是当前的观察值,或者当前batch计算得出的平均值或者方差。最终求得值,一般作为在预测阶段时的均值和方差。

  4. affine=True:这个表示是否需要可变参数γ(伽马)和β(贝塔),默认是需要;

  5. track_running_stats=Truerunning_meanrunning_var会跟踪不同batch数据的meanvariance,但仍然是用每个batchmeanvariancenormalization。(有的版本已经没有这个参数了,而且这个情况比较多可以参考知乎:链接);

BN层的计算过程:

(1)先给出大神论文中的计算过程和公式:
批归一化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

你可能感兴趣的:(PyTorch,机器学习)