【深度学习】经典卷积神经网络结构说明

前言

  20世纪 90年代,LeCun et al.等人发表一篇关于手写数字识别的论文 【论文PDF下载】,论文中使用的网络结果如下:

【深度学习】经典卷积神经网络结构说明_第1张图片

  • 此网络结构认为是卷积神经网络的开山鼻祖,也确立了CNN的现代结构
  • 后来他们又对其进行完善,设计了一种多层的人工神经网络,取名叫做 LeNet-5【论文PDF下载】,可以对手写数字做分类
  • CNN能够得出原始图像的有效表征,这使得CNN能够直接从原始像素中,经过极少的预处理,识别视觉上面的规律。然而,由于当时缺乏大规模训练数据,计算机的计算能力也跟不上,LeNet-5对于复杂问题的处理结果并不理想

  之后,人们设计了很多方法,想要克服难以训练深度CNN的困难。其中,最著名的是2012年Krizhevsky et al.提出了一个经典的CNN结构,并在图像识别任务上取得了重大突破。其方法的整体框架叫做 AlexNet 【论文PDF下载】,与 LeNet-5 类似,但层次结构上要更加深一些。同时使用了非线性激活函数ReLU与Dropout方法,取得了卓越的效果。

  AlexNet大获成功,掀起了卷积神经网络的研究热潮。在这之后,研究人员又提出了其他的改善方法,其中最著名的要数 ZFNet【论文PDF下载】、VGGNet【论文PDF下载】、GoogleNet 【论文PDF下载】和 ResNet 【论文PDF下载】这四种,对比:

【深度学习】经典卷积神经网络结构说明_第2张图片

上图可以看出:

  • 在网络结构上,CNN发展的一个方向就是层数变得更多
  • 在模型效果上,ILSVRC 2015冠军 ResNetAlexNet 的20多倍,是 VGGNet 的8倍多

  通过增加网络结构深度,网络便能够利用增加的非线性得出目标函数的近似结构,同时得出更好的特性表征。但是,这样做同时也增加了网络的整体复杂程度,使网络变得难以优化,很容易过拟合,针对这一问题,研究人员也提出了很多种方法,本篇主题不在此,就展开了。

  本篇主要是介绍经典卷积神经网络的结构,接下来我们逐一介绍,这里我们先给出经典卷积神经网络满足的基本网络结构构成规律:

  • 输入层
  • 卷积+激励(卷积层):一般我们说卷积层,里面都包含了激励
  • 池化层
  • 全连接层

【深度学习】经典卷积神经网络结构说明_第3张图片

一、LeNet5

  LeNet-5 模型诞生于1998年,它是第一个成功应用于手写数字识别问题的卷积神经网络,它包含了深度学习的基本模块:卷积层,池化层,全连接层。网络结构如下图:

【深度学习】经典卷积神经网络结构说明_第4张图片

上图可以看出,LeNet5一共有7层网络(输入层不算),分别是:

  • 卷积层+池化层+卷积层+池化层+卷积层+全连接层+输出层
  • 3层卷积、2层池化、1层全连接、1层输出
  • 输入图像大小为: 32 × 32 32 \times 32 32×32

1、C1(第一个卷积层)

卷积+激励
input(输入) 1 * 32 * 32
filter(卷积核大小) 1 * 5 * 5
stripe(步幅) 1
padding(填充) 0
filter size / depth(卷积核个数) 6
output(输出) 6 * 28 * 28
神经元数目 6 * 28 * 28
参数个数(加偏置) (1 * 5 * 5 + 1) * 6 = 156
连接方式 普通的卷积连接方式

输出大小计算公式:

设输入大小为 ( H , W ) (H,W) (H,W),卷积核大小为 ( F H , F W ) (FH,FW) (FH,FW),输出大小为 ( O H , O W ) (OH,OW) (OH,OW),填充为 P P P,步幅为 S S S,此时:

O H = H + 2 P − F H + S S = 32 − 5 + 1 1 = 28 OH = \frac{H + 2P - FH + S}{S}=\frac{32 - 5 + 1}{1} = 28 OH=SH+2PFH+S=1325+1=28

