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层每张特征图的计算公式如下:

一般来说mlp是一个三层的网络结构。
下面是一个单层的mlpconv网络的caffe网络结构文件,源码来自于:https://gist.github.com/mavenlin/d802a5849de39225bcc6 :
  1.  
    <span style="font-size:18px;">layers {
  2.  
    bottom: "data"
  3.  
    top: "conv1"
  4.  
    name: "conv1"
  5.  
    type: CONVOLUTION
  6.  
    blobs_lr: 1
  7.  
    blobs_lr: 2
  8.  
    weight_decay: 1
  9.  
    weight_decay: 0
  10.  
    convolution_param {
  11.  
    num_output: 96
  12.  
    kernel_size: 11
  13.  
    stride: 4
  14.  
    weight_filler {
  15.  
    type: "gaussian"
  16.  
    mean: 0
  17.  
    std: 0.01
  18.  
    }
  19.  
    bias_filler {
  20.  
    type: "constant"
  21.  
    value: 0
  22.  
    }
  23.  
    }
  24.  
    }
  25.  
    layers {
  26.  
    bottom: "conv1"
  27.  
    top: "conv1"
  28.  
    name: "relu0"
  29.  
    type: RELU
  30.  
    }
  31.  
    layers {
  32.  
    bottom: "conv1"
  33.  
    top: "cccp1"
  34.  
    name: "cccp1"
  35.  
    type: CONVOLUTION
  36.  
    blobs_lr: 1
  37.  
    blobs_lr: 2
  38.  
    weight_decay: 1
  39.  
    weight_decay: 0
  40.  
    convolution_param {
  41.  
    num_output: 96
  42.  
    kernel_size: 1
  43.  
    stride: 1
  44.  
    weight_filler {
  45.  
    type: "gaussian"
  46.  
    mean: 0
  47.  
    std: 0.05
  48.  
    }
  49.  
    bias_filler {
  50.  
    type: "constant"
  51.  
    value: 0
  52.  
    }
  53.  
    }
  54.  
    }
  55.  
    layers {
  56.  
    bottom: "cccp1"
  57.  
    top: "cccp1"
  58.  
    name: "relu1"
  59.  
    type: RELU
  60.  
    }
  61.  
    layers {
  62.  
    bottom: "cccp1"
  63.  
    top: "cccp2"
  64.  
    name: "cccp2"
  65.  
    type: CONVOLUTION
  66.  
    blobs_lr: 1
  67.  
    blobs_lr: 2
  68.  
    weight_decay: 1
  69.  
    weight_decay: 0
  70.  
    convolution_param {
  71.  
    num_output: 96
  72.  
    kernel_size: 1
  73.  
    stride: 1
  74.  
    weight_filler {
  75.  
    type: "gaussian"
  76.  
    mean: 0
  77.  
    std: 0.05
  78.  
    }
  79.  
    bias_filler {
  80.  
    type: "constant"
  81.  
    value: 0
  82.  
    }
  83.  
    }
  84.  
    }
  85.  
    layers {
  86.  
    bottom: "cccp2"
  87.  
    top: "cccp2"
  88.  
    name: "relu2"
  89.  
    type: RELU
  90.  
    }
  91.  
    </span>
三、全局均值池化(文献创新点2)

传统的卷积神经网络卷积运算一般是出现在低层网络。对于分类问题,最后一个卷积层的特征图通过量化然后与全连接层连接,最后在接一个softmax逻辑回归分类层。这种网络结构,使得卷积层和传统的神经网络层连接在一起。我们可以把卷积层看做是特征提取器,然后得到的特征再用传统的神经网络进行分类。

然而,全连接层因为参数个数太多,往往容易出现过拟合的现象,导致网络的泛化能力不尽人意。于是Hinton采用了Dropout的方法,来提高网络的泛化能力。

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

  1.  
    layers {
  2.  
    bottom: "cccp7"
  3.  
    top: "cccp8"
  4.  
    name: "cccp8-1024"
  5.  
    type: CONVOLUTION
  6.  
    blobs_lr: 1
  7.  
    blobs_lr: 2
  8.  
    weight_decay: 1
  9.  
    weight_decay: 0
  10.  
    convolution_param {
  11.  
    num_output: 1000
  12.  
    kernel_size: 1
  13.  
    stride: 1
  14.  
    weight_filler {
  15.  
    type: "gaussian"
  16.  
    mean: 0
  17.  
    std: 0.01
  18.  
    }
  19.  
    bias_filler {
  20.  
    type: "constant"
  21.  
    value: 0
  22.  
    }
  23.  
    }
  24.  
    }
  25.  
     

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

  1.  
    layers {
  2.  
    bottom: "cccp8"
  3.  
    top: "pool4"
  4.  
    name: "pool4"
  5.  
    type: POOLING
  6.  
    pooling_param {
  7.  
    pool: AVE
  8.  
    kernel_size: 6
  9.  
    stride: 1
  10.  
    }
  11.  
    }
  12.  
     

