Network In Network学习笔记
Network In Network学习笔记
原文地址:http://blog.csdn.net/hjimce/article/details/50458190
作者:hjimce
一、相关理论
本篇博文主要讲解2014年ICLR的一篇非常牛逼的paper:《Network In Network》,过去一年已经有了好几百的引用量,这篇paper改进了传统的CNN网络,采用了少量的参数就松松击败了Alexnet网络,Alexnet网络参数大小是230M,采用这篇paper的算法才29M,减小了将近10倍啊。这篇paper提出的网络结构,是对传统CNN网络的一种改进(这种文献少之又少,所以感觉很有必要学习)。
传统的卷积神经网络一般来说是由:线性卷积层、池化层、全连接层堆叠起来的网络。卷积层通过线性滤波器进行线性卷积运算,然后在接个非线性激活函数,最终生成特征图。以Relu激活函数为例,特征图的计算公式为:
其中(i,j)表示图片像素点的位置索引,xij表示我们卷积窗口中的图片块,k则表示我们要提取的特征图的索引。
一般来说,如果我们要提取的一些潜在的特征是线性可分的话,那么对于线性的卷积运算来说这是足够了。然而一般来说我们所要提取的特征一般是高度非线性的。在传统的CNN中,也许我们可以用超完备的滤波器,来提取各种潜在的特征。比如我们要提取某个特征,于是我就用了一大堆的滤波器,把所有可能的提取出来,这样就可以把我想要提取的特征也覆盖到,然而这样存在一个缺点,那就是网络太恐怖了,参数太多了。
我们知道CNN高层特征其实是低层特征通过某种运算的组合。于是作者就根据这个想法,提出在每个局部感受野中进行更加复杂的运算,提出了对卷积层的改进算法:MLP卷积层。另一方面,传统的CNN最后一层都是全连接层,参数个数非常之多,容易引起过拟合(如Alexnet),一个CNN模型,大部分的参数都被全连接层给占用了,故这篇paper提出采用了:全局均值池化,替代全连接层。因此后面主要从这两个创新点进行讲解。
二、MLP卷积层(文献创新点1)
这个是文献的大创新点,也就是提出了mlpconv层。Mlpconv层可以看成是每个卷积的局部感受野中还包含了一个微型的多层网络。其实在以前的卷积层中,我们局部感受野窗口的运算,可以理解为一个单层的网络,如下图所示:
线性卷积层
CNN层的计算公式如下:
然而现在不同了,我们要采用多层的网络,提高非线性,于是mlpconv层的网络结构图如下::
Mlpconv层
从上面的图可以看到,说的简单一点呢,利用多层mlp的微型网络,对每个局部感受野的神经元进行更加复杂的运算,而以前的卷积层,局部感受野的运算仅仅只是一个单层的神经网络罢了。对于mlpconv层每张特征图的计算公式如下:
- <span style="font-size:18px;">layers {
 - bottom: "data"
 - top: "conv1"
 - name: "conv1"
 - type: CONVOLUTION
 - blobs_lr: 1
 - blobs_lr: 2
 - weight_decay: 1
 - weight_decay: 0
 - convolution_param {
 - num_output: 96
 - kernel_size: 11
 - stride: 4
 - weight_filler {
 - type: "gaussian"
 - mean: 0
 - std: 0.01
 - }
 - bias_filler {
 - type: "constant"
 - value: 0
 - }
 - }
 - }
 - layers {
 - bottom: "conv1"
 - top: "conv1"
 - name: "relu0"
 - type: RELU
 - }
 - layers {
 - bottom: "conv1"
 - top: "cccp1"
 - name: "cccp1"
 - type: CONVOLUTION
 - blobs_lr: 1
 - blobs_lr: 2
 - weight_decay: 1
 - weight_decay: 0
 - convolution_param {
 - num_output: 96
 - kernel_size: 1
 - stride: 1
 - weight_filler {
 - type: "gaussian"
 - mean: 0
 - std: 0.05
 - }
 - bias_filler {
 - type: "constant"
 - value: 0
 - }
 - }
 - }
 - layers {
 - bottom: "cccp1"
 - top: "cccp1"
 - name: "relu1"
 - type: RELU
 - }
 - layers {
 - bottom: "cccp1"
 - top: "cccp2"
 - name: "cccp2"
 - type: CONVOLUTION
 - blobs_lr: 1
 - blobs_lr: 2
 - weight_decay: 1
 - weight_decay: 0
 - convolution_param {
 - num_output: 96
 - kernel_size: 1
 - stride: 1
 - weight_filler {
 - type: "gaussian"
 - mean: 0
 - std: 0.05
 - }
 - bias_filler {
 - type: "constant"
 - value: 0
 - }
 - }
 - }
 - layers {
 - bottom: "cccp2"
 - top: "cccp2"
 - name: "relu2"
 - type: RELU
 - }
 - </span>
 
传统的卷积神经网络卷积运算一般是出现在低层网络。对于分类问题,最后一个卷积层的特征图通过量化然后与全连接层连接,最后在接一个softmax逻辑回归分类层。这种网络结构,使得卷积层和传统的神经网络层连接在一起。我们可以把卷积层看做是特征提取器,然后得到的特征再用传统的神经网络进行分类。
然而,全连接层因为参数个数太多,往往容易出现过拟合的现象,导致网络的泛化能力不尽人意。于是Hinton采用了Dropout的方法,来提高网络的泛化能力。
本文提出采用全局均值池化的方法,替代传统CNN中的全连接层。与传统的全连接层不同,我们对每个特征图一整张图片进行全局均值池化,这样每张特征图都可以得到一个输出。这样采用均值池化,连参数都省了,可以大大减小网络,避免过拟合,另一方面它有一个特点,每张特征图相当于一个输出特征,然后这个特征就表示了我们输出类的特征。这样如果我们在做1000个分类任务的时候,我们网络在设计的时候,最后一层的特征图个数就要选择1000,下面是《Network In Network》网络的源码,倒数一层的网络相关参数:
- layers {
 - bottom: "cccp7"
 - top: "cccp8"
 - name: "cccp8-1024"
 - type: CONVOLUTION
 - blobs_lr: 1
 - blobs_lr: 2
 - weight_decay: 1
 - weight_decay: 0
 - convolution_param {
 - num_output: 1000
 - kernel_size: 1
 - stride: 1
 - weight_filler {
 - type: "gaussian"
 - mean: 0
 - std: 0.01
 - }
 - bias_filler {
 - type: "constant"
 - value: 0
 - }
 - }
 - }
 