O W = H + 2 P − F W + S S = 32 − 5 + 1 1 = 28 OW = \frac{H + 2P - FW+S}{S}=\frac{32 - 5 + 1}{1} = 28 OW=SH+2PFW+S=1325+1=28

第一层卷积使用了6个卷积核,用6个卷积核分别与输入图像进行卷积操作,因此得到6个形状为 28 ∗ 28 28 * 28 2828 特征图

2、S1(第一个池化层)

  第一个池化层,输入上一层卷积层的输出, 6 ∗ 28 ∗ 28 6 * 28 * 28 62828,进行池化操作,池化可以降低参数量,降低过拟合的可能。

  和max poolingaverage pooling 不一样,在 LeNet5 的S2层中每个单元的4个输入相加,乘以一个可训练参数w,再加上一个可训练偏置b,结果通过sigmoid 函数计算得到最终池化之后的值。

池化
input(输入) 6 * 28 * 28
filter(池化大小) 2 * 2
stripe(步幅) 2
padding(填充) 0
output(输出) 6 * 14 * 14
神经元数目 6 * 14 * 14
参数个数(加偏置) 2 * 6 = 12
连接方式 特殊池化方式

通常池化操作,如max poolingaverage pooling ,是无需训练参数的

3、C3(第二个卷积层)

卷积+激励
input(输入) 6 * 14 * 14
filter(卷积核大小) 6 * 5 * 5
stripe(步幅) 1
padding(填充) 0
filter size / depth(卷积核个数) 16
output(输出) 16 * 10 * 10
神经元数目 16 * 10 * 10
参数个数(加偏置) ( 3 * 5 * 5 +1 ) * 6 + ( 4 * 5 * 5 + 1 ) * 9 + ( 6 * 5 * 5 + 1 ) * 1 = 1516
连接方式 卷积操作的变种

这里参数个数的计算方式与卷积操作相关,所以我们需要先知道它是怎么做卷积的

传统卷积过程:

http://cs231n.github.io/assets/conv-demo/index.html

【深度学习】经典卷积神经网络结构说明_第5张图片

上图

  • 输入大小为 :3 * 5 * 5
  • 卷积核大小:3 * 3 * 3
  • 卷积核个数:2
o1 02
input1 x x
input2 x x
input3 x x
卷积核1 卷积核2

上表表示,每个卷积核的每个通道与输入数据的对应通道都计算卷积操作

变种卷积:

o1 o2 o3 o4 o5 o6 o7 o8 o9 o10 o11 o12 o13 o14 o15 o16
input1 x x x x x x x x x x
input2 x x x x x x x x x x
input3 x x x x x x x x x x
input4 x x x x x x x x x x
input5 x x x x x x x x x x
input6 x x x x x x x x x x

最终输出的16个fetaure map中:

  • 对应的前六个卷积核是和s2中输出的六个feature map中的任意3个feature map做卷积
  • 中间九个卷积核是和s2中输出的六个feature map中的任意4个feature map做卷积
  • 最后一个卷积核是和六个feature map做卷积

参数个数:
( 3 ∗ 5 ∗ 5 + 1 ) ∗ 6 + ( 4 ∗ 5 ∗ 5 + 1 ) ∗ 9 + ( 6 ∗ 5 ∗ 5 + 1 ) ∗ 1 = 1516 (3*5*5+1)*6+(4*5*5+1)*9+(6*5*5+1)*1=1516 (355+1)6+(455+1)9+(655+1)1=1516

好处:

  1. 不需要使用全部的feature map,这样有连接的feature map的连接数/参数数量可以保持在一定范围,直白来讲:相对于传统的卷积操作,降低了网络的参数数据量
  2. 可以打破网络的对称结构,不同的卷积核可以得到不同的特征信息

4、S4(第二个池化层)

和第一个池化层S2一样

池化
input(输入) 16 * 10 * 10
filter(池化大小) 2 * 2
stripe(步幅) 2
padding(填充) 0
output(输出) 16 * 5 * 5
神经元数目 16 * 5 * 5
参数个数(加偏置) 2 * 6 = 12
连接方式 特殊池化方式

