CNN - 卷积神经网络

卷积神经网络基础,以及经典模型的介绍: LeNet-5, AlexNet, VGGNet, GoogLeNet, ResNet, MobileNet

卷积神经网络

CNN: Convolutional Neural Networks 卷积神经网络也是由输入层、输出层和多个隐藏层组成,但是隐藏层可分为卷积层 Convolution ,池化层 Pooling 、全连接层 FCN:fully connected neural network
在图像分类任务中,卷积和池化后的结果是每个输入图像的特征空间,然后将它喂给全连接层实现分类,即从输入图像到标签集的映射。目前主流的卷积神经网络,比如 VGG, ResNet 等都是由简单的 CNN 调整组合而来。下图为常见的卷积和池化的示例:

0115-dl-cnn-sumary.jpg

上图示例输入为 277*277RGB 图像,采用 96 个 11*11*3 的卷积核 kernels 同时扫描,得到输出的特征图是 96 个 267*267 的二维 feature map267*267 是单个特征图的宽高, 96 是卷积核的个数,原本 3 通道元素在卷积的时候会被作为一个元素加起来。这些 feature map 可视化之后,可以看到:

  • 4 和 35 表示边缘特征
  • 23 是模糊化的输入
  • 10 和 16 在强调灰度变化
  • 39 强调眼睛
  • 45 强调红色通道

基本概念

  • 特征图 Feature map
    输入图像和卷积核做卷积后的输出图即为特征图!它表示该卷积核从输入图中提取的一个特征。
  • 感受野 Receptive field
    特征图上每个像素点在输入图片上映射的区域,即该像素点为输入图中哪块像素和卷积核做卷积计算的。输入图中这块像素区域大小即为感受野,也就是感受野的大小和卷积核的大小相同。

Convolutional Layer 卷积层

卷积是一种有效提取图片特征的方法:使用一个正方形的卷积核,遍历图片上的每个像素点;图片与卷积核重合区域内相对应的每一个像素值乘以卷积核内对应点的权重,然后求和得到输出图片中的一个像素值。输入图像感受野区域和卷积核中对应位置相乘后求和,卷积核中的值表示权重;输出值为卷积核矩阵和感受野区域矩阵进行点积。
根据线性代数理论,点积表示向量在某个特征(向量)上的投影再乘以这个特征(向量),直接意义表示向量在某个特征(向量)上的强度;也就是说,做一次点积相当于提取了一次特征。卷积层的意义:卷积核在输入图像上从左到右,从上到下滑动,提取整幅图像在卷积核上的特征。计算过程如下图所示:

0115-dl-cnn-convolutional.png

