卷积神经网络基础,以及经典模型的介绍: LeNet-5, AlexNet, VGGNet, GoogLeNet, ResNet, MobileNet
。
卷积神经网络
CNN: Convolutional Neural Networks
卷积神经网络也是由输入层、输出层和多个隐藏层组成,但是隐藏层可分为卷积层 Convolution
,池化层 Pooling
、全连接层 FCN:fully connected neural network
。
在图像分类任务中,卷积和池化后的结果是每个输入图像的特征空间,然后将它喂给全连接层实现分类,即从输入图像到标签集的映射。目前主流的卷积神经网络,比如 VGG, ResNet
等都是由简单的 CNN
调整组合而来。下图为常见的卷积和池化的示例:
上图示例输入为 277*277
的 RGB
图像,采用 96 个 11*11*3
的卷积核 kernels
同时扫描,得到输出的特征图是 96 个 267*267
的二维 feature map
; 267*267
是单个特征图的宽高, 96 是卷积核的个数,原本 3 通道元素在卷积的时候会被作为一个元素加起来。这些 feature map
可视化之后,可以看到:
- 4 和 35 表示边缘特征
- 23 是模糊化的输入
- 10 和 16 在强调灰度变化
- 39 强调眼睛
- 45 强调红色通道
基本概念
- 特征图
Feature map
输入图像和卷积核做卷积后的输出图即为特征图!它表示该卷积核从输入图中提取的一个特征。 - 感受野
Receptive field
特征图上每个像素点在输入图片上映射的区域,即该像素点为输入图中哪块像素和卷积核做卷积计算的。输入图中这块像素区域大小即为感受野,也就是感受野的大小和卷积核的大小相同。
Convolutional Layer
卷积层
卷积是一种有效提取图片特征的方法:使用一个正方形的卷积核,遍历图片上的每个像素点;图片与卷积核重合区域内相对应的每一个像素值乘以卷积核内对应点的权重,然后求和得到输出图片中的一个像素值。输入图像感受野区域和卷积核中对应位置相乘后求和,卷积核中的值表示权重;输出值为卷积核矩阵和感受野区域矩阵进行点积。
根据线性代数理论,点积表示向量在某个特征(向量)上的投影再乘以这个特征(向量),直接意义表示向量在某个特征(向量)上的强度;也就是说,做一次点积相当于提取了一次特征。卷积层的意义:卷积核在输入图像上从左到右,从上到下滑动,提取整幅图像在卷积核上的特征。计算过程如下图所示:
图中显示了两个卷积示例,绿色部分和红色部分;绿色部分见图中计算结果,红色部分计算如下: (-1)*2+(-1)*9+(-1)*2+1*4+1*4=-5
。
假设输入图像大小为 n*n
,卷积核大小为 f*f
,滑动步长为 s
,输入图像 padding
位数为 p
,则输出图像大小为 (n+2p-f)/s + 1
。输入图像和卷积核做卷积后,输出特征图大小和个数就是由这些参数决定:
padding
填充
在输入图像外圈填充一圈像素,也就是扩大输入图像的大小;通常padding
的目的是为了使得输出特征图和输入图像大小保持一致,深度学习中通常使用全零来填充外圈像素。stride
步长
表示卷积核横向和纵向上每次移动的步长。channels
通道数
通道数(有时也叫深度),卷积过程中输入和卷积核的通道数必须相同,表示输入和输出的个数。
输入图像如果为灰度图,则通道数为 1 ;如果为彩色图,则通道数为 3 ,分别表示输入图像红绿蓝三色;卷积核的输入通道数与输入相同,它的输出通道数表示卷积后特征图的个数。
卷积过程是一个提取对应特征图的过程,而特征提取由卷积核性质来决定;不同卷积核(即滤波器)对应的主观效果:
卷积核通常为正方形,大小为奇数,通常为 1*1, 3*3, 5*5, 7*7
。
pooling
池化层
池化 pooling
是一种降采样操作 subsampling
,主要目标是降低特征图的特征空间,或者可以认为是降低特征图的分辨率。因为特征图参数太多,而图像细节不利于高层特征的抽取。池化分为最大池化和平均池化两类:
- 最大池化
采样时取池化核大小中的最大值;其中池化核的大小为2*2
,步长也为2*2
: - 平均池化
采样时取池化核大小中的平均值;其中池化核的大小为2*2
,步长也为2*2
:
假设输入大小为 n*n
,池化核大小为 f*f
,滑动步长为 s
,则输出大小为 (n-f)/s + 1
;和卷积核计算公式一样,只不过池化时不涉及 padding
,池化也不会改变输入和输出的通道数。
全连接层
全连接 Fully Connected Network
层,就是普通的神经网络层;特点是每个神经元与前后相邻层的每一个神经元都有连接关系,即全连接。
一张分辨率仅仅是 28*28
的黑白图像,就有接近 40 万个待优化参数;而现实中都为高分辨率的彩色图像,像素点非常多,且为红黄蓝三通道信息;而待优化参数过多,容易导致模型的过拟合。在图像分类中,先把输入图像通过卷积和池化后提取特征,降低参数数量,在接入全连接层输出预测的结果;全连接层就是把卷积层和池化层的输出展开成一维的输出结果。
CNN
特点
CNN
与传统的神经网络相比,主要有三大特色:局部感知、权重共享和多卷积核。
- 局部感知
局部感知也就是感受野,卷积核和输入图像卷积时,每次卷积核所覆盖的像素只是图像的一小部分,是局部特征,即局部感知,局部感受野。人类对外界的认知一般是从局部到全局,先对局部有感知的认识,再逐步对全体有认知,这是人类的认识模式。在图像中的空间联系也是类似,局部范围内的像素之间联系较为紧密,而距离较远的像素则相关性较弱。因而每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。这种模式就是卷积神经网络中的局部感受野,它能大大降低参数。 - 权重共享
传统的神经网络的参数量是非常巨大的,比如1000X1000
像素的图片,映射到和自己相同的大小,需要1000X1000
的平方,也就是 10 的 12 次方,参数量太大了,而CNN
除全连接层外,卷积层的参数完全取决于卷积核(滤波器)的大小,比如10x10
的滤波器,只有 100 个参数,当然滤波器的个数不止一个,也就是下面要说的多卷积核。但与传统的神经网络相比,参数量小,计算量小,整个图片共享同一组滤波器的参数,即卷积核参数表示的权重。 - 多卷积核
一种卷积核代表提取输入图片的一种特征,为获得更多不同的特征集合,卷积层会有多个卷积核,生成不同的特征图。
小结
大型深层的卷积神经网络 CNNs
(请注意这里是复数)通常由多个基础 CNN
组成,而基础 CNN
结构前后连接、层内调整组成,根据功能不同,我们称这些前后连接的结构处于不同阶段 Stage
。不同 Stage
里 CNN
会有不同的单元和结构,比如卷积核 kernel
大小、个数, padding, stride
等可能不同,激活函数 activition function
可能不同, pooling
操作可能不存在等等。
LeNet5
LeNet
诞生于 1994 年,由 Yann LeCun
提出并实现,是最早的卷积神经网络之一。LeNet-5
模型相关资源:
网络模型
LeNet-5
神经网络结构为:
LeNet-5
主要分为输入层,卷积层特征提取,全连接层分类识别。
特点
- 输入层
32*32*1
大小的灰度图,即单通道输入。 - 第一层
卷积层,卷积核大小为5*5*1
,核个数为 6 ,步长为 1 ;则输出为(32-5)/1+1=28
,即输出为28*28*6
,相当于提取了 6 个28*28
的特征图Feature Map
。同一个卷积核对应的神经元使用相同的w
权重和b
偏置;一个卷积核有5*5=25
个w
和 1 个b
,一共 6 个卷积核,因此卷积后每个神经元的参数个数为(5*5*1+1)*6=156
,即卷积层总参数为 156 个。第一层使用的是全连接,一共28*28
个神经元,因此连接数为28*28*156=122304
个连接数。 - 第二层
池化层,池化核大小为2*2
,步长为 1 ;池化后输出为14*14*6
,特征图大小减半;这一层的计算方法是:将池化核中每个元素相加,再乘以权重w
,最后加上偏置b
,然后通过sigmoid
激活函数。每个池化核中 4 个元素使用相同的w
和b
,一共 6 个池化核,因此参数个数为(1+1)*6=12
个;池化也是全连接,一共14*14
个神经元,因此连接数为(2*2+1)*6*14*14=5880
个。LeNet-5
中卷积和池化示意图: - 第三层
卷积层,卷积核大小为5*5
,核个数为 16 ,步长为 1 ;则输出大小为(14-5)/1+1=10
,即输出为10*10*16
;这一层并没有使用全连接,参考LeNet-5
论文,该层连接如下图所示;比如第一列表示第三层的第 0 个特征图只和第二层的第 0,1,2 这三个特征图连接;有 3 个连接的特征图个数为 6 个、有 4 个连接的特征图个数为 9 个、有 6 个连接的特征图个数为 1 个;所以参数数目为(5*5*3+1)*6 + (5*5*4+1)*9 + (5*5*6+1)*1=1516
个;一共有10*10
个神经元,因此总连接数为10*10*1516=151600
个。 - 第四层
池化层,池化核大小为2*2
,步长为 1 ;池化层输入为上一层的10*10*16
,池化核效果是大小减半,所以池化层输出为5*5*16
。参数计算方法和第二层池化层一样,池化核的每个元素共用权重和偏置,因此参数个数为(1+1)*16=32
;池化是全连接,一共5*5
个神经元,因此连接数为(2*2+1)*16*5*5=2000
。 - 第五层
卷积层,卷积核大小为5*5
,卷积核有 120 个,步长为 1 ;输出大小为(5-5)/1+1=1
,即输出为1*1*120
;因为输入大小和卷积核大小一样,所以卷积后称为单个像素的特征图,卷积过程刚好使得卷积层和全连接层表现一样;如果输入分辨率加大,则改层就不是全连接层了。参数个数为(5*5*16+1)*120=48120
,输出刚好只有1*1
个神经元,全连接数为1*1*48120=48120
。 - 第六层
全连接层,输出为 84 个单元,每个单元表示一个像素,对应于一个7*12
的比特图。如果 -1 表示白色, 1 表示黑色,这个 84 个单元刚好组成7*12
的黑白图,对应下图中的一个编码。参数个数为(120+1)*84=10164
,全连接数也是 10164 ;全连接层点积结果加上偏置后,通过sigmoid
激活函数。 - 第七层
输出层,输出为 10 个节点,分别表示数字 0-9 。该层采用径向基函数RBF
的连接方式计算输出结果。参数个数为84*10=840
,连接个数也为 840 。
AlexNet
AlexNet
是 Alex Krizhevsky, Ilya Sutskever
在多伦多大学 Geoff Hinton
的实验室设计出的一个深层卷积神经网络;该模型是 2012 年年提出并夺得了当年 ImageNet LSVRC
的冠军,且准确率远超第二名( top5
错误率为 15.3% ,第二名为 26.2% )。 AlexNet
可以说是具有历史意义的一个网络结构,在此之前深度学习已经沉寂了很长时间,从它诞生之后, ImageNet
以后举行的比赛,冠军都是用卷积神经网络 CNN
来做的,并且层次越来越深,使得 CNN
成为在图像识别分类的核心算法模型,带来了深度学习的大爆发。
而仔细分析 AlexNet
,可以看出它实际上是参考了 LeNet-5
,只是 LeNet
当年受到了计算机硬件性能的限制。
AlexNet
模型的相关资源:
模型结构及特点
AlexNet
一共有 5 个卷积层和 3 个全连接层,该模型的特点:
- 使用
ReLU
作为激励函数
传统的神经网络普遍使用Sigmoid, tanh
等非线性函数作为激励函数,然而它们容易出现梯度弥散或梯度饱和的情况。以Sigmoid
函数为例,当输入的值非常大或者非常小的时候,这些神经元的梯度接近于 0 ;如果输入的初始值很大的话,梯度在反向传播时因为需要乘上一个Sigmoid
导数,会造成梯度越来越小,导致网络变的很难学习。在AlexNet
中使用了ReLU: Rectified Linear Units
激励函数;由于它是线性的,且导数始终为 1 ,计算量大大减少,收敛速度会比Sigmoid, tanh
快很多。 - 全连接层使用了随机
Dropout
为了防止神经网络过拟合,引入了Dropout
的概念;对于某一层神经元,随机的将概率置为 0 ,即这个神经元不参加前向和后向传播(如同被删除一样);Dropout
可以看作是模型组合,每次生成的网络结构都不一样,通过组合多个模型来减少过拟合。Dropout
是AlexNet
中的一项非常大的创新,以至于神经网络之父Hinton
在很多演讲中都拿出来讲解。 - 数据扩充
神经网络为了避免过拟合,加大加深网络结构,需要海量数据来进行训练,能有效提高算法的准确率。但实际上数据往往是有限的,可以通过一些变换将现有数据生成新的数据来扩充数据集。图像数据中可以通过:水平翻转,随机裁剪、平移变换,颜色、光照变换等来快速扩充。 - 重叠池化
Overlapping Pooling
池化核移动步长小于核大小,也就是移动时会出现重叠元素;重叠池化能避免过拟合问题。 - 局部归一化
LRN: Local Response Normalization
模仿真实神经元的侧抑制机制,实现局部抑制,尤其当使用ReLU
作为激励函数时非常有效;LRN
能提高网络的泛化能力,使top 1/5
错误率下降了1.4/1.2%
。 - 多
GPU
训练
神经网络规模太大,单个GPU
无法满足计算需求,该网络模型使用 2 个GPU
分别训练一半的模型;多用一个GPU
对训练时间影响并不明显,但使top 1/5
错误率下降了1.7/1.2%
。
其中 ReLU
激励函数和正则化使用 Dropout
成为后续 CNN
的标配。
模型解析
所有激活函数都使用 ReLU
;所有的池化层都为 3*3
步长为 2 的最大池化。
- 第一段
总体为:卷积 -> 激励 -> 池化 ->LRN
;其中输入大小为227x227x3
的红黄蓝三基色图;卷积核大小为11*11
,通道数为 96 个,步长为 4 ,则第一层的输出大小根据计算公式(n+2p-f)/s + 1
为(227+0-11)/4+1=55
,即输出层为55*55*96
;输出通过ReLU
激活函数;通过池化层后,输出为(55-3)/2+1=27
,即池化层输出为27*27*96
;通过LRN
进行归一化处理,归一化后分为两组27*27*48
分别送给两个GPU
训练。 - 第二段
总体为:卷积 -> 激励 -> 池化 ->LRN
;其中输入为第一层归一化后的输出27*27*96
(分为两组分别给两个GPU
训练);为了方便计算输入做了 2 个像素的 0 填充,卷积核大小为5*5
,通道数为 256 ,移动步长为 1 ,则卷积后的输出大小为(27+2*2-5)/1+1=27
,即卷积后的输出为 2 组27*27*128
;通过ReLU
激活函数;池化后为 2 组13*13*128
;再将这两组数据归一化后,分别送给两个GPU
训练。 - 第三段
总体为:卷积 -> 激励 ;这一层没有池化和LRN
;输入为第二层的输出: 2 组13*13*128
;先做 1 像素的 0 填充,卷积核大小为3*3
,通道数为 192 ,步长为 1 ,卷积后的大小为(13+2-3)/1+1=13
,即卷积后的输出为 2 组13*13*192
;输出经过ReLU
激活函数后,直接进入下一层。注意该层模型中两个GPU
之间存在虚线,即每个GPU
都需要计算第二层的所有数据。 - 第四段
总体为:卷积 -> 激励 ;这一层也没有池化和LRN
;输入为第三层输出的 2 组13*13*196
;第四层和第三层唯一的区别是,第四层两个GPU
间没有虚线连接,即第四层每个GPU
只需计算第三层一半的输出。 - 第五段
总体为:卷积 -> 激励 -> 池化 ;这一层没有LRN
;输入为第四层输出的 2 组13*13*196
;先做 1 像素的 0 填充,卷积核大小为3*3
,通道数为 256 ,步长为 1 ,卷积后的大小为(13+2-3)/1+1=13
,即卷积后的输出为 2 组13*13*128
;输出经过ReLU
激活函数;再经过池化层,输出为 2 组6*6*128
。 - 第六段
总体为:卷积(全连接) -> 激励 ->Dropout
;这一层属于全连接层,但是使用卷积来实现的;输入为第五层输出的 2 组6*6*128
,卷积核的尺寸刚好和输入一样大,卷积核中每个系数都和输入对应像素相乘,一一对应,因此该层也为全连接层,卷积核通道数为 4096 ,则卷积后的输出为 2 组1*1*2048
,即有 4096 个神经元;通过ReLU
激活函数后;再通过随机的Dropout
,概率选择为 50% ,即丢掉一半的网络特征。 - 第七段
总体为:全连接 -> 激励 ->Dropout
。 - 第八段
第八段为全连接层,输出为 1000 个分类结果的评分。
如下为 AlexNet
模型的简图:
VGG
VGGNet
是 Visual Geometry Group
牛津大学计算机视觉组和 Google DeepMind
公司的研究员一起研发的深度卷积神经网络,该模型是 2014 年提出并取得了 ImageNet-ILSVRC
竞赛的第二名(第一名是 GoogLeNet
)和定位项目的第一名。VGGNet
首次将网络深度提升到了 19 层,并且使用较小的卷积核,证明了增加网络的深度能够在一定程度上影响网络最终的性能,使错误率大幅下降;该网络拓展性很强,迁移到其它图片数据上的泛化性也非常好, VGG
常被用来提取图像特征。VGG
模型相关资源:
模型结构
VGGNet
可以看成是加深版本的 AlexNet
,都是由卷积层、全连接层两大部分构成:
VGG16, VGG19
是常用模型,它们通常是从图像中提取 CNN
特征的首选算法;主要缺点在于参数量非常大,有 140M 左右需要更大的存储空间。
模型特点
VGGNet
的特点可以通过下图体现:
VGGNet
结构简洁清晰,由 5 段卷积层(每段可能会有 3 到 5 个卷积层),3 个全连接层, Softmax
输出层构成,所有隐藏层的激活函数都采用 ReLU
函数,池化层采用最大池化 max-pooling
。
- 输入层
固定为224*224
大小,红黄蓝三基色图像。在训练期间,唯一的预处理是输入图像中每个像素中减去在训练集上计算的RGB
均值,这个预处理可以加快学习。 - 卷积核
卷积核固定为3*3
大小,所有的卷积操作都遵循SAME
原则;3*3
会比大卷积核需要更少的参数;两个3*3
卷积核串联(所需参数个数2*3*3=18
)获取的感受野大小相当于一个5*5
卷积核(所需参数个数1*5*5=25
);而三个3*3
卷积核串联(所需参数个数3*3*3=27
)获取的感受野相当于一个7*7
的卷积核(所需参数个数1*7*7=49
)。
使用3*3
卷积核有三个优点:多个卷积核能获取更大的感受野;增加非线性映射;需要更少的参数。 - 通道数
第一段卷积层统一使用 64 个通道,之后逐段翻倍,直到第五段卷积层统一使用 512 个通道。通道数越大,提取的特征信息越多。 - 激活函数
隐藏层配置的激活函数都是非线性ReLU
函数。 - 池化核
池化核固定为2*2
大小,全部采用相同的最大池化方式,步长为 2 。池化主要目标是缩小宽和高,控制了计算量的规模。 - 全连接层
三个全连接层的配置是相同的,前两个都有 4096 个通道,第三个需要执行 1000 维的分类,因此只包含 1000 个通道(每个通道对应一个类别)。VGGNet
模型中,在测试阶段,会将全连接层全部转换为卷积层;第一层7*7*512
和 4096 个神经元做全连接,测试时转换为和1*1*4096
的卷积核做卷积。
测试阶段将全连接转换成卷积后,则可以对任意分辨率的图做卷积,而不需要缩放到224*224
的输入大小。 Softmax
层
全连接最后一层通过Softmax
转换为预测结果的概率。
小结
VGGNet
模型探讨并证明了以下观点:
- 用多层的卷积层组合配以小尺寸的滤波器,能实现大尺寸滤波器的感受野,同时还能使参数数量更少
- 层深度的增加,能有效提升网络的性能
- 模型融合的性能优于单模型的性能
- 训练期间分阶段降低学习率有助模型收敛
VGG
模型中除了输入的图像是 224×224
的 RGB
图像,其他参数基本和 AlexNet
一致; VGG
中 BCDE
版本网络的参数初始化均来自于版本 A
网络(即参数预初始化),由于网络 A
较小,因此收敛较快,先训练一个网络 A
,然后将其训练好的参数作为后面网络的初始值(前面四个卷积层和最后的三个全连接层)。其它的参数进行随机初始化,从 (0,0.01) 的高斯分布中进行初始化。
GoogLeNet
GoogLeNet
是 Google
公司设计的网络模型(其中 L
大写表示致敬 LeNet
),该模型在 2014 年取得 ImageNet-ILSVRC
分类挑战赛第一名(第二名是 VGGNet
)。GoogLeNet
相关资源:
- Inception v1-Going Deeper with Convolutions
- Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
- Inception v2,v3-Rethinking the Inception Architecture for Computer Vision
- Inception-v4-Inception-ResNet and the Impact of Residual Connections on Learning
解决的问题
通常提升网络性能主要是增加网络深度和宽度:深度指网络层次数,宽度指神经元数量。但是这会导致:
- 参数过多时,如果训练数据有限,很容易产生过拟合
- 参数过多时,计算复杂度太大
- 网络越深,越容易出现梯度弥散(越往后梯度越容易消失)
解决思路是在增加网络深度和宽度的同时,减少参数;为了减少参数,将全连接变成稀疏连接,但大部分硬件都是针对密集矩阵做的优化,所以稀疏矩阵中计算数虽然变少,但是计算量并没有质的提升。GoogLeNet
提出了 Inception
网络结构,用来构造一种神经元,搭建稀疏高计算性能的网络结构。
1*1
卷积核
Network in Network
中最早提出 1*1
卷积核的概念; 1*1
卷积核可以起到降维(升维)的作用,并减少参数。比如当前层为 x*x*m
即图像大小为 x*x
,特征层数为 m
,然后如果将其通过 1*1
的卷积核,特征层数为 n
,那么只要 n<m
这样就能起到降维的目的。如果使用 1*1
的卷积核,这个操作实现的就是多个 feature map
的线性组合,实现通道个数上的变化。如果卷积后添加非线性记录,能提升网络的表达能力。
Inception
网络结构
Inception
结构:将前一层的数据,同时通过 1*1, 3*3, 5*5
的卷积,以及 3*3
的池化,最终再汇总到一起形成该结构的输出;既增加了网络的宽度,又增加了网络尺度的适应性;该结构使用不同尺寸卷积核来提取特征,每个卷积后都会通过 ReLU
增加网络的非线性特征。为了避免 3*3, 5*5
卷积计算量太大,以及最终的特征图厚度太大,分别在卷积前和池化后加上了 1*1
卷积核,有效降低特征图数量。
可以理解为 Inception
结构有多个分支,每个分支提取不同的特征图,每个分支输出的特征图尺寸大小是相同的,但是厚度不一样,最终汇总成一个统一的输出;该结构设计了一个稀疏网络结构,但是能够产生稠密的数据,既增加神经网络表现,又保证计算资源的使用效率。
GoogLeNet
模型
模型特点:
- 采用了模块化的
Inception
结构,方便添加和修改 - 在分类器之前采用了平均池化接入
模型解析
GoogLeNet
模型细节中:#3x3 reduce, #5x5 reduce
表示在 3x3, 5x5
卷积之前使用的 1*1
卷积;这样起名易于理解 1*1
卷积核的作用。
- 输入层
输入图像为224x224x3
,且都进行了零均值化的预处理操作(图像每个像素减去均值)。 - 第一段
卷积层,使用7x7
的卷积核,滑动步长 2 ,padding
为 3 , 64 通道,输出为112x112x64
,卷积后通过ReLU
激活;再经过3x3
的max pooling
,步长为 2 ,输出大小为(112-3)/2+1=56
,即56x56x64
,再通过ReLU
激活。 - 第二段
卷积层,使用3x3
的卷积核,滑动步长 1 ,padding
为 1 , 192 通道,输出为56x56x192
,卷积后通过ReLU
激活;再经过3x3
的max pooling
,步长为 2 ,输出大小为(56-3)/2+1=28
,即28x28x192
,再通过ReLU
激活。 - 第三段
Inception a
有四个分支,采用不同尺寸的卷积核提取特征图:- 分支一: 64 个
1x1
的卷积后通过RuLU
,输出为28x28x64
- 分支二: 96 个
1x1
的卷积后,作为3x3
卷积核之前的降维,变成28x28x96
,然后通过ReLU
;再进行 128 个3x3
的卷积,padding
为 1 ,输出28x28x128
- 分支三: 16 个
1x1
的卷积后,作为5x5
卷积核之前的降维,变成28x28x16
,然后通过ReLU
;再进行 32 个5x5
的卷积,padding
为 2 ,输出28x28x32
- 分支四:使用
3x3
的池化核padding
为 1 ,进行最大池化,输出28x28x192
,然后进行 32 个1x1
的卷积,输出28x28x32
最终将所有分支的结果进行连接,即将特征图厚度叠加:64+128+32+32=256
,这一层最终输出为28*28*256
。
- 分支一: 64 个
- 第三段
Inception b
有四个分支,采用不同尺寸的卷积核提取特征图:- 分支一: 128 个
1x1
的卷积后通过RuLU
,输出为28x28x128
- 分支二: 128 个
1x1
的卷积后,作为3x3
卷积核之前的降维,变成28x28x128
,然后通过ReLU
;再进行 192 个3x3
的卷积,padding
为 1 ,输出28x28x192
- 分支三: 32 个
1x1
的卷积后,作为5x5
卷积核之前的降维,变成28x28x32
,然后通过ReLU
;再进行 96 个5x5
的卷积,padding
为 2 ,输出28x28x96
- 分支四:使用
3x3
的池化核padding
为 1 ,进行最大池化,输出28x28x256
,然后进行 64 个1x1
的卷积,输出28x28x64
最终将所有分支的结果进行连接,即将特征图厚度叠加:128+192+96+64=480
,这一层最终输出为28*28*480
。
- 分支一: 128 个
根据模型细节的详细参数,依次类推剩下各层。
Inception V2
Inception V2
版本最大的改变是将大尺寸卷积核分解成小尺寸卷积核,保持非对称结构,并将卷积和池化并行计算。
- 大尺寸卷积核分解
使用 2 个3*3
卷积核替代5*5
卷积核;n*n
卷积都可以使用1*n
和n*1
非对称替换。 - 减少特征图大小
减小特征图大小通常使用池化和卷积叠加,但是谁先谁后会产生不同的影响:先池化再Inception
卷积,会导致特征缺失;先Inception
卷积再池化,计算量会很大。为了保持特征并减低计算量,修改了V1
的网络结构,将卷积和池化并行进行:
Inception V2
版本的网络结构细节图:
其中的 Figure 5,6,7
分别表示:
- 第三段的:
5*5
卷积核使用 2 个3*3
的卷积 - 第四段的:
n*n
卷积核都是用1*n
和n*1
叠加 - 第五段的: 靠近输出的
3*3
卷积核使用1*3
和3*1
并行计算
Inception V3
Inception V3
版本在 V2
版本上做了比较小的改进,添加了如下功能:
7*7
的卷积核分解- 全连接层使用了辅助分类器,并通过
BN
处理 - 使用标签平滑
Inception V3
网络结构添加部分:
Inception V4
Inception V4
是在 V3
版本上做了比较小的改进,使得网络结构变得更复杂:
每个 Inception
结构和 Reducing
结构细节如下:
Inception V4
的测试结果显示,即使不适用残差结构,也能得到较深的层次和很好的准确率。
Inception-ResNet
微软的残差网络流行后, GoogLeNet
在 Inception
中也引入了残差结构,并提出了 Inception-ResNet-V1, Inception-ResNet-V2
模型,其中 V1, V2
主要区别在于残差结构中卷积层数不一样:
每个 Inception
残差结构和 Reducing
结构细节如下:
小结
GoogLeNet
的几篇论文中详细描述了各个版本的网络模型, Inception
结构的细节,以及各结构对应的分类结果。
ResNet
DRN: Deep Residual Networks
深度残差网络,即 ResNet: Residual Networks
,是微软研究院的 Kaiming He
等四人提出的,通过使用 ResNet Unit
成功训练出了 152 层的神经网络,在 2015 年 ImageNet
竞赛上的 classification, localization, detection
以及 Microsoft COCO
竞赛中 detection, segmentation
,全部获得第一名,而且对应论文 Deep Residual Learning for Image Recognition
也获得了 CVPR2016
的最佳论文。ResNet
相关资源:
解决的问题
从 AlexNet
到 VGGNet
,可以看出深度学习网络层数越多,学习能力越好;但是对于常规网络 plain network
,直接堆叠深度,从实验效果来看:随着网络层级的不断增加,模型精度不断得到提升,而当网络层级增加到一定的数目以后,训练精度和测试精度迅速下降。这说明当网络变得很深以后,深度网络就变得更加难以训练了!
从神经网络的反向传播链式法则中可以知道,神经网络在反向传播过程中要不断地传播梯度,来调整参数矩阵;而当网络层数加深时,梯度在传播过程中会逐渐消失,导致无法对前面网络层的权重进行有效的调整;所以普通网络中层数超过一定深度后,反而错误率会出现上升!
ResNet
残差网络提出了一个网络结构,它借鉴了 Training Very Deep Networks 论文中的 Highway Networks
即跨层链接思想,使用了恒等映射 identity mapping
。
这个残差模块中,通过捷径连接 shortcut connections
的方式,直接把输入 x
传到输出,使得输出结果变为 H(x)=F(x)+x
;当 F(x)=0
时,那么 H(x)=x
,即恒等映射。因此 ResNet
残差网络改变了学习目标,即将残差 F(x)=H(x)-x
结果训练逼近于 0 ,这样即使网络加深,准确率也不会下降。
残差网络结构打破了神经网络层数的约束,可以使层数达到成百上千层。
残差网络
残差网络在 VGG-19
上的对比效果:
左边展示 VGG19
,中间为基于 VGG19
直接扩充到 34 层,右边为使用残差结构扩充到 34 层。残差结构中实线和虚线的区别:
- 实线连接:表示通道数相同,比如输入
x
和输出F(x)
都是3*3*64
,所以输出结果可以直接相加H(x)=F(x)+x
- 虚线连接:表示通道数不同,比如输入
x
为3*3*64
,而输出F(x)
为3*3*128
,需要调整计算公式H(x)=F(x)+Wx
,其中W
是卷积操作,用来调整x
的维度
实验结果如下:直接扩充错误率反而会上升,而 ResNet
扩充后错误率下降。
深度残差
作者在提出 ResNet 50/100/150
深度残差网络时,为了减少计算量,提出了深度残差模型,也就是使用小卷积 1*1
来减少特征图。
残差网络 ResNet
不仅解决了反向传播中退化问题,而且减少了参数的计算量。
ResNet-V2
对于残差结构, BN
归一化和 ReLU
激活层的位置,对准确率有较大影响,测试结果如下:
weight
表示卷积层;其中图 a
是 ResNet-V1
使用的残差结构,策略是先卷积后激活;而图 e
则被称为 ResNet-V2
,策略是先激活后卷积。其中 BN
对数据起到了正则化的效果,所以训练后测试结果更理想。
MobileNet
MobileNet
是 Google
在 2017 年为移动设备设计的通用计算机视觉神经网络,支持图像分类、目标检测、分隔等。MobileNet
相关资源:
- MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
- MobileNetV2: Inverted Residuals and Linear Bottlenecks
- MobileNet 源码
深度可分离卷积
MobileNet
的核心是深度可分离卷积 Depthwise Separable Convolution
,该模型将标准卷积分解为深度卷积 dw:Depthwise
以及一个 1*1
的卷积 pw:Pointwise
。
上图展示的是卷积核卷积的过程:输入 F
的尺寸为 (Df, Df, M)
,卷积后输出 G
的尺寸为 Dg, Dg, N
:
- 标准卷积
标准卷积核K
尺寸为Dk, Dk, M
,通道数为N
;计算量为Dk * Dk * M * N * Df * Df
。 - 深度可分离卷积
将标准卷积核拆分为深度卷积dw
和1*1
逐点卷积pw
;计算量为Dk * Dk * M * Df * Df + M * N * Df * Df
。- 深度卷积核
dw
,负责滤波作用,尺寸Dk, Dk, 1
,通道数为M
;卷积后该层输出为Dg, Dg, M
1*1
卷积核pw
,用于转换通道数,尺寸为1, 1, M
,通道数为N
;卷积后输出为Dg, Dg, N
- 深度卷积核
深度可分离卷积,在不改变卷积结果的情况下,大大降低了计算量,缩减量为 1/N + 1/(Dk*Dk)
。
同时,每次分解都会增加 BN
和 ReLU
激活:
MobileNetV1
网络结构
MobileNetV1
网络结构模型如下, dw
表示深度可分离卷积:
最后的 FC
层没有非线性激活函数,其他层都有 BN, ReLU
非线性函数。
网络结构除了使用深度可分离卷积外,还有一个特点是:直接使用步长为 2 的 s2
卷积运算来代替池化。
宽度乘法器 Width Multiplier
宽度乘法器用于控制模型的输入和输出通道数,使得模型变得更薄;假设宽度因子 Width multiplier
为 α
,即输入通道数从 M
变为 αM
,输出通道数从 N
变为 αN
;
深度可分离卷积计算量降低为 Dk * Dk * αM * Df * Df + αM * αN * Df * Df
,宽度因子使得计算量和参数降低约 α*α
倍,可以很方便的控制模型大小。 宽度因子取值范围为 α∈(0,1]
,通常设置为 1, 0.75, 0.5, 0.25
。
分辨率乘法器 Resolution Multiplier
分辨率乘法器用于控制输入的分辨率,假设分辨率因子 Resolution Multiplier
为 ρ
,即输入图片尺寸从 Df
变为 ρDf
;
深度可分离卷积计算量为 Dk * Dk * αM * ρDf * ρDf + αM * αN * ρDf * ρDf
,分辨率因子使得计算量和参数降低约为 ρ*ρ
倍;分比率因子取值范围为 ρ∈(0,1]
,通常设置输入分辨率为 224,192,160,128
。
Width Multiplier, Resolution Multiplier
对参数及计算量的影响:
Linear Bottlenecks
在深度神经网络中,当前层的维度为 hi*wi*di
,其中 d
表示通道数,也称为宽度;当通道数过低时, ReLu
激活函数会有很大的信息损耗;如下图所示,低维度情况下,张量的的恢复较差,几乎变形;高维度时则恢复较好:
所谓 Bottleneck
,指的是输入和输出的维度差异较大,就像一个瓶颈一样。
Inverted residual block
深度残差网络 ResNet
结构可以很好的增大网络深度,基于残差模块引入了 Inverted residual block
即倒置残差模块,示意图如下:
实现思路是:先通过 1*1
卷积核增加通道数,再进行深度可分离卷积,最后通过 1*1
卷积核减少通道数。
MobileNetV2
版本网络结构
基于 Linear Bottlenecks
和 Inverted residual block
提出了 MobileNet V2
版本,其模块结构如下:
- 深度可分离卷积引入了残差
- 使用
1*1
卷积核降低深度时,使用线性激活替代了ReLU
激活函数
输入经过 V2
结构后对应的输出为:
MobileNetV2
完整结构如下:
其中 t
代表单元的扩张系数, c
代表 channel
数, n
为单元重复个数, s
为 stride
步长数。
V2
和 V1
的比较
- 在
dw
卷积前引入了一个pw
卷积,用于提高输入通道数 - 在最后
pw
卷积之后,去掉了ReLU
激活函数,在低维度情况下,ReLU
会破坏特征不如线性效果好
V2
和 ResNet
的比较
两者网络结构基本一样,区别在于:
ResNet
使用标准卷积,而MobileNetV2
使用dw
卷积ResNet
第一个1*1
卷积是降维,最后一个1*1
卷积是升维,网络特征图模型为沙漏型;MobileNetV2
第一个1*1
卷积是升维,最后一个1*1
卷积是降维,网络特征图模型为纺锤型
BN: Batch Normalization
BN: Batch Normalization
也就是“批量归一化”,在深度神经网络训练过程中, BN
可以对神经网络每一层的输入做归一化处理。论文地址:
Internal Covariate Shift
在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作 ICS:Internal Covariate Shift
,也就是隐藏层的输入分布总是变化。
Internal Covariate Shift
带来的问题:
- 上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低
- 网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度
可以通过固定输入值的分布为了解决这些问题,而常见的方法就是白化 Whitening
。白化是机器学习里面常用的一种规范化数据分布的方法,主要是 PCA
白化与 ZCA
白化。白化是对输入数据分布进行变换,进而达到以下两个目的:
- 使得输入特征分布具有相同的均值与方差。其中
PCA
白化保证了所有特征分布均值为 0 ,方差为 1 ;而ZCA
白化则保证了所有特征分布均值为 0 ,方差相同 - 去除特征之间的相关性
通过白化操作,我们可以减缓 ICS
的问题,进而固定了每一层网络输入分布,加速网络训练过程的收敛。但是对每一层进行白化过程,计算成本太高;并且由于白化改变了网络每一层的分布,从而改变了网络层中本身数据的表达能力。
BN
算法
BN
的基本思想是:在将输入送给神经元之前,先归一化将输入的分布规范化成在固定区间范围的标准分布(均值为 0 ,方差为 1 ),然后再对其做平移和伸缩变换;计算公式如下:
BN
引入了两个可学习的参数:缩放系数 γ
和平移系数 β
,这两个参数的引入是为了恢复数据本身的表达能力,对规范化后的数据进行线性变换。另外,由于 γ
和 β
是可训练的,那么意味着神经网络会随着训练过程自己挑选一个最适合的分布。
DNN
的归一化就是白化操作,在神经网络训练过程中对整体训练数据做归一化带来的计算量太大,这也是白化遇到的问题;而 BN
简化了白化操作:
- 直接对输入信号的每个维度做归一化
normalize each scalar feature independently
- 在小批量训练数据中做归一化,即
mini-batch
中计算均值和方差(而不是整体所有数据) - 缩放系数
γ
和平移系数β
保证了模型的表达能力不会归一化后而下降
BN
的优点
- 使得模型对网络中减轻了对参数初始化的依赖,简化调参过程,使得网络学习更加稳定
- 使得网络中每层输入数据的分布相对稳定,加速模型学习速度
- 允许网络使用饱和性激活函数(例如
sigmoid, tanh
等),缓解梯度消失问题 - 一定程度上增加了泛化能力,具有一定正则化效果(
Dropout
等技术可以去掉)
通常在非线性映射前增加 BN
,也就是数据在送入激活函数前先通过 BN
将输入归一化。 Google
发表 BN
论文是在 VGGNet
上做的实验。
后续
- 搞清楚分类、定位、目标检测、分隔的用途,以及对应常见模型
- 2017
CVPR
最佳论文DenseNet
- 2018
CVPR
最佳论文Taskonomy: Disentangling Task Transfer Learning
SSD, YOLO
模型介绍- 对抗模型
ShuffleNetV2
等小规模模型
参考文档
- 卷积神经网络-知乎百科
- 大话卷积神经网络 CNN
- 大话 CNN 经典模型:LeNet
- 大话 CNN 经典模型:AlexNet
- 大话CNN经典模型:VGGNet
- 大话CNN经典模型:GoogLeNet(从Inception v1到v4的演进)
- 大话深度残差网络(DRN)ResNet网络原理
- 详解深度学习之经典网络架构 ResNet 两代
- 轻量级网络–MobileNet 论文解读
- MobileNetV1 & MobileNetV2 简介
- 论文笔记 MobileNet V2
- 详解深度学习中的Normalization,不只是BN
- Batch Normalization原理与实战
- 深入理解 BN Batch Normalization
- Batch-Normalization详细解析
- 深度学习中 Batch Normalization为什么效果好
- MobileNetV1 & MobileNetV2 简介
- 翻译:深度学习之MobileNetV1
- cs231n 整理的 ImageNet 中经典模型:
1*1
卷积核的作用- 斯坦福:卷积可视化
- 卷积神经网络是什么