在TensorFlow上实现BatchNormalization

为什么要用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层。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容