Ref: 从LeNet-5看卷积神经网络CNNs

关于这篇论文的一些博文的QAC:

1. 基本原理

MLP(Multilayer Perceptron,多层感知器)是一种前向神经网络(如下图所示),相邻两层网络之间全连接。

sigmoid通常使用tanh函数和logistic函数。

1998年Yann LeCun在论文“Gradient-Based Learning Applied to Document Recognition”中提出了LeNet-5,并在字母识别中取得了很好的效果。LeNet-5的结构如下图所示:

  • input:输入图片,32*32像素;
  • C1:5*5卷积核,生成6个feature maps,共需要(6*5*5 + 6)=156个参数;
  • S2:2*2个像素相加,然后乘以一个参数,加上一个偏置,共计2*6=12个参数;
  • C3:5*5卷积核,生成16个feature maps,每个feature map由S2中若干个feature maps卷积得到,如图Table1所示;
  • S4:和S2相同的操作,共计16*2 = 32个参数;
  • C5:与S4全连接,共计(5*5*16*120+120)=48120个参数;
  • F6:与C5全连接,共计(120*84+84) = 10164 个参数;
  • output: 与F6全连接。

下面开始对各层进行具体分析。

卷积:

C1/C3/C5这三层都用了卷积操作,学过数字图像处理的同学一定对这种图像上的卷积很熟悉,本质上是用一块权重模板在图像上的各个区域做加权求和,如下图所示:

图中黄色的3*3 卷积核从图像的左上角开始向右或向下移动,对移动过程中覆盖的区域求加权和。最后得到(5-3+1)*(5-3+1)大小的卷积结果,称为一个feature map。

C1: LeNet-5的C1层用6个 5*5卷积核对输入的32*32图像进行卷积,每个卷积核对应生成一个(32-5+1)*(32-5+1)的feature map,共计6个feature map。

C3: C3的过程稍为复杂,C3总共生成了16个feature map,每个feature map按照Table1选择输入。例如C3编号为0的feature map是由S2中编号为0、1、2的feature map 生成的。先由3个卷积核分别在S2的0、1、2 feature map上生成3个临时feature map,然后把这三个临时feature map相加得到C3的feature map 0。这样构造C3 有两个好处:一是相比于全连接,可以减少参数的数量;二是每个feature map的输入都不相同,可以达到互补的效果。

C5: C5层用全连接的方式,每个feature map都是由S4中所有的feature map卷积结果求和得到的。由于S4的feature map大小是5*5,卷积核大小也是5*5,所以卷积后得到的是一个1*1的矩阵。

另外,C1/C3/C5每个feature map计算结果都会在计算结尾加上一个偏置。

池化pooling:

池化的作用主要有两个:一是减少参数数量;二是在使模型具有较好的平移不变性。

和卷积很类似,不同之处在于卷积核覆盖的区域是重叠的,而池化的各个区域是没有重叠的。所以当S2/S4用2*2的池化模板后,feature map的宽和高都减小为原来的一半。

再借用一下UFLDL Tutorial关于池化的示意图:

..

输出层:

output层/F6层都是与前一层全连接,C5-F6-output整体结构可以看成一个多层感知器。

所以LeNet-5其实是由三种不同的结构组成的:卷积、池化、多层感知器。而使用这三种结构也就可以构成大部分卷积神经网络了。

卷积:

目前几乎所有公开发表的卷积模型都使用全连接结构,即某一层(第m层)的feature map是由上一层(第m-1层)的所有feature map卷积后求和得到的。但是在实际使用中需要注意模型的参数个数,参数个数的增加对计算量的影响很大。

池化:

目前常用的是平均池化或者最大池化,即把上一层feature map的各个池化区域内的单元值求平均值或最大值。

输出层:

可以把最后一层的结果输出到某个分类器(如Logistic Regression等)进行分类。

参考资料:

[1]Yann LeCun, Gradient-Based Learning Applied to Document Recognition, 1998

[2]Theano Deeplearning Tutorial

[3]Stanford UFLDL Tutorial: http://deeplearning.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B

2. 边边角角问题

(1) 卷积核是学习得来,还是预定义好的?

整个网络的训练,主要就是为了学那个卷积核啊。

(2) 有哪些参数?

如果是卷积层输出4个feature map,那么它就有4个卷积核。
自定义的其实有卷积核的kernel_size,也就是kernel_width和kernel_height,
然后num_output就是输出的feature map个数。
还有一个数字其实也跟卷积核有关,这个卷积层的输入的channel数量.
总的来说,决定卷积层里面卷积核的参数数量的数字总共有4个:num_output, num_channel, kernel_height, kernel_width。

(3) channel是什么?
对一张RGB图像经过一个卷积核得到的是一张feature map。

原理是这样的,通常所说的2D卷积其实是3D的(卷积核的维度应该是kernel_height * kernel_height * input_channel),只不过第三个维度恰好等于输入通道的个数,所以卷了以后在第三个维度上就没了,变成了扁平的二维feature map,所以叫2D卷积。

另一种理解方式是,一个卷积核的形状是 kernel_height * kernel_height,并且有input_channel层,把它和输入图像做卷积的过程是这样的:

