在TensorFlow上实现BatchNormalization
2017-07-04 本文已影响0人
vincehxb
为什么要用batch normalization
对于‘白化’(高斯分布,且特征间独立)的数据,神经网络一般有更快的收敛速度。使用batch normalization这个方法,可以使得每一层网络的输入(也就是上一层网络的输出)都‘白化’,从而加快收敛速度,但是也有可能某一层的网络不想要输入是高斯分布的,所以引入了两个可学习的参数来使得这种‘高斯分布化’可以取消,所以每一层的输入可能是高斯分布的,也可能不是,取决于这一层需要哪一种输入。
如何用tensorflow实现batchnormalization
下面是我在stackoverflow 上找到的答案。主要分成4部分
下面是原文答案
下面是我在mnist数据中上用网络结构为(conv1-maxpool-bn-relu-conv2-maxpool-bn-relu-fc1-bn-relu-fc2-bn-relu-fc->输出)的步骤和结果
1.定义一个占位符,来区别当前是属于训练阶段还是测试阶段
这个主要是和bn的原理有关,在训练阶段,bn要计算batch的方差和均值,在测试阶段,方差和均值是直接调用得到的(从训练算出来的值)
2.在每一层的卷积输出(或者是全连接层输出)后,激活函数前,插入bn层
下面图片中x是卷积层的输出,在relu前加入bn
3.定义单独的op,在训练或者测试的时候运行,记得给第一步定义的占位符赋值(True表示训练中,False表示非训练)
4.最后一步就是训练或者是测试的时候单独运行3定义的ops啦
结果对比:
从accuracy来看,在relu前面加入bn使得训练收敛的速度快很多
loss对比
下面是conv层的输出(插入bn再relu)
下面是conv层的输出(只有relu)
结论:
使用bn可以加快收敛的速度,减少训练的时间。而且利用tensorflow来实现bn操作并不复杂,所以建议在训练网络中插入bn层。