20世纪 90年代,LeCun et al.等人发表一篇关于手写数字识别的论文 【论文PDF下载】,论文中使用的网络结果如下:
- 此网络结构认为是卷积神经网络的开山鼻祖,也确立了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下载】这四种,对比:
上图可以看出:
- 在网络结构上,CNN发展的一个方向就是层数变得更多
- 在模型效果上,ILSVRC 2015冠军
ResNet
是AlexNet
的20多倍,是VGGNet
的8倍多
通过增加网络结构深度,网络便能够利用增加的非线性得出目标函数的近似结构,同时得出更好的特性表征。但是,这样做同时也增加了网络的整体复杂程度,使网络变得难以优化,很容易过拟合,针对这一问题,研究人员也提出了很多种方法,本篇主题不在此,就展开了。
本篇主要是介绍经典卷积神经网络的结构,接下来我们逐一介绍,这里我们先给出经典卷积神经网络满足的基本网络结构构成规律:
LeNet5
LeNet-5
模型诞生于1998年,它是第一个成功应用于手写数字识别问题的卷积神经网络,它包含了深度学习的基本模块:卷积层,池化层,全连接层。网络结构如下图:
上图可以看出,
LeNet5
一共有7层网络(输入层不算),分别是:
- 卷积层+池化层+卷积层+池化层+卷积层+全连接层+输出层
- 3层卷积、2层池化、1层全连接、1层输出
- 输入图像大小为: 32 × 32 32 \times 32 32×32
卷积+激励 | |
---|---|
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+2P−FH+S=132−5+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+2P−FW+S=132−5+1=28
第一层卷积使用了6个卷积核,用6个卷积核分别与输入图像进行卷积操作,因此得到6个形状为 28 ∗ 28 28 * 28 28∗28 特征图
第一个池化层,输入上一层卷积层的输出, 6 ∗ 28 ∗ 28 6 * 28 * 28 6∗28∗28,进行池化操作,池化可以降低参数量,降低过拟合的可能。
和max pooling
和 average 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 pooling
和average pooling
,是无需训练参数的
卷积+激励 | |
---|---|
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
上图
- 输入大小为 :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 (3∗5∗5+1)∗6+(4∗5∗5+1)∗9+(6∗5∗5+1)∗1=1516
好处:
和第一个池化层S2一样
池化 | |
---|---|
input(输入) | 16 * 10 * 10 |
filter(池化大小) | 2 * 2 |
stripe(步幅) | 2 |
padding(填充) | 0 |
output(输出) | 16 * 5 * 5 |
神经元数目 | 16 * 5 * 5 |
参数个数(加偏置) | 2 * 6 = 12 |
连接方式 | 特殊池化方式 |
卷积+激励 | |
---|---|
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 |
连接方式 | 普通的卷积连接方式 |
F6层计算输入向量和权重向量之间的点积,再加上一个偏置(wx+b),最后将加权值做一个 sigmoid
转换
全连接 | |
---|---|
input(输入) | 120 |
output(输出) | 84 |
神经元数目 | 84 |
参数个数(加偏置) | (120 + 1) * 84 = 10164 |
这里选择84作为神经元的数目从论文中可以认为是:ASCII字符标准的打印字符,是用712大小的位图,这里希望每一维特征分别体现标准712大小位图上每一个像素点的特性。
输出层是由欧式径向基函数(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∑(xj−wij)2
输出层 | |
---|---|
input(输入) | 84 |
output(输出) | 10 |
神经元数目 | 10 |
参数个数 | 84 * 10 = 840 |
LeNet5
一些性质:LeNet5
是一个 7 层的网络LeNet5
大约有六万多个参数LeNet5
结构和论文中提出的结构在某些地方有区别,比如激活函数的使用,现在一般使用 ReLU 作为激活函数,输出层一般选择 softmaxAlexNet
LeNet
提出并成功地应用手写数字识别,但是很快,CNN的锋芒被SVM和手工设计的局部特征所掩盖。2012年,AlexNet
在 ImageNet 图像分类任务竞赛中获得冠军,一鸣惊人,从此开创了深度神经网络空前的高潮。
网络结构如下:
AlexNet结构优化:
图像处理:
备注:实际输入AlexNet网络的图片是一个 227 * 227 * 3 的图片信息
输入层 | |
---|---|
input | 227 * 227 * 3 |
output | 227 * 227 * 3 |
卷积+激励 | |
---|---|
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之间的通信放到网络结构偏后的位置,可以降低信号传输的损耗
最大池化 | |
---|---|
input(输入) | 55 * 55 * 48 * 2 |
filter(池化大小) | 3 * 3 |
stripe(步幅) | 2 |
padding(填充) | 0 |
output(输出) | 27 * 27 * 48 * 2 |
参数个数0 | 0 |
连接方式 | 普通的最大池化方式 |
使用了最大池化,和
LeNet5
中的池化不一样,这里没有需要训练的参数
卷积+激励 | |
---|---|
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进行卷积过程,和普通卷积一样 |
最大池化 | |
---|---|
input(输入) | 27 * 27 * 128 * 2 |
filter(池化大小) | 3 * 3 |
stripe(步幅) | 2 |
padding(填充) | 0 |
output(输出) | 13 * 13 * 128 * 2 |
参数个数0 | 0 |
连接方式 | 普通的最大池化方式 |
卷积+激励 | |
---|---|
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一起做卷积过程 |
卷积+激励 | |
---|---|
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进行卷积过程,和普通卷积一样 |
卷积+激励 | |
---|---|
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进行卷积过程,和普通卷积一样 |
最大池化 | |
---|---|
input(输入) | 13 * 13 * 128 * 2 |
filter(池化大小) | 3 * 3 |
stripe(步幅) | 2 |
padding(填充) | 0 |
output(输出) | 6 * 6 * 128 * 2 |
参数个数0 | 0 |
连接方式 | 普通的最大池化方式 |
全连接层 | |
---|---|
input | 6 * 6 * 128 * 2 = 9216 |
output | 2048 * 2 |
参数个数 | 9216 * 2048 * 2 = 37748736 |
全连接层 | |
---|---|
input | 2048 * 2 = 4096 |
output | 2048 * 2 |
参数个数 | 4096 * 4096 = 16777216 |
全连接层 | |
---|---|
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 11∗11变成 7 ∗ 7 7 * 7 7∗7,并且将步长由4变成2,使用更小的卷积核和步长,保留更多特征。
和AlexNet
一样,在数据输入到神经网络之前,进行了一些相关的图像处理,比如:数据增强相关操作。
输入层 | |
---|---|
input | 225 * 225 * 3 |
output | 225 * 225 * 3 |
卷积+激励 | |
---|---|
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 |
连接方式 | 普通的最大池化方式 |
卷积+激励 | |
---|---|
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 |
连接方式 | 普通的最大池化方式 |
卷积+激励 | |
---|---|
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 |
连接方式 | 普通卷积 |
卷积+激励 | |
---|---|
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 |
连接方式 | 普通卷积 |
卷积+激励 | |
---|---|
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 |
连接方式 | 普通的最大池化方式 |
全连接层 | |
---|---|
input | 6 * 6 * 256 = 9216 |
output | 2048 * 2 = 4096 |
参数个数 | (6 * 6 * 256 + 1) * 4096 = 37752832 |
全连接层 | |
---|---|
input | 4096 |
output | 4096 |
参数个数 | (4096 + 1) * 4096 = 16781312 |
softmax | |
---|---|
input | 4096 |
output | class |
参数个数 | (4096 + 1) * class |
VGGNet
2014年识别任务亚军,定位任务冠军。构建了11~19层的深层网络,分类错误率达到了7.3%,适合做迁移学习。
VGGNet
全部使用了 3 ∗ 3 3 * 3 3∗3 的卷积核和 2 ∗ 2 2 * 2 2∗2 最大池化核通过不断加深网络结构来提神性能。采用堆积的小卷积核优于采用大的卷积核,因为多层非线性层可以增加网络深层来保证学习更复杂的模式,而且所需的参数还比较少。
网络结构如下:
可以看到VGG-D使用了一种块结构:多次重复使用统一大小的卷积核来提取更复杂和更具有表达性的特征。VGG系列中,最多使用是VGG-16。在VGG-16
的第三、四、五块:256、512、512个过滤器依次用来提取复杂的特征,其效果就等于一个带有3个卷积层的大型512*512大分类器。
VGG-16:
VGGNet网络结构特点:
max pooling
(s=2)GoogleNet
2014年图像分类任务的冠军,Top5错误率6.7%;使用9个inception
模块,改变CNN原串行结构,并行,共22层;使用平均池化替代FC层;参数量仅为AlexNet的1/12;使用softmax获取平均结果;网络结构的更新,性能比AlexNet要好。
GoogLeNet
出来之前,主流的网络结构是使网络更深更宽,但是这样会存在一些缺点:
虽然GoogLeNet
网络结构比前面的网络结构复杂,有22层,但是它的总参数量并没有前面的多,最主要的原因就是GoogLeNet
借鉴了 NIN 的特性,在原先的卷积过程中附加了1*1的卷积核加上ReLU激活,大大降低了参数量。
NIN
特性 Network-in-Network
主要思想是,用全连接的多层感知机去代替传统的卷积过程,以获取特征更加全面的表达,同时,因为前面已经做了提升特征表达的过程,传统CNN最后的全连接层也被替换为一个全局平均池化层,因为作者认为此时的map已经具备分类足够的可信度了,它可以直接通过softmax来计算loss了。
Inception
结构提高深度神经网络性能最直接的办法是增加它们尺寸,不仅仅包括深度(网络层数),还包括它的宽度,即每一层的单元个数。但是这种简单直接的解决方法存在两个重大的缺点,更大的网络意味着更多的参数,使得网络更加容易过拟合,而且还会导致计算资源的增大。经过多方面的思量,考虑到将稀疏矩阵聚类成相对稠密子空间来倾向于对稀疏矩阵的优化,因而提出inception结构。Google Inception Net是一个大家族,包括:
Inception v1结构(GoogLeNet)
: 论文为 【Going deeper with ConvolutionsGoogleNet】为ILSVRC 2014比赛中的第一名,提出了Inception Module
结构,如下:
Inception v1结构
使用 1 ∗ 1 1 * 1 1∗1、 3 ∗ 3 3 * 3 3∗3、 5 ∗ 5 5 * 5 5∗5的卷积核分别进行特征提取,之后将其进行组合
原本的形式是未添加 1 ∗ 1 1 * 1 1∗1的卷积核,如下:
如果所有的卷积核都在上一层的所有输出层来做,那么卷积核计算量太大,所以在 3 ∗ 3 3 * 3 3∗3和 5 ∗ 5 5 * 5 5∗5的卷积前用一个 1 ∗ 1 1 * 1 1∗1的卷积用于减少计算,还用于修正线性激活
例如:
- 假设输入为: 27 ∗ 27 ∗ 128 27 * 27 * 128 27∗27∗128,卷积核个数都为:10:
- 原本形式的总参数个数:
( 1 ∗ 1 ∗ 128 + 3 ∗ 3 ∗ 128 + 5 ∗ 5 ∗ 128 ) ∗ 10 = 44800 (1*1*128+3*3*128+5*5*128)*10 = 44800 (1∗1∗128+3∗3∗128+5∗5∗128)∗10=44800- 加入 1 ∗ 1 1 * 1 1∗1的卷积后的总参数个数:
( 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 (1∗1∗128∗10)∗4+(3∗3∗10∗10)+(5∗5∗10∗10)=8520
GoogleNe
t采用9个 Inception
模块化的结构,共22层,除了最后一层的输出,其中间结点的分类效果也很好。还使用了辅助类结点(auxiliary classifiers),将中间某一层的输出用作分类,并按一个较小的权重加到最终分类结果中。这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练大有益处。下图是网络的结构图:
此外还有(这里不具体介绍了):
Inception V2结构
: 论文【Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift】 Inception V2结构
用两个 3 ∗ 3 3 * 3 3∗3 的卷积替代 5 ∗ 5 5 * 5 5∗5的大卷积,提出了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结构
主要结合了微软的ResNetResNet
随着网络的加深,出现了训练集准确率下降,错误率上升的现象,就是所谓的“退化”问题。
可以看出,随着网络层级的不断增加,模型精度不断得到提升,但是提升到一定层数以后的时候,训练精度和测试精度迅速下降,更加难训练。说明网络并不是越深越好。
按理说更深的模型不应当比它浅的模型产生更高的错误率,这不是由于过拟合产生的,而是由于模型复杂时,SGD的优化变得更加困难,导致模型达不到好的学习效果。ResNet
就是针对这个问题应运而生的。
ResNet
是 ILSVRC2015
冠军,比VGG深8倍,超深网络,最高可以达到152层;引入残差结构,更改参数w的修改规则;top-5错误率3.6%;参数更新中使用到RNN的思想。
ResNet
网络结构如下:
ResNet
,深度残差网络,基本思想是引入了能够跳过一层或多层的“shortcut connection
”,如下图所示,即图中的“弯弯的弧线”。
ResNet
中提出了两种mapping:一种是identity mapping
,另一种是residual mapping
,最后的输出为 y = F ( x ) + x y=F(x)+x y=F(x)+x
identity mapping
:指的是自身,也就是xresidual mapping
:残差,指的就是 y − x = F ( x ) y-x=F(x) y−x=F(x)这个简单的加法并不会给网络增加额外的参数和计算量,同时却能够大大增加模型的训练速度,提高训练效果,并且当模型的层数加深时,这个简单的结构能够很好的解决退化问题。
真正在使用的 ResNet模块
并不是这么单一,文章中就提出了两种方式:
这两种结构是分别针对 ResNet34
和 ResNet50/101/152
,右边的要比左边的多1层,增添 1 ∗ 1 1*1 1∗1 的卷积目的就是为了降低参数的数目,减少计算量。
所以浅层次的网络,可使用左边的,对于深层次的网络,为了减少计算量,右边的是更好的选择
将 x x x 添加到 F ( x ) F(x) F(x) 中,还需考虑到 x x x 的维度与 F ( x ) F(x) F(x) 维度可能不匹配的情况,论文中给出三种方案:
经实验验证,虽然C要稍优于B,B稍优于A,但是A/B/C之间的稍许差异对解决“退化”问题并没有多大的贡献,而且使用0填充时,不添加额外的参数,可以保证模型的复杂度更低,这对更深的网络非常有利的,因此方法C被作者舍弃。
LeNet
是第一个成功应用于手写字体识别的卷积神经网络ALexNet
展示了卷积神经网络的强大性能,开创了卷积神经网络空前的高潮ZFNet
基本结构和 ALexNet
,只是 ZFNet
使用了一个GPU,并且改变了 AleNet
的第一层,将过滤器的大小由 11 ∗ 11 11 * 11 11∗11变成 7 ∗ 7 7 * 7 7∗7,并且将步长由4变成2VGGNet
采用堆积的小卷积核替代采用大的卷积核,堆叠的小卷积核的卷积层等同于单个的大卷积核的卷积层,不仅能够增加决策函数的判别性还能减少参数量GoogleNet
增加了卷积神经网络的宽度,在多个不同尺寸的卷积核上进行卷积后再聚合,并使用 1 ∗ 1 1*1 1∗1卷积降维减少参数量ResNet
解决了网络模型的退化问题,允许神经网络更深