5、C5(第三个卷积层)

卷积+激励
input(输入) 16 * 5 * 5
filter(卷积核大小) 16 * 5 * 5
stripe(步幅) 1
padding(填充) 0
filter size / depth(卷积核个数) 120
output(输出) 120 * 1 *1
神经元数目 120 * 1 *1
参数个数(加偏置) (16 * 5 * 5 + 1) * 120 = 48120
连接方式 普通的卷积连接方式

6、F6(全连接层)

  F6层计算输入向量和权重向量之间的点积,再加上一个偏置(wx+b),最后将加权值做一个 sigmoid 转换

全连接
input(输入) 120
output(输出) 84
神经元数目 84
参数个数(加偏置) (120 + 1) * 84 = 10164

这里选择84作为神经元的数目从论文中可以认为是:ASCII字符标准的打印字符,是用712大小的位图,这里希望每一维特征分别体现标准712大小位图上每一个像素点的特性。

7、输出层

  输出层是由欧式径向基函数(RBF)组成。每一个输出对应一个RBF函数,每一个RBF函数都有84维的输入向量,RBF的函数公式如下。每一个RBF函数都会有一个输出,最后输出层会输出一个10维的向量。

y i = ∑ j ( x j − w i j ) 2 y_i = \sum_j(x_j-w_{ij})^2 yi=j(xjwij)2

输出层
input(输入) 84
output(输出) 10
神经元数目 10
参数个数 84 * 10 = 840

8、LeNet5 一些性质:

  • 如果输入层不算神经网络的层数,那么 LeNet5 是一个 7 层的网络
  • LeNet5大约有六万多个参数
  • 随着网络越来越深,图像的高度和宽度在缩小,与此同时,图像的 channel 数量一直在增加。
  • 现在常用的LeNet5 结构和论文中提出的结构在某些地方有区别,比如激活函数的使用,现在一般使用 ReLU 作为激活函数,输出层一般选择 softmax

二、AlexNet

  LeNet 提出并成功地应用手写数字识别,但是很快,CNN的锋芒被SVM和手工设计的局部特征所掩盖。2012年,AlexNet 在 ImageNet 图像分类任务竞赛中获得冠军,一鸣惊人,从此开创了深度神经网络空前的高潮。

网络结构如下:

【深度学习】经典卷积神经网络结构说明_第6张图片

AlexNet结构优化:

  • 非线性激活函数:ReLU,成功解决了Sigmoid在网络较深时的梯度弥散问题
  • 使用Max Pooling,并且提出池化核和步长,使池化核之间存在重叠,提升了特征的丰富性,也避免了平均池化的模糊化效果
  • 防止过拟合的方法:Dropout,Data augmentation(数据增强)
  • 大数据训练:百万级ImageNet图像数据
  • GPU实现:利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算,在每个GPU中放置一半核(或神经元),还有一个额外的技巧:GPU间的通讯只在某些层进行
  • LRN归一化:对局部神经元的活动创建了竞争机制,使得其中响应比较大的值变得相对更大,并抑制其它反馈较小的神经元,增强了模型的泛化能力。本质上,LRN是仿造生物学上活跃的神经元对于相邻神经元的抑制现象(侧抑制)
  • 主要是对ReLU激活函数的输出进行局部归一化操作,公式如下:
    b x , y i = a x , y i ( k + α ∑ j = m a x ( 0 , i − n / 2 ) m i n ( N − 1 , i + n / 2 ) ( a x , y j ) 2 ) β b_{x,y}^i=\frac{a_{x,y}^i}{\Big(k + \alpha\sum_{j=max(0, i-n/2)}^{min(N-1,i+n/2)}(a_{x,y}^j)^2\Big)^{\beta}} bx,yi=(k+αj=max(0,in/2)min(N1,i+n/2)(ax,yj)2)βax,yi
  • 其中a表示第i个卷积核在(x,y)坐标位置经过激活函数的输出值,这个式子的含义就是输出一个值和它前后的n个值做标准化
  • k、n、α、β是超参数,在AlexNet网络中分别为:2、5、10^-4、0.75,N为卷积核总数

