学习时候发现了有的网络结构中将BN作为单独的一层进行设计,因此学习了一下BN。

1. Batch normalization理解

BN可以作为**层之前一层,将输入数据进行标准化,

Batch normalization理解

 BN计算公式如下:

Batch normalization理解

 其中,E[x]为均值,sqrt(var)为标准差,可知BN层的输出其实是将输入的数据标准化成为均值为0方差为1的正态分布。

 

这样做的原因呢?

 

这里我们假设使用sigmoid函数作为网络**函数:

Batch normalization理解

可见,如果**层的输入数据是标准分布的话,**层能够有更好的效果,

那么如果输入层数据没有进行BN标准话,假设其均值为7,方差为2的正态分布,那么sigmoid函数就无法有效的区分数据,出现梯度消失问题。

同时,将数据标准化,还可以帮助网络加速收敛。

更多BN参考:https://www.cnblogs.com/guoyaohua/p/8724433.html

2. pytorch中的BN BatchNorm2d()

我们知道BN可以将数据进行标准化,但是我们有的时候并不需要完全标准化的数据分布,因此可以将标准化的数据进行一定的线性变化,BatchNorm2d()数学原理如下:

Batch normalization理解

 其中γ与β是可以学习的系数矩阵。

BatchNorm2d()作为神经网络的一层,拥有一下参数:

BatchNorm2d()内部的参数如下:

1.num_features:一般输入参数为batch_size*num_features*height*width,即为其中特征的数量

2.eps:分母中添加的一个值,目的是为了计算的稳定性,默认为:1e-5

3.momentum:期望和方差的更新参数,与动量梯度下降法类似,期望和方差的更新公式:

Batch normalization理解

Batch normalization理解为模型的均值或方差,

Batch normalization理解为当前观测值的均值或方差,

Batch normalization理解为更新后的均值或方差,momentum为更新参数。

4.affine:当设为true时,会给定可以学习的系数矩阵gamma和beta

更多关于BatchNorm2d()参考:

https://blog.csdn.net/bigFatCat_Tom/article/details/91619977

https://blog.csdn.net/algorithmPro/article/details/103982466

 

相关文章: