天天看点

13-tf.nn.batch_normalization(批量归一化)

一、前言

本篇主要介绍tf.nn.batch_normalization的介绍及使用方法,该BN层级是博主之前搭建网络的过程中没有写入的,该层级的实用性是非常强的,也是一个比较常用的方法。

二、介绍

1.BN算法,一般用在全连接或卷积神经网络中。可以增强整个神经网络的识别准确率以及增强模型训练过程中的收敛能力。

2.对于两套权重参数,例如(w1:0.01,w2:10000,w3:0.01)和(w1:1,w2:1,w3:1),他们对应的(Z=x * w1 * w2 * w3)的表达式Z值都是相同的。但是这个时候分别对这两套参数做训练,更新后的权重参数就变成了(w1:100.01,w2:10000.0001,w3:100.01)(w1:2,w2:2,w3:2) ,然后进行第二次正向计算,Z1=1 * 2 * 2 * 2=8, Z2=1 * 100.01 * 10000.0001 * 100.01=100000000,如此可见,这两个更新后的权重值引发的网络输出变化剧烈程度,Z2与Z1相比是非常剧烈的,这个时候计算出来的loss值会非常大,使得整个网络的无法计算,这种现象就叫做梯度爆炸。产生这种现象的原因就是因为网络的内部协变量转移,即正向传播时的不同层的参数会将反向传播计算时所参照的样本分布改变。

3.引入BN层的作用在于要最大限度的保证每次正向传播都输出在同一分布上,这样反向计算时参照的数据样本分布就会和正向计算时的数据分布一样了。保证了分布的统一,对权重的调整才会更有意义。

三、函数和相关公式介绍

1.tf.nn.batch_normalization(x,mean,variance,offset,scale,variance_epsilon,name=None)

x:input

mean:样本均值

variance:样本方差

offset:样本偏移(相加一个转化值)

scale:缩放(默认为1)

variance_epsilon:为了避免分母为0,添加的一个极小值

2.tf.nn.moments(x,axes,name=None,keep_dims=False)

x:input

axes:维度

3.axes=list(range(len(x.get_shape())-1)),该公式常用来求input的维度信息。

4.tf.train.ExponentialMovingAverage,该方法为一个类,使用它必须先调用对象,然后调用对象方法apply(),该方法的作用是使用平滑指数衰减的方法来优化每次的均值和方差。

直接使用如下代码即可

from tensorflow.contrib.layers.python.layers import batch_norm
batch_norm(value,decay=0.9,updates_collections=None,is_training=True)
           

继续阅读