Batch Normalization(批标准化,BN)

1.什么是标准化?

标准化:使数据符合 0 均值,1 为标准差的分布。

神经网络对0附近的数据更敏感,但是随着网络层数的增加,特征数据会出现偏离0均值的情况,标准化能够使数据符合0均值,1为标准差的分布,把偏移的特征数据重新拉回到0附近

Batch Normalization(批标准化):对一小批数据在网络各层的输出做标准化处理,其具体实现方式如图 5-10 所示。
Batch Normalization 将神经网络每层的输入都调整到均值为 0,方差为 1 的标准正态分布,其目的是解决神经网络中梯度消失的问题,如图 5-11 所示。

 

 BN操作使得原本偏移的特征数据,如5-11的第一个图,重新拉回到0均值,使进入激活函数的数据分布在激活函数线性区,使得输入数据的微小变化,更明显的体现到激活函数的输出,提升了激活函数对输入数据的区分力。

但是,这种简单的特征数据标准化,使特征数据完全满足标准正态分布,图5-12黄色的线,集中在激活函数中心的线性区域,使激活函数丧失了非线性特性,因此在BN操作中为每个卷积核引入了两个可训练的参数,缩放因子γ和偏移因子β,会与其他待训练参数一同被训练化,使标准正态分布后的特征数据通过缩放因子和偏移因子,优化了特征数据分布的宽窄和偏移量。保证了网络的非线性表达力(如果不加入这两个参数,相当于这一层所学习的特征分布被搞坏了)

BN 操作的另一个重要步骤是缩放和偏移,值得注意的是,缩放因子 γ 以及偏移因子 β都是可训练参数,其作用如图 5-12 所示。

 2.BN层的位置(也属于网络的一层,即相当于加了个预处理层)

BN 操作通常位于卷积层之后,激活层之前,在 Tensorflow 框架中,通常使用 Keras 中的 tf.keras.layers.BatchNormalization 函数来构建 BN 层。在调用此函数时,需要注意的一个参数是 training,此参数只在调用时指定,在模型进行前向推理时产生作用,当 training = True 时, BN 操作采用当前 batch 的均值和标准差;当training = False 时, BN 操作采用滑动平均(running)的均值和标准差。
在 Tensorflow 中,通常会指定 training = False,可以更好地反映模型在测试集上的真实效果。

3.滑动平均

滑动平均(running) 的解释:滑动平均,即通过一个个 batch 历史的叠加,最终趋向数据集整体分布的过程,在测试集上进行推理时,滑动平均的参数也就是最终保存的参数。
此外, Tensorflow 中的 BN 函数其实还有很多参数,其中比较常用的是 momentum,即动量参数, 与 sgd 优化器中的动量参数含义类似但略有区别, 具体作用为滑动平均 running =momentum * running + (1 – momentum) * batch, 一般设置一个比较大的值, 在 Tensorflow 框架中默认为 0.99。

 

4.tensorflow中BN的使用

 

1.1 tf.nn.moments

 (1)计算2x3向量的mean和variance

 

 

(2)计算卷积神经网络某层的mean和variance

假定我们需要计算的数据形状是[batchsize, height, width, kernels]

输出:

 

 

 (3)tf.nn.batch_normalizatin

 

 

 

 注意:

tf.control_dependencies(control_inputs)

 

原文地址:https://www.cnblogs.com/GumpYan/p/13557687.html