图像处理:

  • 随机的剪切,将 256 * 256 的图片剪切成为 224 * 224 的图片
  • 对 224 * 224 的图像做了一些旋转和位置变换
  • 对 224 * 224 的图像做了一个图像大小的扩大,变成227*227的图片

备注:实际输入AlexNet网络的图片是一个 227 * 227 * 3 的图片信息

1、L0(输入层)

输入层
input 227 * 227 * 3
output 227 * 227 * 3

2、L1(第一层卷积层)

卷积+激励
input(输入) 227 * 227 * 3
filter(卷积核大小) 3 * 11 * 11
stripe(步幅) 4
padding(填充) 0
filter size / depth(卷积核个数) 48 * 2
output(输出) 55 * 55 * 48 * 2
神经元数目 55 * 55 * 48 * 2
参数个数(加偏置) (3 * 11 * 11 + 1) * 48 * 2 = 34944
连接方式 使用双GPU来进行卷积操作,这个卷积操作和普通卷积一样
  • 两个GPU并行的进行卷积操作,每个GPU只负责其中48个卷积核的计算
  • 效果:可以并行的计算模型,模型执行效率可以得到提升
  • 并且将GPU之间的通信放到网络结构偏后的位置,可以降低信号传输的损耗

3、L2(第一层最大池化层)

最大池化
input(输入) 55 * 55 * 48 * 2
filter(池化大小) 3 * 3
stripe(步幅) 2
padding(填充) 0
output(输出) 27 * 27 * 48 * 2
参数个数0 0
连接方式 普通的最大池化方式

使用了最大池化,和 LeNet5 中的池化不一样,这里没有需要训练的参数

4、L3(第二层卷积层)

卷积+激励
input(输入) 27 * 27 * 48 * 2
filter(卷积核大小) 5 * 5 * 48
stripe(步幅) 1
padding(填充) 2(上下左右各加2个像素)
filter size / depth(卷积核个数) 128 * 2
output(输出) 27 * 27 * 128 * 2
神经元数目 27 * 27 * 128 * 2
参数个数(加偏置) (5 * 5 * 48 + 1) * 128 * 2 = 307456
连接方式 每个GPU中对应各自的48个feature map进行卷积过程,和普通卷积一样

5、L4(第二层最大池化层)

最大池化
input(输入) 27 * 27 * 128 * 2
filter(池化大小) 3 * 3
stripe(步幅) 2
padding(填充) 0
output(输出) 13 * 13 * 128 * 2
参数个数0 0
连接方式 普通的最大池化方式

6、L5(第三层卷积层)

卷积+激励
input(输入) 13 * 13 * 128 * 2
filter(卷积核大小) 3 * 3 * 256
stripe(步幅) 1
padding(填充) 2(上下左右各加2个像素)
filter size / depth(卷积核个数) 192 * 2
output(输出) 13 * 13 * 192 * 2
神经元数目 13 * 13 * 192 * 2
参数个数(加偏置) (3 * 3 * 256 + 1) * 192 * 2 = 885120
连接方式 将两个GPU中的256个feature map一起做卷积过程

7、L6(第四层卷积层)

卷积+激励
input(输入) 13 * 13 * 192 * 2
filter(卷积核大小) 3 * 3 * 192
stripe(步幅) 1
padding(填充) 2(上下左右各加2个像素)
filter size / depth(卷积核个数) 192 * 2
output(输出) 13 * 13 * 192 * 2
神经元数目 13 * 13 * 192 * 2
参数个数(加偏置) (3 * 3 * 192 + 1) * 192 * 2 = 663936
连接方式 每个GPU中对应各自的48个feature map进行卷积过程,和普通卷积一样

8、L7(第五层卷积层)

卷积+激励
input(输入) 13 * 13 * 192 * 2
filter(卷积核大小) 3 * 3 * 192
stripe(步幅) 1
padding(填充) 2(上下左右各加2个像素)
filter size / depth(卷积核个数) 128 * 2
output(输出) 13 * 13 * 128 * 2
神经元数目 13 * 13 * 128 * 2
参数个数(加偏置) (3 * 3 * 192 + 1) * 128 * 2 = 442624
连接方式 每个GPU中对应各自的48个feature map进行卷积过程,和普通卷积一样

9、L8(第三层最大池化层)

最大池化
input(输入) 13 * 13 * 128 * 2
filter(池化大小) 3 * 3
stripe(步幅) 2
padding(填充) 0
output(输出) 6 * 6 * 128 * 2
参数个数0 0
连接方式 普通的最大池化方式

10、L9(全连接+激励)

全连接层
input 6 * 6 * 128 * 2 = 9216
output 2048 * 2
参数个数 9216 * 2048 * 2 = 37748736

11、L10(全连接+激励)

全连接层
input 2048 * 2 = 4096
output 2048 * 2
参数个数 4096 * 4096 = 16777216

12、L11(全连接+激励)

全连接层
input 4096
output 1000
参数个数 4096 * 1000 = 4096000

如果将卷积层+池化层算作一层,那么该网络 除去输入层有8层。

三、ZFNet

  2013年冠军,整体架构和AlexNet很像,错误率为11.2%,也是一个8层的网络。

  ZFNet 模型是在 AlexNet 基础上进行改动,网络结构上并没有太大的突破。差异表现在,AlexNet是用两块GPU的稀疏连接结构,而ZFNet 只用了一块GPU的稠密链接结构;改变了 AleNet 的第一层,将过滤器的大小由 11 ∗ 11 11 * 11 1111变成 7 ∗ 7 7 * 7 77,并且将步长由4变成2,使用更小的卷积核和步长,保留更多特征。

网络结构如下:
【深度学习】经典卷积神经网络结构说明_第7张图片

AlexNet 一样,在数据输入到神经网络之前,进行了一些相关的图像处理,比如:数据增强相关操作。

1、L0(输入层)

输入层
input 225 * 225 * 3
output 225 * 225 * 3

2、L1(第一层卷积层+池化)

卷积+激励
input(输入) 225 * 225 * 3
filter(卷积核大小) 7 * 7 * 3
stripe(步幅) 2
padding(填充) 0
filter size / depth(卷积核个数) 96
output(输出) 110 * 110 * 96
神经元数目 110 * 110 * 96
参数个数(加偏置) (3 * 7 * 7 + 1) * 96 = 14208
连接方式 普通卷积

最大池化
input(输入) 110 * 110 * 96
filter(池化大小) 3 * 3
stripe(步幅) 2
padding(填充) (0,1,1,0) => (上,下,左,右)
output(输出) 55 * 55 * 96
参数个数0 0
连接方式 普通的最大池化方式

3、L2(第二层卷积层+池化)

卷积+激励
input(输入) 55 * 55 * 96
filter(卷积核大小) 5 * 5 * 96
stripe(步幅) 2
padding(填充) 0
filter size / depth(卷积核个数) 256
output(输出) 26 * 26 * 256
神经元数目 26 * 26 * 256
参数个数(加偏置) (5 * 5 * 96 + 1) * 256 = 614656
连接方式 普通卷积

最大池化
input(输入) 26 * 26 * 256
filter(池化大小) 3 * 3
stripe(步幅) 2
padding(填充) 1
output(输出) 13 * 13 * 256
参数个数0 0
连接方式 普通的最大池化方式

4、L3(第三层卷积层)

卷积+激励
input(输入) 13 * 13 * 256
filter(卷积核大小) 3 * 3 * 256
stripe(步幅) 1
padding(填充) (1,1,1,1)
filter size / depth(卷积核个数) 384
output(输出) 13 * 13 * 384
神经元数目 13 * 13 * 384
参数个数(加偏置) (3 * 3 * 256 + 1) * 384 = 885120
连接方式 普通卷积

5、L4(第四层卷积层)

卷积+激励
input(输入) 13 * 13 * 384
filter(卷积核大小) 3 * 3 * 384
stripe(步幅) 1
padding(填充) (1,1,1,1)
filter size / depth(卷积核个数) 384
output(输出) 13 * 13 * 384
神经元数目 13 * 13 * 384
参数个数(加偏置) (3 * 3 * 384+ 1) * 384 = 1327488
连接方式 普通卷积

6、L5(第二层卷积层+池化)

卷积+激励
input(输入) 13 * 13 * 384
filter(卷积核大小) 3 * 3 * 384
stripe(步幅) 1
padding(填充) (1,1,1,1)
filter size / depth(卷积核个数) 256
output(输出) 13 * 13 * 256
神经元数目 13 * 13 * 256
参数个数(加偏置) (3 * 3 * 384 + 1) * 256 = 884992
连接方式 普通卷积

最大池化
input(输入) 13 * 13 * 256
filter(池化大小) 3 * 3
stripe(步幅) 2
padding(填充) 0
output(输出) 6 * 6 * 256
参数个数0 0
连接方式 普通的最大池化方式

7、L6(全连接+激励)

全连接层
input 6 * 6 * 256 = 9216
output 2048 * 2 = 4096
参数个数 (6 * 6 * 256 + 1) * 4096 = 37752832

8、L7(全连接+激励)

全连接层
input 4096
output 4096
参数个数 (4096 + 1) * 4096 = 16781312

9、L8(softmax)

softmax
input 4096
output class
参数个数 (4096 + 1) * class

四、VGGNet

  2014年识别任务亚军,定位任务冠军。构建了11~19层的深层网络,分类错误率达到了7.3%,适合做迁移学习。

  VGGNet 全部使用了 3 ∗ 3 3 * 3 33 的卷积核和 2 ∗ 2 2 * 2 22 最大池化核通过不断加深网络结构来提神性能。采用堆积的小卷积核优于采用大的卷积核,因为多层非线性层可以增加网络深层来保证学习更复杂的模式,而且所需的参数还比较少。

网络结构如下:

【深度学习】经典卷积神经网络结构说明_第8张图片
  可以看到VGG-D使用了一种块结构:多次重复使用统一大小的卷积核来提取更复杂和更具有表达性的特征。VGG系列中,最多使用是VGG-16。在VGG-16 的第三、四、五块:256、512、512个过滤器依次用来提取复杂的特征,其效果就等于一个带有3个卷积层的大型512*512大分类器。

VGG-16:

【深度学习】经典卷积神经网络结构说明_第9张图片

VGGNet网络结构特点:

  • 抛弃了LRN层
  • 使用的卷积核都是 3 ∗ 3 3*3 33 的( s = 1 , p = 1 s=1,p=1 s=1p=1),抛弃了大的卷积核,3个 3 ∗ 3 3*3 33 卷积核的组合可以达到 7 ∗ 7 7*7 77 感受野,可以使用更多的Relu函数,增加非线性,而且减少了参数,池化层都采用 2 ∗ 2 2*2 22max pooling(s=2)
  • 更加验证了网络越深,效果越好
  • 使用小批量梯度下降,批尺寸为256
  • 采用L2正则化
  • dropout:用在前两个全连接层之后, p = 0.5 p=0.5 p=0.5
  • 参数初始化: w ∽ N ( 0 , 0.01 ) w\backsim \mathcal{N}(0,0.01) wN(0,0.01),偏置为0
  • 数据增强

五、GoogleNet

  2014年图像分类任务的冠军,Top5错误率6.7%;使用9个inception模块,改变CNN原串行结构,并行,共22层;使用平均池化替代FC层;参数量仅为AlexNet的1/12;使用softmax获取平均结果;网络结构的更新,性能比AlexNet要好。

GoogLeNet 出来之前,主流的网络结构是使网络更深更宽,但是这样会存在一些缺点:

  • 训练集有限时,参数过多,出现过拟合
  • 网络越大,计算复杂度越大,设计起来困难
  • 网络层数增多的是,梯度消失越严重

