深度学习(二十六)Network In Network学习笔记

深度学习(二十六)Network In Network学习笔记

Network In Network学习笔记html

原文地址:http://blog.csdn.net/hjimce/article/details/50458190c++

做者:hjimcegit

1、相关理论github

本篇博文主要讲解2014年ICLR的一篇很是牛逼的paper:《Network In Network》,过去一年已经有了好几百的引用量,这篇paper改进了传统的CNN网络,采用了少许的参数就松松击败了Alexnet网络,Alexnet网络参数大小是230M,采用这篇paper的算法才29M,减少了将近10倍啊。这篇paper提出的网络结构,是对传统CNN网络的一种改进(这种文献少之又少,因此感受颇有必要学习)。算法

传统的卷积神经网络通常来讲是由:线性卷积层、池化层、全链接层堆叠起来的网络。卷积层经过线性滤波器进行线性卷积运算,而后在接个非线性激活函数,最终生成特征图。以Relu激活函数为例,特征图的计算公式为:网络

 

 

其中(i,j)表示图片像素点的位置索引,xij表示咱们卷积窗口中的图片块,k则表示咱们要提取的特征图的索引。架构

通常来讲,若是咱们要提取的一些潜在的特征是线性可分的话,那么对于线性的卷积运算来讲这是足够了。然而通常来讲咱们所要提取的特征通常是高度非线性的。在传统的CNN中,也许咱们能够用超完备的滤波器,来提取各类潜在的特征。好比咱们要提取某个特征,因而我就用了一大堆的滤波器,把全部可能的提取出来,这样就能够把我想要提取的特征也覆盖到,然而这样存在一个缺点,那就是网络太恐怖了,参数太多了。maven

咱们知道CNN高层特征实际上是低层特征经过某种运算的组合。因而做者就根据这个想法,提出在每一个局部感觉野中进行更加复杂的运算,提出了对卷积层的改进算法:MLP卷积层。另外一方面,传统的CNN最后一层都是全链接层,参数个数很是之多,容易引发过拟合(如Alexnet),一个CNN模型,大部分的参数都被全链接层给占用了,故这篇paper提出采用了:全局均值池化,替代全链接层。所以后面主要从这两个创新点进行讲解。函数

2、MLP卷积层(文献创新点1)post

 

这个是文献的大创新点,也就是提出了mlpconv层。Mlpconv层能够当作是每一个卷积的局部感觉野中还包含了一个微型的多层网络。其实在之前的卷积层中,咱们局部感觉野窗口的运算,能够理解为一个单层的网络,以下图所示:

线性卷积层

CNN层的计算公式以下:

然而如今不一样了,咱们要采用多层的网络,提升非线性,因而mlpconv层的网络结构图以下::

 

Mlpconv层

从上面的图能够看到,说的简单一点呢,利用多层mlp的微型网络,对每一个局部感觉野的神经元进行更加复杂的运算,而之前的卷积层,局部感觉野的运算仅仅只是一个单层的神经网络罢了。对于mlpconv层每张特征图的计算公式以下:

通常来讲mlp是一个三层的网络结构。
下面是一个单层的mlpconv网络的caffe网络结构文件,源码来自于: https://gist.github.com/mavenlin/d802a5849de39225bcc6 :
  1. 3、全局均值池化(文献创新点2)

传统的卷积神经网络卷积运算通常是出如今低层网络。对于分类问题,最后一个卷积层的特征图经过量化而后与全链接层链接,最后在接一个softmax逻辑回归分类层。这种网络结构,使得卷积层和传统的神经网络层链接在一块儿。咱们能够把卷积层看作是特征提取器,而后获得的特征再用传统的神经网络进行分类。

然而,全链接层由于参数个数太多,每每容易出现过拟合的现象,致使网络的泛化能力不尽人意。因而Hinton采用了Dropout的方法,来提升网络的泛化能力。

本文提出采用全局均值池化的方法,替代传统CNN中的全链接层。与传统的全链接层不一样,咱们对每一个特征图一整张图片进行全局均值池化,这样每张特征图均可以获得一个输出。这样采用均值池化,连参数都省了,能够大大减少网络,避免过拟合,另外一方面它有一个特色,每张特征图至关于一个输出特征,而后这个特征就表示了咱们输出类的特征。这样若是咱们在作1000个分类任务的时候,咱们网络在设计的时候,最后一层的特征图个数就要选择1000,下面是《Network In Network》网络的源码,倒数一层的网络相关参数: 

全局均值池化层的相关参数以下:

由于在Alexnet网络中,最后一个卷积层输出的特征图大小恰好是6*6,因此咱们pooling的大小选择6,方法选择:AVE。

4、整体网络架构

根据上面的做者对传统CNN的两个改进,利用其进行1000物体分类问题,因而做者最后设计了一个:4层的NIN+全局均值池化,网络以下:

我的总结:我的感受这篇文献颇有价值,实现方式也很简单,一开始我还觉得须要caffe的c++源码来实现NIN网络,结果发现实现NIN的源码实现方式其实就是一个1*1的卷积核,实现卷积运算,因此实现起来至关容易,不须要本身写源码,只须要简简单单的把卷积核的大小变一下,而后最后一层的全链接层直接用avg pooling替换一下就ok了。我的评价:网络浅显易懂,简单实现,却能够改进原来的网络,提升精度,减少模型大小,因此是一篇很值得学习的文献。后续即将讲解另外几篇2015年,也是对CNN网络结构改进的牛逼文献:《Spatial Transformer Networks》、《Striving For Simplicity:The All Convolutional Net》、《Stacked What-Where Auto-encoders》,敬请期待,毕竟这样的文章勇于挑战传统的CNN结构,对其不知作出改进,因此咱们须要一篇一篇的学。

参考文献:

一、《Network In Network》

二、https://github.com/BVLC/caffe/wiki/Model-Zoo

三、https://gist.github.com/mavenlin/d802a5849de39225bcc6 

四、《Maxout Networks》

**********************做者:hjimce   时间:2016.1.4  联系QQ:1393852684     原创文章,版权全部,转载请保留本行信息***************

相关文章
相关标签/搜索