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 :
[python] view plaincopy
  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》网络的源码,倒数一层的网络相关参数:

[python] view plaincopy
  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. }

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

[python] view plaincopy
  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. }

因为在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》

**********************作者:hjimce   时间:2016.1.4  联系QQ:1393852684   地址:http://blog.csdn.net/hjimce   原创文章,版权所有,转载请保留本行信息(不允许删除)

深度学习(二十六)Network In Network学习笔记-ICLR 2014相关推荐

  1. 知识图谱论文阅读(八)【转】推荐系统遇上深度学习(二十六)--知识图谱与推荐系统结合之DKN模型原理及实现

    学习的博客: 推荐系统遇上深度学习(二十六)–知识图谱与推荐系统结合之DKN模型原理及实现 知识图谱特征学习的模型分类汇总 知识图谱嵌入(KGE):方法和应用的综述 论文: Knowledge Gra ...

  2. C1认证学习二十六(基础选择器)

    C1认证学习二十六(基础选择器) 任务背景 CSS选择器是CSS规则的一部分,用来指定需要设置的样式的HTML元素,通过选择器可以实现CSS对HTML元素一对一或者一对多或者多对一的控制了啦. 任务目 ...

  3. 推荐系统遇上深度学习(二十六)--知识图谱与推荐系统结合之DKN模型原理及实现

    作者:石晓文 Python爱好者社区专栏作者个人公众号:小小挖掘机 添加微信sxw2251,可以拉你进入小小挖掘机技术交流群哟!博客专栏:wenwen 在本系列的上一篇中,我们大致介绍了一下知识图谱在 ...

  4. 二十六个月Android学习工作总结

    零零碎碎的总结 1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍. 2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该功能的运行过程写出来. 3.要有自己 ...

  5. JavaWeb学习 (二十六)————监听器(Listener)学习(二)

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  6. opencv学习(二十六)之图像金字塔(高斯金字塔、拉普拉斯金字塔)

    在进行数字图像处理时,我们可能会需要将某种尺寸的图像转换为其他尺寸的图像,这样会存在放大图像核缩小图像两种可能.opencv提供了一个真正意义上的图像所方函数resize(),但在本篇中主要学习以下使 ...

  7. Go学习(二十六):MD5,Sha1,Base64的使用

    1.生成Md5 package mainimport ( "crypto/md5" "fmt" "io")func main() { str ...

  8. Java多线程学习二十六:原子类是如何利用 CAS 保证线程安全的?

    什么是原子类,以及它有什么作用. 在编程领域里,原子性意味着"一组操作要么全都操作成功,要么全都失败,不能只操作成功其中的一部分".而 java.util.concurrent.a ...

  9. ballerina 学习二十六 项目docker 部署 运行(二)

    ballerina 从发布,到现在官方文档的更新也是很给力的,同时也有好多改进,越来越好用了 可以参考官方文档 https://ballerina.io/learn/by-guide/restful- ...

  10. 无人驾驶汽车系统入门(二十六)——基于深度学习的实时激光雷达点云目标检测及ROS实现

    无人驾驶汽车系统入门(二十六)--基于深度学习的实时激光雷达点云目标检测及ROS实现 在前两篇文章中,我们使用PCL实现了在点云中对地面的过滤和点云的分割聚类,通常来说,在这两步以后我们将对分割出来的 ...

最新文章

  1. 在CentOS 6.3 64bit上搭建python高性能框架gevent开发环境
  2. ios关于用xib创建的cell 自动返回cell的高度问题!
  3. springboot 创建地址_手把手教你Spring Boot入门开发
  4. Thymeleaf介绍
  5. YYModel 源码解读(二)之YYClassInfo.h (1)
  6. ViewController类中得方法和属性的用途
  7. [转载] 杜拉拉升职记——06 预算与排期
  8. facebook 邀请好友_如何在Facebook上与某人解除好友
  9. 基于Maven的spring_security入门
  10. 树莓派的ssh远程登录操作(图文)
  11. 剑指offer面试题[24]-二插搜索树的后序遍历序列
  12. [Swift]LeetCode198. 打家劫舍 | House Robber
  13. js高程读书笔记(1-3章)
  14. Windows timeout命令
  15. 读《解忧杂货店》有感
  16. cocos2dx 3.10 功夫小子学习笔记
  17. 【报错】安装scrapy时Could not build wheels for cryptography which use PEP 517 and cannot be installed direc
  18. 蓝海彤翔执行副总裁张加廷接受【联播苏州】独家专访
  19. matplotlib 库画云图两种方法
  20. 全球变暖,人类何去何从?

热门文章

  1. Spring Cloud【Finchley】实战-01注册中心及商品微服务
  2. 实战SSM_O2O商铺_06logback配置与使用
  3. Spring-AOP @AspectJ切点函数之within()
  4. 顺序表的应用——逆置问题
  5. python判断字符是否为数字或字母
  6. hadoop 文本统计一个字符的个数_使用hadoop统计多个文本中每个单词数目
  7. 苹果截屏快捷键_新手小白用苹果电脑搞科研,学会这些才不至于尴尬!
  8. SpringSecurity快速入门
  9. 树莓派上操作环境安装配置
  10. linux安装virtualbox命令,在Linux中从命令行查找Virtualbox Version的方法