网络结构如下:
【深度学习】经典卷积神经网络结构说明_第10张图片

  虽然GoogLeNet 网络结构比前面的网络结构复杂,有22层,但是它的总参数量并没有前面的多,最主要的原因就是GoogLeNet 借鉴了 NIN 的特性,在原先的卷积过程中附加了1*1的卷积核加上ReLU激活,大大降低了参数量。

1、NIN 特性

  Network-in-Network主要思想是,用全连接的多层感知机去代替传统的卷积过程,以获取特征更加全面的表达,同时,因为前面已经做了提升特征表达的过程,传统CNN最后的全连接层也被替换为一个全局平均池化层,因为作者认为此时的map已经具备分类足够的可信度了,它可以直接通过softmax来计算loss了。

2、Inception 结构

  提高深度神经网络性能最直接的办法是增加它们尺寸,不仅仅包括深度(网络层数),还包括它的宽度,即每一层的单元个数。但是这种简单直接的解决方法存在两个重大的缺点,更大的网络意味着更多的参数,使得网络更加容易过拟合,而且还会导致计算资源的增大。经过多方面的思量,考虑到将稀疏矩阵聚类成相对稠密子空间来倾向于对稀疏矩阵的优化,因而提出inception结构。Google Inception Net是一个大家族,包括:

  • Inception v1结构(GoogLeNet): 论文为 【Going deeper with ConvolutionsGoogleNet】为ILSVRC 2014比赛中的第一名,提出了Inception Module 结构,如下:

【深度学习】经典卷积神经网络结构说明_第11张图片

Inception v1结构 使用 1 ∗ 1 1 * 1 11 3 ∗ 3 3 * 3 33 5 ∗ 5 5 * 5 55的卷积核分别进行特征提取,之后将其进行组合

原本的形式是未添加 1 ∗ 1 1 * 1 11的卷积核,如下:

【深度学习】经典卷积神经网络结构说明_第12张图片

如果所有的卷积核都在上一层的所有输出层来做,那么卷积核计算量太大,所以在 3 ∗ 3 3 * 3 33 5 ∗ 5 5 * 5 55的卷积前用一个 1 ∗ 1 1 * 1 11的卷积用于减少计算,还用于修正线性激活
例如:

  • 假设输入为: 27 ∗ 27 ∗ 128 27 * 27 * 128 2727128,卷积核个数都为:10:
  • 原本形式的总参数个数:
    ( 1 ∗ 1 ∗ 128 + 3 ∗ 3 ∗ 128 + 5 ∗ 5 ∗ 128 ) ∗ 10 = 44800 (1*1*128+3*3*128+5*5*128)*10 = 44800 (11128+33128+55128)10=44800
  • 加入 1 ∗ 1 1 * 1 11的卷积后的总参数个数:
    ( 1 ∗ 1 ∗ 128 ∗ 10 ) ∗ 4 + ( 3 ∗ 3 ∗ 10 ∗ 10 ) + ( 5 ∗ 5 ∗ 10 ∗ 10 ) = 8520 (1*1*128*10)*4+(3*3*10*10)+(5*5*10*10)= 8520 (1112810)4+(331010)+(551010)=8520

  GoogleNe t采用9个 Inception 模块化的结构,共22层,除了最后一层的输出,其中间结点的分类效果也很好。还使用了辅助类结点(auxiliary classifiers),将中间某一层的输出用作分类,并按一个较小的权重加到最终分类结果中。这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练大有益处。下图是网络的结构图:

【深度学习】经典卷积神经网络结构说明_第13张图片

此外还有(这里不具体介绍了):

  • Inception V2结构: 论文【Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift】 Inception V2结构用两个 3 ∗ 3 3 * 3 33 的卷积替代 5 ∗ 5 5 * 5 55的大卷积,提出了Batch Normalization(简称BN)正则化方法。
  • Inception v3结构: 论文【Rethinking the Inception Architecture for Computer Vision】 Inception V3 网络主要有两方面的改造:一是引入Factorization into small convolutions的思想,将较大的二维卷积拆分成两个较小的一维卷积,二是优化了Inception Module结构。
  • Inception v4结构: 论文【Inception-ResNet and the Impact of Residual Connections on learning】 Inception v4结构主要结合了微软的ResNet