全局均值池化层的相关参数如下:
- layers {
 - bottom: "cccp8"
 - top: "pool4"
 - name: "pool4"
 - type: POOLING
 - pooling_param {
 - pool: AVE
 - kernel_size: 6
 - stride: 1
 - }
 - }
 
因为在Alexnet网络中,最后一个卷积层输出的特征图大小刚好是6*6,所以我们pooling的大小选择6,方法选择:AVE。
四、总体网络架构
根据上面的作者对传统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结构,对其不知做出改进,所以我们需要一篇一篇的学。
参考文献:
1、《Network In Network》
2、https://github.com/BVLC/caffe/wiki/Model-Zoo
3、https://gist.github.com/mavenlin/d802a5849de39225bcc6
4、《Maxout Networks》
Network In Network学习笔记的更多相关文章
- ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)
		
ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...
 - 深度学习(二十六)Network In Network学习笔记
		
深度学习(二十六)Network In Network学习笔记 Network In Network学习笔记 原文地址:http://blog.csdn.net/hjimce/article/deta ...
 - Andrew's Blog / 《Network Programming with Go》学习笔记
		
第一章: Architecture(体系结构) Protocol Layers(协议层) ISO OSI Protocol 每层的功能: 网络层提供交换及路由技术 传输层提供了终端系统之间的数据透明传 ...
 - 转载:Network In Network学习笔记
		
转载原文1:http://blog.csdn.net/hjimce/article/details/50458190 转载原文2:http://blog.csdn.net/mounty_fsc/art ...
 - 论文《Network in Network》笔记
		
论文:Lin M, Chen Q, Yan S. Network In Network[J]. Computer Science, 2013. 参考:关于CNN中1×1卷积核和Network in N ...
 - [DeeplearningAI笔记]卷积神经网络2.5-2.7 Network in Network/1*1卷积/Inception网络/GoogleNet
		
4.2深度卷积网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Inception网络 --Szegedy C, Liu W, Jia Y, et al. Going deepe ...
 - 论文笔记 《Maxout Networks》 && 《Network In Network》
		
论文笔记 <Maxout Networks> && <Network In Network> 发表于 2014-09-22 | 1条评论 出处 maxo ...
 - Network in Network 笔记
		
传统CNN里的卷积核是一个generalized linear model(GLM)之后经过一个sigmoid(现在通常是ReLu)的非线性激励函数,假设卷积有K个filter,那么这K个filter ...
 - Hadoop学习笔记—22.Hadoop2.x环境搭建与配置
		
自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我的一个博文系列<Hadoop学习笔 ...
 
随机推荐
- 使用python脚本实现iOS图片资源压缩
			
最近公司有一个新的需求,要把代码进行瘦身,这篇博客记录下如何对图片进行压缩的. 原理: 写一个脚本,把图片文件夹'.xcassets'的所有文件遍历出来,然后使用一个第三方的算法把图片压缩后再替换回去 ...
 - Android用户点击返回按钮两次退出整个APP
			
最近的APP项目有一个需求就是连续点击两次返回按钮,退出整个APP,而不是返回到上一个页面,这个连续是有时间限制的,在我的项目里,我设置成2秒钟,如果两秒之内点击了两次,就代表用户想要退出整个APP, ...
 - 阿里云php-7.2.12 安装
			
安装依赖 yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml ...
 - CentOS安装和配置FTP
			
1.安装vsftpd #安装vsftpd yum install -y vsftpd #设置开机启动 systemctl enable vsftpd.service # 重启 service vsft ...
 - linux windows安装python的最佳方式,miniconda
			
1.在linux安装python文章很多,但是步骤很多,没搞好还会把yum命令弄坏,要修复.这件事就发生在我身上,准确说不是我造成的,是总监自己安装python造成yum损坏的,然后需要运维去百度修改 ...
 - docker应用-5(使用overlay 网络进行容器间跨物理主机通信)
			
同一个主机上的Docker容器之间通信 docker 引擎会在主机上增加一个docker0网卡,该网卡具有双重身份: 1.从容器视角,网桥(交换机)身份docker0 对于运行在同一个主机上的各个容器 ...
 - 这样使用 GPU 渲染 CSS 动画(转)
			
大多数人知道现代网络浏览器使用GPU来渲染部分网页,特别是具有动画的部分. 例如,使用transform属性的CSS动画看起来比使用left和top属性的动画更平滑. 但是如果你问,“我如何从GPU获 ...
 - a排兵布阵
			
来源hdu1166 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵 ...
 - 查询数据库中含clob,blob的表
			
查询含clob,blob的表select distinct ('TABLE "' || a.OWNER || '"."' || a.TABLE_NAME || '&quo ...
 - canvas霓虹雨
			
在codepen上看到一个Canvas做的下雨效果动画,感觉蛮有意思的.就研究了下,这里来分享下,实现技巧.效果可以见下面的链接. 霓虹雨: http://codepen.io/natewiley/f ...