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. SAP 生产订单变更管理 OCM Order Changement Management

    SAP OCM Order Changement Management  一.目的 订单变更管理系统是当我们的订单(生产订单.计划订单.采购订单)已经存在的时候,其物料主数据或销售数据有变更时,我们可 ...

  2. react文档demo实现输入展示搜索结果列表

    文档页面地址:https://doc.react-china.org/docs/thinking-in-react.html 该文档只给了具体实现思路,下面是我实现的代码. 初学react,如果有写的 ...

  3. iOS - UITableView中有两种重用Cell的方法

    UITableView中有两种重用Cell的方法: - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; - (id)dequ ...

  4. python 算术运算

    1. 算术运算符与优先级 # -*- coding:utf-8 -*- # 运算符含有+,-,*,/,**,//,% # ** 表示^ , 也就是次方 a = 2 ** 4 print '2 ** 4 ...

  5. Java中的堆内存设置对线程创建数的影响以及-Xss参数的记录

    Java的线程对象是存储在堆上的,所以,能够创建多少个线程,受到堆空间的大小限制,同时也受到每个线程的大小的限制,假如线程对象内部有一个非常大的数组字段,那就非常影响能够创建的线程的大小 我们的例子: ...

  6. linux基础操作1

    date #查看日期cal #查看当月日历cal 2017 #查看某年全年的日历whoami #查看当前登录的用户 #修改网卡,可以上网的步骤vi /etc/sysconfig/network-scr ...

  7. python 写入Excel

     一.安装xlrd模块: 1.mac下打开终端输入命令: pip install XlsxWriter 2.验证安装是否成功: 在mac终端输入 python  进入python环境 然后输入 imp ...

  8. maven如何单独启动插件目标

    说来恼火,在网上找了半天没找到 原来插件名称其实不需要定义而是直接想象到的,如下,我尝试过了好几种 mvn plugin:goal 都没成功:从代码看goal已经没啥疑问了,就是compile,但哪个 ...

  9. NYOJ - 矩形嵌套(经典dp)

    矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...

  10. java awt 中文乱码 显示为 方块

    今天调试同学的五子棋程序,同学的界面是用awt写的,运行的时候,发现菜单栏中的中文都无法正常显示,而是变为了一个个方框, 类似于这样:(图片来源于网络) 即使做了字体设置,比如设置为宋体,也还是无法正 ...