大家好,欢迎来到IT知识分享网。
BN层,顾名思义嘛,就是归一化的作用,在深度学习里很常用,这里来简要梳理一下BN层的相关知识.
1 BN层引出的目的
神经网络在进行训练时,主要是用来学习数据的分布规律,如果数据的训练部分和测试部分分布不一样,那么网络的泛化能力会变得非常差.而且对于训练的数据,每批分布也是不一样的,那么网络在迭代的过程中也要学习和适应不同的分布.这会大大降低网络的训练速度.此外,数据的分布对于激活函数来说也非常重要,有时数据分布范围太大不利于利用激活函数的非线性特性.一个例子如下图所示:
可以看出,未进行归一化的数据可能很多部分位于该损失函数的饱和区,从而导致输出的结果非常接近,不利于网络的学习.
2 BN层的概念
针对于归一化的问题,《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出可以在网络的每一层设立一个归一化层,对数据进行归一化处理,然后再送入下一层.BN层的前向传播过程如下所示(m表示mini batch大小):
(4)式的输出结果就是BN层的输出结果.所以BN层实际学习的是缩放系数
γ γ
和偏移系数
β β
,从而使网络去学习输出的特征分布.在实际测试中,我们只输入一个测试样本时,此时没有mini batch这个概念了,其他参数如均值和标准差都是固定不变的,即测试时均值和标准差的公式为:
也就是说,测试时均值采用训练中u值的均值,标准差采用训练中标准差的无偏估计.所以最终测试时,BN使用的公式是:
BN层置于激活函数的前面.在使用过程中,BN层的参数是针对整个特征图进行的,也就是说,BN层是求一个特征图所有神经元的均值和方差,对特征图的神经元做归一化.
3 BN层的实现
tensorflow里使用BN层的api如下
def batch_normalization(x, mean, variance, offset, scale, variance_epsilon, name=None):
x是输入,mean是均值,variance是方差,offset是偏移 β β (默认为0),scale是缩放系数 γ γ (默认为1),variance_epsilon为 ϵ ϵ ,调用这个api就可以输出BN后的结果.
另一个实现BN操作的api是tf.contrib.layers.batch_norm()函数,详情可见:https://www.tensorflow.org/api_docs/python/tf/contrib/layers/batch_norm
参考:
1.https://blog.csdn.net/hjimce/article/details/50866313
2.https://zhuanlan.zhihu.com/p/26138673
3.https://morvanzhou.github.io/tutorials/machine-learning/ML-intro/3-08-batch-normalization/
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/12846.html