六、ResNet

  随着网络的加深,出现了训练集准确率下降,错误率上升的现象,就是所谓的“退化”问题。

【深度学习】经典卷积神经网络结构说明_第14张图片

可以看出,随着网络层级的不断增加,模型精度不断得到提升,但是提升到一定层数以后的时候,训练精度和测试精度迅速下降,更加难训练。说明网络并不是越深越好。

  按理说更深的模型不应当比它浅的模型产生更高的错误率,这不是由于过拟合产生的,而是由于模型复杂时,SGD的优化变得更加困难,导致模型达不到好的学习效果。ResNet 就是针对这个问题应运而生的。

  ResNetILSVRC2015冠军,比VGG深8倍,超深网络,最高可以达到152层;引入残差结构,更改参数w的修改规则;top-5错误率3.6%;参数更新中使用到RNN的思想。

ResNet网络结构如下:

【深度学习】经典卷积神经网络结构说明_第15张图片

  ResNet,深度残差网络,基本思想是引入了能够跳过一层或多层的“shortcut connection”,如下图所示,即图中的“弯弯的弧线”。

【深度学习】经典卷积神经网络结构说明_第16张图片

ResNet中提出了两种mapping:一种是identity mapping,另一种是residual mapping,最后的输出为 y = F ( x ) + x y=F(x)+x y=F(x)+x

  • identity mapping:指的是自身,也就是x
  • residual mapping:残差,指的就是 y − x = F ( x ) y-x=F(x) yx=F(x)

这个简单的加法并不会给网络增加额外的参数和计算量,同时却能够大大增加模型的训练速度,提高训练效果,并且当模型的层数加深时,这个简单的结构能够很好的解决退化问题。

真正在使用的 ResNet模块 并不是这么单一,文章中就提出了两种方式:

【深度学习】经典卷积神经网络结构说明_第17张图片

  这两种结构是分别针对 ResNet34ResNet50/101/152,右边的要比左边的多1层,增添 1 ∗ 1 1*1 11 的卷积目的就是为了降低参数的数目,减少计算量。

所以浅层次的网络,可使用左边的,对于深层次的网络,为了减少计算量,右边的是更好的选择

x x x 添加到 F ( x ) F(x) F(x) 中,还需考虑到 x x x 的维度与 F ( x ) F(x) F(x) 维度可能不匹配的情况,论文中给出三种方案:

  • A: 输入输出一致的情况下,使用恒等映射,不一致的情况下,则用0填充(zero-padding shortcuts)
  • B: 输入输出一致时使用恒等映射,不一致时使用 projection shortcuts
  • C: 在两种情况下均使用 projection shortcuts

经实验验证,虽然C要稍优于B,B稍优于A,但是A/B/C之间的稍许差异对解决“退化”问题并没有多大的贡献,而且使用0填充时,不添加额外的参数,可以保证模型的复杂度更低,这对更深的网络非常有利的,因此方法C被作者舍弃。

七、总结

  • LeNet 是第一个成功应用于手写字体识别的卷积神经网络
  • ALexNet 展示了卷积神经网络的强大性能,开创了卷积神经网络空前的高潮
  • ZFNet 基本结构和 ALexNet ,只是 ZFNet 使用了一个GPU,并且改变了 AleNet 的第一层,将过滤器的大小由 11 ∗ 11 11 * 11 1111变成 7 ∗ 7 7 * 7 77,并且将步长由4变成2
  • VGGNet 采用堆积的小卷积核替代采用大的卷积核,堆叠的小卷积核的卷积层等同于单个的大卷积核的卷积层,不仅能够增加决策函数的判别性还能减少参数量
  • GoogleNet 增加了卷积神经网络的宽度,在多个不同尺寸的卷积核上进行卷积后再聚合,并使用 1 ∗ 1 1*1 11卷积降维减少参数量
  • ResNet 解决了网络模型的退化问题,允许神经网络更深

你可能感兴趣的:(深度学习)