在TensorFlow上实现BatchNormalization

为什么要用batch normalization

对于‘白化’(高斯分布,且特征间独立)的数据,神经网络一般有更快的收敛速度。使用batch normalization这个方法,可以使得每一层网络的输入(也就是上一层网络的输出)都‘白化’,从而加快收敛速度,但是也有可能某一层的网络不想要输入是高斯分布的,所以引入了两个可学习的参数来使得这种‘高斯分布化’可以取消,所以每一层的输入可能是高斯分布的,也可能不是,取决于这一层需要哪一种输入。

如何用tensorflow实现batchnormalization

下面是我在stackoverflow 上找到的答案。主要分成4部分

下面是原文答案

在TensorFlow上实现BatchNormalization_第1张图片


下面是我在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使得训练收敛的速度快很多

在TensorFlow上实现BatchNormalization_第2张图片

loss对比


在TensorFlow上实现BatchNormalization_第3张图片

下面是conv层的输出(插入bn再relu)


在TensorFlow上实现BatchNormalization_第4张图片


在TensorFlow上实现BatchNormalization_第5张图片

下面是conv层的输出(只有relu)


在TensorFlow上实现BatchNormalization_第6张图片


在TensorFlow上实现BatchNormalization_第7张图片

结论:

使用bn可以加快收敛的速度,减少训练的时间。而且利用tensorflow来实现bn操作并不复杂,所以建议在训练网络中插入bn层。

你可能感兴趣的:(在TensorFlow上实现BatchNormalization)