用卷积核的第一层 和 输入图像的第一个通道 做一次2D卷积,
用卷积核的第二层 和 输入图像的第二个通道 做一次2D卷积,
……,
用卷积核的最后一层和输入图像的最后一个通道做一次2D卷积,
于是得到了input_channel 个 feature map,最后把这input_channel 个 feature map 对应位置加起来,最后得到一张feature map,这就是卷积的结果。

卷积层的参数共享

卷积核的参数就是神经网络的输入层。

Next: [CNN] Understanding Convolution


补充:第九章 - 卷积网络

卷积运算通过三个重要的思想来帮助改进机器学习系统:

稀疏交互(sparse interactions)、 参数共享(parameter sharing)、 等变表示(equivariant representations)。

最大池化:引入了不变性。

无限强的先验:方差越大,信息越大;在决定参数最终取值时起着更加积极的作用。

也就是限制比较多,例如权重共享这样的例子,相邻关系一定强等等。

卷积边缘填充方式

零填充(有效卷积):m-k+1

必要零填充(相同卷积)

全填充:m+k-1

[CNN] What is Convolutional Neural Network的更多相关文章

  1. 卷积神经网络(Convolutional Neural Network,CNN)

    全连接神经网络(Fully connected neural network)处理图像最大的问题在于全连接层的参数太多.参数增多除了导致计算速度减慢,还很容易导致过拟合问题.所以需要一个更合理的神经网 ...

  2. 卷积神经网络(Convolutional Neural Network, CNN)简析

    目录 1 神经网络 2 卷积神经网络 2.1 局部感知 2.2 参数共享 2.3 多卷积核 2.4 Down-pooling 2.5 多层卷积 3 ImageNet-2010网络结构 4 DeepID ...

  3. 深度学习FPGA实现基础知识10(Deep Learning(深度学习)卷积神经网络(Convolutional Neural Network,CNN))

    需求说明:深度学习FPGA实现知识储备 来自:http://blog.csdn.net/stdcoutzyx/article/details/41596663 说明:图文并茂,言简意赅. 自今年七月份 ...

  4. 【转载】 卷积神经网络(Convolutional Neural Network,CNN)

    作者:wuliytTaotao 出处:https://www.cnblogs.com/wuliytTaotao/ 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,欢迎 ...

  5. Convolutional neural network (CNN) - Pytorch版

    import torch import torch.nn as nn import torchvision import torchvision.transforms as transforms # ...

  6. CNN(Convolutional Neural Network)

    CNN(Convolutional Neural Network) 卷积神经网络(简称CNN)最早可以追溯到20世纪60年代,Hubel等人通过对猫视觉皮层细胞的研究表明,大脑对外界获取的信息由多层的 ...

  7. 论文阅读(Weilin Huang——【TIP2016】Text-Attentional Convolutional Neural Network for Scene Text Detection)

    Weilin Huang--[TIP2015]Text-Attentional Convolutional Neural Network for Scene Text Detection) 目录 作者 ...

  8. Convolutional Neural Network in TensorFlow

    翻译自Build a Convolutional Neural Network using Estimators TensorFlow的layer模块提供了一个轻松构建神经网络的高端API,它提供了创 ...

  9. HYPERSPECTRAL IMAGE CLASSIFICATION USING TWOCHANNEL DEEP CONVOLUTIONAL NEURAL NETWORK阅读笔记

    HYPERSPECTRAL IMAGE CLASSIFICATION USING TWOCHANNEL  DEEP  CONVOLUTIONAL NEURAL NETWORK 论文地址:https:/ ...

随机推荐

  1. sql临时表,表变量,CTE,游标使用方法

    if OBJECT_ID('groups') is not null drop table groups create table groups ( groupid ), val int null ) ...

  2. EF code First数据迁移学习笔记

    准备工作 1.新建一个控制台项目, 在"程序包管理控制台"执行 Install-package EntityFramework  //安装EF环境 2.在项目下新建类(Paper) ...

  3. JPA和Spring-Data-JPA简介

    什么是JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.它的出现主要是为了 ...

  4. 定制应用Repeater 、ListView的模版

    若干年前有个需求:客户可在管理后台给每个新闻内容栏目指定新闻的显示样式,有的可以显示新闻时间,有的则不需要.于是就有了动态模版的应用.记得当时是用 LoadControl 的方式然后 Controls ...

  5. 【Qt开发】QThread 实用技巧、误区----但文档中没有提到

    本文主要内容: 在任务一中,用 四 种方式实现:点击界面按钮,开线程运行一段程序,结果显示在一个Label上.1. 用不正确的方式得到看似正确的结果2. 用Qt Manual 和 例子中使用的方法3. ...

  6. ADB 设置远程调试

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00016657 相信很多人在android 开发调试的时 ...

  7. 清华DNS

    DNS: 166.111.8.28 166.111.8.29 FQ方式:http://www.cnblogs.com/huangshiyu13/p/6227068.html

  8. 101 个 MySQL 的调节和优化的提示

    英文原文:101 Tips to MySQL Tuning and Optimization MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它 ...

  9. Ogre GpuProgram分析

    和前面讲解的Compositor一样,GpuProgram也对应一种资源文件,意思我们可以直接写一个文件来完成,不需要了解相关的类. 但是就和winform一样,直接拖控件能完成大部分工作,假如如果需 ...

  10. python-切片实例

    针对list或tuple取指定范围的操作.可以使用切片(slice),非常有用 1.list:可变数组 L=['a','b','c','d','e'] >>> L[0:3] #从第0 ...