机器学习与计算机视觉深度学习·神经网络·计算机视觉深度学习-推荐系统-CV-NLP

在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层。

上一篇 下一篇

猜你喜欢

热点阅读