图中显示了两个卷积示例,绿色部分和红色部分;绿色部分见图中计算结果,红色部分计算如下: (-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 ,分别表示输入图像红绿蓝三色;卷积核的输入通道数与输入相同,它的输出通道数表示卷积后特征图的个数。

卷积过程是一个提取对应特征图的过程,而特征提取由卷积核性质来决定;不同卷积核(即滤波器)对应的主观效果:

0115-dl-cnn-convolutional-kernel-filter.jpg

卷积核通常为正方形,大小为奇数,通常为 1*1, 3*3, 5*5, 7*7

pooling 池化层

池化 pooling 是一种降采样操作 subsampling ,主要目标是降低特征图的特征空间,或者可以认为是降低特征图的分辨率。因为特征图参数太多,而图像细节不利于高层特征的抽取。池化分为最大池化和平均池化两类:

  • 最大池化
    采样时取池化核大小中的最大值;其中池化核的大小为 2*2 ,步长也为 2*2
    0115-dl-cnn-pooling-max.png
  • 平均池化
    采样时取池化核大小中的平均值;其中池化核的大小为 2*2 ,步长也为 2*2
    0115-dl-cnn-pooling-mean.png

假设输入大小为 n*n ,池化核大小为 f*f ,滑动步长为 s ,则输出大小为 (n-f)/s + 1 ;和卷积核计算公式一样,只不过池化时不涉及 padding ,池化也不会改变输入和输出的通道数。

全连接层

全连接 Fully Connected Network 层,就是普通的神经网络层;特点是每个神经元与前后相邻层的每一个神经元都有连接关系,即全连接。
一张分辨率仅仅是 28*28 的黑白图像,就有接近 40 万个待优化参数;而现实中都为高分辨率的彩色图像,像素点非常多,且为红黄蓝三通道信息;而待优化参数过多,容易导致模型的过拟合。在图像分类中,先把输入图像通过卷积和池化后提取特征,降低参数数量,在接入全连接层输出预测的结果;全连接层就是把卷积层和池化层的输出展开成一维的输出结果。

CNN 特点

CNN 与传统的神经网络相比,主要有三大特色:局部感知、权重共享和多卷积核。

  • 局部感知
    局部感知也就是感受野,卷积核和输入图像卷积时,每次卷积核所覆盖的像素只是图像的一小部分,是局部特征,即局部感知,局部感受野。人类对外界的认知一般是从局部到全局,先对局部有感知的认识,再逐步对全体有认知,这是人类的认识模式。在图像中的空间联系也是类似,局部范围内的像素之间联系较为紧密,而距离较远的像素则相关性较弱。因而每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。这种模式就是卷积神经网络中的局部感受野,它能大大降低参数。
    0115-dl-cnn-receptive-field.png
  • 权重共享
    传统的神经网络的参数量是非常巨大的,比如 1000X1000 像素的图片,映射到和自己相同的大小,需要 1000X1000 的平方,也就是 10 的 12 次方,参数量太大了,而 CNN 除全连接层外,卷积层的参数完全取决于卷积核(滤波器)的大小,比如 10x10 的滤波器,只有 100 个参数,当然滤波器的个数不止一个,也就是下面要说的多卷积核。但与传统的神经网络相比,参数量小,计算量小,整个图片共享同一组滤波器的参数,即卷积核参数表示的权重。
    0115-dl-cnn-paras-share.png
  • 多卷积核
    一种卷积核代表提取输入图片的一种特征,为获得更多不同的特征集合,卷积层会有多个卷积核,生成不同的特征图。

小结

大型深层的卷积神经网络 CNNs (请注意这里是复数)通常由多个基础 CNN 组成,而基础 CNN 结构前后连接、层内调整组成,根据功能不同,我们称这些前后连接的结构处于不同阶段 Stage 。不同 StageCNN 会有不同的单元和结构,比如卷积核 kernel 大小、个数, padding, stride 等可能不同,激活函数 activition function 可能不同, pooling 操作可能不存在等等。

LeNet5

LeNet 诞生于 1994 年,由 Yann LeCun 提出并实现,是最早的卷积神经网络之一。
LeNet-5 模型相关资源:

网络模型

LeNet-5 神经网络结构为:

0115-dl-cnn-lenet-5-model.jpg

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=25w 和 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 个元素使用相同的 wb ,一共 6 个池化核,因此参数个数为 (1+1)*6=12 个;池化也是全连接,一共 14*14 个神经元,因此连接数为 (2*2+1)*6*14*14=5880 个。 LeNet-5 中卷积和池化示意图:
    0115-dl-cnn-lenet-5-conv-pooling.png
  • 第三层
    卷积层,卷积核大小为 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 个。
    0115-dl-cnn-lenet-5-c3.png
  • 第四层
    池化层,池化核大小为 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 激活函数。
    0115-dl-cnn-lenet-5-full-connection.png
  • 第七层
    输出层,输出为 10 个节点,分别表示数字 0-9 。该层采用径向基函数 RBF 的连接方式计算输出结果。参数个数为 84*10=840 ,连接个数也为 840 。

AlexNet

AlexNetAlex Krizhevsky, Ilya Sutskever 在多伦多大学 Geoff Hinton 的实验室设计出的一个深层卷积神经网络;该模型是 2012 年年提出并夺得了当年 ImageNet LSVRC 的冠军,且准确率远超第二名( top5 错误率为 15.3% ,第二名为 26.2% )。 AlexNet 可以说是具有历史意义的一个网络结构,在此之前深度学习已经沉寂了很长时间,从它诞生之后, ImageNet 以后举行的比赛,冠军都是用卷积神经网络 CNN 来做的,并且层次越来越深,使得 CNN 成为在图像识别分类的核心算法模型,带来了深度学习的大爆发。
而仔细分析 AlexNet ,可以看出它实际上是参考了 LeNet-5 ,只是 LeNet 当年受到了计算机硬件性能的限制。

AlexNet 模型的相关资源:

模型结构及特点

0115-dl-cnn-alexnet-summary.png

AlexNet 一共有 5 个卷积层和 3 个全连接层,该模型的特点:

  • 使用 ReLU 作为激励函数
    传统的神经网络普遍使用 Sigmoid, tanh 等非线性函数作为激励函数,然而它们容易出现梯度弥散或梯度饱和的情况。以 Sigmoid 函数为例,当输入的值非常大或者非常小的时候,这些神经元的梯度接近于 0 ;如果输入的初始值很大的话,梯度在反向传播时因为需要乘上一个 Sigmoid 导数,会造成梯度越来越小,导致网络变的很难学习。在 AlexNet 中使用了 ReLU: Rectified Linear Units 激励函数;由于它是线性的,且导数始终为 1 ,计算量大大减少,收敛速度会比 Sigmoid, tanh 快很多。
  • 全连接层使用了随机 Dropout
    为了防止神经网络过拟合,引入了 Dropout 的概念;对于某一层神经元,随机的将概率置为 0 ,即这个神经元不参加前向和后向传播(如同被删除一样); Dropout 可以看作是模型组合,每次生成的网络结构都不一样,通过组合多个模型来减少过拟合。 DropoutAlexNet 中的一项非常大的创新,以至于神经网络之父 Hinton 在很多演讲中都拿出来讲解。
    0115-dl-cnn-alexnet-dropout.png
  • 数据扩充
    神经网络为了避免过拟合,加大加深网络结构,需要海量数据来进行训练,能有效提高算法的准确率。但实际上数据往往是有限的,可以通过一些变换将现有数据生成新的数据来扩充数据集。图像数据中可以通过:水平翻转,随机裁剪、平移变换,颜色、光照变换等来快速扩充。
    0115-dl-cnn-alexnet-data-augmentation.png
  • 重叠池化 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 模型的简图:

0115-dl-cnn-alexnet-overview.png

VGG

VGGNetVisual Geometry Group 牛津大学计算机视觉组和 Google DeepMind 公司的研究员一起研发的深度卷积神经网络,该模型是 2014 年提出并取得了 ImageNet-ILSVRC 竞赛的第二名(第一名是 GoogLeNet )和定位项目的第一名。
VGGNet 首次将网络深度提升到了 19 层,并且使用较小的卷积核,证明了增加网络的深度能够在一定程度上影响网络最终的性能,使错误率大幅下降;该网络拓展性很强,迁移到其它图片数据上的泛化性也非常好, VGG 常被用来提取图像特征
VGG 模型相关资源:

模型结构

VGGNet 可以看成是加深版本的 AlexNet ,都是由卷积层、全连接层两大部分构成:

0115-dl-cnn-vgg-summary.png

VGG16, VGG19 是常用模型,它们通常是从图像中提取 CNN 特征的首选算法;主要缺点在于参数量非常大,有 140M 左右需要更大的存储空间。

模型特点

VGGNet 的特点可以通过下图体现:

0115-dl-cnn-vgg-feature.png

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×224RGB 图像,其他参数基本和 AlexNet 一致; VGGBCDE 版本网络的参数初始化均来自于版本 A 网络(即参数预初始化),由于网络 A 较小,因此收敛较快,先训练一个网络 A ,然后将其训练好的参数作为后面网络的初始值(前面四个卷积层和最后的三个全连接层)。其它的参数进行随机初始化,从 (0,0.01) 的高斯分布中进行初始化。

GoogLeNet

GoogLeNetGoogle 公司设计的网络模型(其中 L 大写表示致敬 LeNet ),该模型在 2014 年取得 ImageNet-ILSVRC 分类挑战赛第一名(第二名是 VGGNet )。
GoogLeNet 相关资源:

解决的问题

通常提升网络性能主要是增加网络深度和宽度:深度指网络层次数,宽度指神经元数量。但是这会导致:

  • 参数过多时,如果训练数据有限,很容易产生过拟合
  • 参数过多时,计算复杂度太大
  • 网络越深,越容易出现梯度弥散(越往后梯度越容易消失)

解决思路是在增加网络深度和宽度的同时,减少参数;为了减少参数,将全连接变成稀疏连接,但大部分硬件都是针对密集矩阵做的优化,所以稀疏矩阵中计算数虽然变少,但是计算量并没有质的提升。
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 Module 查看大图

0115-dl-cnn-googlenet-inception-module.png

Inception 结构:将前一层的数据,同时通过 1*1, 3*3, 5*5 的卷积,以及 3*3 的池化,最终再汇总到一起形成该结构的输出;既增加了网络的宽度,又增加了网络尺度的适应性;该结构使用不同尺寸卷积核来提取特征,每个卷积后都会通过 ReLU 增加网络的非线性特征。为了避免 3*3, 5*5 卷积计算量太大,以及最终的特征图厚度太大,分别在卷积前和池化后加上了 1*1 卷积核,有效降低特征图数量。
可以理解为 Inception 结构有多个分支,每个分支提取不同的特征图,每个分支输出的特征图尺寸大小是相同的,但是厚度不一样,最终汇总成一个统一的输出;该结构设计了一个稀疏网络结构,但是能够产生稠密的数据,既增加神经网络表现,又保证计算资源的使用效率。

GoogLeNet 模型

GoogLeNet 结构,查看大图

0115-dl-cnn-googlenet-overview.jpg

模型特点:

  • 采用了模块化的 Inception 结构,方便添加和修改
  • 在分类器之前采用了平均池化接入

模型解析

模型细节,查看大图

0115-dl-cnn-googlenet-details.png

GoogLeNet 模型细节中:#3x3 reduce, #5x5 reduce 表示在 3x3, 5x5 卷积之前使用的 1*1 卷积;这样起名易于理解 1*1 卷积核的作用。

  • 输入层
    输入图像为 224x224x3 ,且都进行了零均值化的预处理操作(图像每个像素减去均值)。
  • 第一段
    卷积层,使用 7x7 的卷积核,滑动步长 2 , padding 为 3 , 64 通道,输出为 112x112x64 ,卷积后通过 ReLU 激活;再经过 3x3max pooling ,步长为 2 ,输出大小为 (112-3)/2+1=56 ,即 56x56x64 ,再通过 ReLU 激活。
  • 第二段
    卷积层,使用 3x3 的卷积核,滑动步长 1 , padding 为 1 , 192 通道,输出为 56x56x192 ,卷积后通过 ReLU 激活;再经过 3x3max 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
  • 第三段 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

根据模型细节的详细参数,依次类推剩下各层。

Inception V2

Inception V2 版本最大的改变是将大尺寸卷积核分解成小尺寸卷积核,保持非对称结构,并将卷积和池化并行计算。

  • 大尺寸卷积核分解
    使用 2 个 3*3 卷积核替代 5*5 卷积核; n*n 卷积都可以使用 1*nn*1 非对称替换。
  • 减少特征图大小
    减小特征图大小通常使用池化和卷积叠加,但是谁先谁后会产生不同的影响:先池化再 Inception 卷积,会导致特征缺失;先 Inception 卷积再池化,计算量会很大。为了保持特征并减低计算量,修改了 V1 的网络结构,将卷积和池化并行进行:
    0115-dl-cnn-googlenet-v2--figure10.png

Inception V2 版本的网络结构细节图:
0115-dl-cnn-googlenet-v2-detail.png

其中的 Figure 5,6,7 分别表示:

  • 第三段的: 5*5 卷积核使用 2 个 3*3 的卷积
    0115-dl-cnn-googlenet-v2--figure5.png
  • 第四段的: n*n 卷积核都是用 1*nn*1 叠加
    0115-dl-cnn-googlenet-v2--figure6.png
  • 第五段的: 靠近输出的 3*3 卷积核使用 1*33*1 并行计算
    0115-dl-cnn-googlenet-v2--figure7.png

Inception V3

Inception V3 版本在 V2 版本上做了比较小的改进,添加了如下功能:

  • 7*7 的卷积核分解
  • 全连接层使用了辅助分类器,并通过 BN 处理
  • 使用标签平滑

Inception V3 网络结构添加部分:

0115-dl-cnn-googlenet-v3.png

Inception V4

Inception V4 是在 V3 版本上做了比较小的改进,使得网络结构变得更复杂:

0115-dl-cnn-googlenet-v4-network.png

每个 Inception 结构和 Reducing 结构细节如下:

0115-dl-cnn-googlenet-v4-details.png

Inception V4 的测试结果显示,即使不适用残差结构,也能得到较深的层次和很好的准确率。

Inception-ResNet

微软的残差网络流行后, GoogLeNetInception 中也引入了残差结构,并提出了 Inception-ResNet-V1, Inception-ResNet-V2 模型,其中 V1, V2 主要区别在于残差结构中卷积层数不一样:

0115-dl-cnn-googlenet-inception-restnet-summary.png

每个 Inception 残差结构和 Reducing 结构细节如下:

0115-dl-cnn-googlenet-inception-restnet-v1-details.png

小结

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 相关资源:

解决的问题

AlexNetVGGNet ,可以看出深度学习网络层数越多,学习能力越好;但是对于常规网络 plain network ,直接堆叠深度,从实验效果来看:随着网络层级的不断增加,模型精度不断得到提升,而当网络层级增加到一定的数目以后,训练精度和测试精度迅速下降。这说明当网络变得很深以后,深度网络就变得更加难以训练了!

0115-dl-cnn-resnet-plain-training-error.png

从神经网络的反向传播链式法则中可以知道,神经网络在反向传播过程中要不断地传播梯度,来调整参数矩阵;而当网络层数加深时,梯度在传播过程中会逐渐消失,导致无法对前面网络层的权重进行有效的调整;所以普通网络中层数超过一定深度后,反而错误率会出现上升!

ResNet 残差网络提出了一个网络结构,它借鉴了 Training Very Deep Networks 论文中的 Highway Networks 即跨层链接思想,使用了恒等映射 identity mapping

0115-dl-cnn-resnet-learning.png

这个残差模块中,通过捷径连接 shortcut connections 的方式,直接把输入 x 传到输出,使得输出结果变为 H(x)=F(x)+x ;当 F(x)=0 时,那么 H(x)=x ,即恒等映射。因此 ResNet 残差网络改变了学习目标,即将残差 F(x)=H(x)-x 结果训练逼近于 0 ,这样即使网络加深,准确率也不会下降。

残差网络结构打破了神经网络层数的约束,可以使层数达到成百上千层。

残差网络

残差网络在 VGG-19 上的对比效果:

0115-dl-cnn-resnet-vs-vgg19.png

左边展示 VGG19 ,中间为基于 VGG19 直接扩充到 34 层,右边为使用残差结构扩充到 34 层。残差结构中实线和虚线的区别:

  • 实线连接:表示通道数相同,比如输入 x 和输出 F(x) 都是 3*3*64 ,所以输出结果可以直接相加 H(x)=F(x)+x
  • 虚线连接:表示通道数不同,比如输入 x3*3*64 ,而输出 F(x)3*3*128 ,需要调整计算公式 H(x)=F(x)+Wx ,其中 W 是卷积操作,用来调整 x 的维度

实验结果如下:直接扩充错误率反而会上升,而 ResNet 扩充后错误率下降。

0115-dl-cnn-resnet-vgg19-traning-result.png

深度残差

0115-dl-cnn-resnet-deep.png

作者在提出 ResNet 50/100/150 深度残差网络时,为了减少计算量,提出了深度残差模型,也就是使用小卷积 1*1 来减少特征图。
残差网络 ResNet 不仅解决了反向传播中退化问题,而且减少了参数的计算量。

ResNet-V2

对于残差结构, BN 归一化和 ReLU 激活层的位置,对准确率有较大影响,测试结果如下:

0115-dl-cnn-resnet-v2.png

weight 表示卷积层;其中图 aResNet-V1 使用的残差结构,策略是先卷积后激活;而图 e 则被称为 ResNet-V2 ,策略是先激活后卷积。其中 BN 对数据起到了正则化的效果,所以训练后测试结果更理想。

MobileNet

MobileNetGoogle 在 2017 年为移动设备设计的通用计算机视觉神经网络,支持图像分类、目标检测、分隔等。
MobileNet 相关资源:

深度可分离卷积

MobileNet 的核心是深度可分离卷积 Depthwise Separable Convolution ,该模型将标准卷积分解为深度卷积 dw:Depthwise 以及一个 1*1 的卷积 pw:Pointwise

0115-dl-cnn-mobilenet-depthwise.png

上图展示的是卷积核卷积的过程:输入 F 的尺寸为 (Df, Df, M) ,卷积后输出 G 的尺寸为 Dg, Dg, N

  • 标准卷积
    标准卷积核 K 尺寸为 Dk, Dk, M ,通道数为 N ;计算量为 Dk * Dk * M * N * Df * Df
  • 深度可分离卷积
    将标准卷积核拆分为深度卷积 dw1*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)