因为在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学习笔记的更多相关文章

  1. ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)

    ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...

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

    深度学习(二十六)Network In Network学习笔记 Network In Network学习笔记 原文地址:http://blog.csdn.net/hjimce/article/deta ...

  3. Andrew's Blog / 《Network Programming with Go》学习笔记

    第一章: Architecture(体系结构) Protocol Layers(协议层) ISO OSI Protocol 每层的功能: 网络层提供交换及路由技术 传输层提供了终端系统之间的数据透明传 ...

  4. 转载:Network In Network学习笔记

    转载原文1:http://blog.csdn.net/hjimce/article/details/50458190 转载原文2:http://blog.csdn.net/mounty_fsc/art ...

  5. 论文《Network in Network》笔记

    论文:Lin M, Chen Q, Yan S. Network In Network[J]. Computer Science, 2013. 参考:关于CNN中1×1卷积核和Network in N ...

  6. [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 ...

  7. 论文笔记 《Maxout Networks》 && 《Network In Network》

    论文笔记 <Maxout Networks> && <Network In Network> 发表于 2014-09-22   |   1条评论 出处 maxo ...

  8. Network in Network 笔记

    传统CNN里的卷积核是一个generalized linear model(GLM)之后经过一个sigmoid(现在通常是ReLu)的非线性激励函数,假设卷积有K个filter,那么这K个filter ...

  9. Hadoop学习笔记—22.Hadoop2.x环境搭建与配置

    自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我的一个博文系列<Hadoop学习笔 ...

随机推荐

  1. C#.net mysql There is already an open datareader associated with this command引发的问题

    [参考]There is already an open datareader associated with this command引发的问题 我在语句中并未使用 DataReader,未何也提示 ...

  2. 解决使用微软模拟器VS Emulator for Android在VS2017 Xamarin开发中不能调试程序的问题。

    在使用VS2017 XAMARIN调试Android应用程序时,屏幕闪一下,进入不了调试(使用谷歌的模拟器可以调试,但是太慢), 我们现在来解决一下这个问题. 第一步:打开Hyper-V管理器 第二步 ...

  3. eclipse 查看变量或方法在什么地方被调用的快捷键和快速显示方法入参提示信息

    为了用eclipse写代码的时候,不用方向键移动光标,可以设置如下快捷键, Line Up:Alt+i   光标向上 Line Down:Alt+k 光标向下 Line Start:Alt+u  移到 ...

  4. Linux (OpenBSD)系统目录分析

    IER(7)                    OpenBSD Reference Manual                    HIER(7) NAME      hier - layou ...

  5. 转 .NET4.5之初识async与await

    来自:http://www.cnblogs.com/lekko/archive/2013/03/05/2944282.html 本人是从.NET4.0刚出的时候接触的.NET环境,所以学的东西就是4. ...

  6. 从0移植uboot (四) _点亮调试LED

    这一节主要讨论1个问题:点灯.点灯是实际开发中,特别是裸板开发中常见的调试手段,相当于主机开发中漫天飞舞的printf/printk.为了追踪程序的现场执行情况,很多时候我们都使用点一个灯的方法来进行 ...

  7. C# 服务端篇之实现RestFul Service开发(简单实用)

    一.RestFul简介 REST(Representational State Transfer 通常被翻译为“表述性状态传输”或者“表述性状态转移”)是RoyFielding提出的一个描述互联系统架 ...

  8. hibernate源码分析1

  9. Java正则表达式使用 | 叠加

    public class Test { public static void main(String[] args) { String s = "ni\nhao\nma he yi\nyon ...

  10. 查询数据库中含clob,blob的表

    查询含clob,blob的表select distinct ('TABLE "' || a.OWNER || '"."' || a.TABLE_NAME || '&quo ...