同时,每次分解都会增加 BNReLU 激活:

0115-dl-cnn-mobilenet-bn-relu.png

MobileNetV1 网络结构

MobileNetV1 网络结构模型如下, dw 表示深度可分离卷积:

0115-dl-cnn-mobilenet-architecture.png

最后的 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 对参数及计算量的影响:

0115-dl-cnn-mobilenet-width-resolution-multpier.png

Linear Bottlenecks

在深度神经网络中,当前层的维度为 hi*wi*di ,其中 d 表示通道数,也称为宽度;当通道数过低时, ReLu 激活函数会有很大的信息损耗;如下图所示,低维度情况下,张量的的恢复较差,几乎变形;高维度时则恢复较好:

0115-dl-cnn-mobilenet-v2-relu.png

所谓 Bottleneck ,指的是输入和输出的维度差异较大,就像一个瓶颈一样。

Inverted residual block

深度残差网络 ResNet 结构可以很好的增大网络深度,基于残差模块引入了 Inverted residual block 即倒置残差模块,示意图如下:

0115-dl-cnn-mobilenet-v2-inverted-residual-block.png

实现思路是:先通过 1*1 卷积核增加通道数,再进行深度可分离卷积,最后通过 1*1 卷积核减少通道数。

MobileNetV2 版本网络结构

基于 Linear BottlenecksInverted residual block 提出了 MobileNet V2 版本,其模块结构如下:

0115-dl-cnn-mobilenet-v2-module.png

  • 深度可分离卷积引入了残差
  • 使用 1*1 卷积核降低深度时,使用线性激活替代了 ReLU 激活函数

输入经过 V2 结构后对应的输出为:

0115-dl-cnn-mobilenet-v2-module-input-output.png

MobileNetV2 完整结构如下:

0115-dl-cnn-mobilenet-v2-architecture.png

其中 t 代表单元的扩张系数, c 代表 channel 数, n 为单元重复个数, sstride 步长数。

V2V1 的比较

0115-dl-cnn-mobilenet-v2-vs-v1.png

  • dw 卷积前引入了一个 pw 卷积,用于提高输入通道数
  • 在最后 pw 卷积之后,去掉了 ReLU 激活函数,在低维度情况下, ReLU 会破坏特征不如线性效果好

V2ResNet 的比较

0115-dl-cnn-mobilenet-v2-vs-resnet.png

两者网络结构基本一样,区别在于:

  • 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 ),然后再对其做平移和伸缩变换;计算公式如下:

0115-dl-cnn-bn-algorithm.jpg

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 等小规模模型

参考文档

0%