转自:http://www.shuang0420.com/2017/04/25/%E5%8D%B7%E7%A7%AF%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%20CNN%20%E7%AC%94%E8%AE%B0(%E9%AB%98%E7%BA%A7%E7%AF%87)/
此篇文章仅作为收藏
卷积神经网络 CNN 笔记(高级篇)
对应 深度学习知识框架,学习更先进的 CNN,包括 AlexNet, VGG, GooLeNet, ResNet, DeepFace, U-Net。
AlexNet: 现代深度卷积网络起源
AlexNet 在 2012 年提出,是 LeNet 更深更宽的版本。AlexNet 由 5 个卷积层,以及部分卷积层后跟着的 max-pooling 层,和 3 个全连接层,还有最后的 1000-way 的 softmax 层组成,共有 6000 万个参数(用全连接层的参数来估算)和 650,000 个神经元。为了加快训练速度,使用了线性修正单元 ReLU 和 多 GPU 加速并行;为了减少全连接层的过拟合,采用了 dropout, data augmentation 和 LRN。网上可能会看到两个版本的 AlexNet,因为在 ImageNet LSVRC-2010 大赛后,论文作者又输入了该模型的一个变体,参加了 ILSVRC-2012。AlexNet 确立了深度卷积网络在计算机视觉的统治地位。
来看一下总体架构:
结构及参数计算:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[227x227x3] INPUT
[55x55x96] CONV1: 96 11x11 filters at stride 4, pad 0
--- OUTPUT VOLUME SIZE = (227-11)/4+1 = 55 ---
--- TOTAL NUMBER OF PARAMETERS = 11*11*3*96 = 35K ---
[27x27x96] MAX POOL1: 3x3 filters at stride 2
--- OUTPUT VOLUME SIZE = (55-3)/2+1 = 27 ---
[27x27x96] NORM1: Normalization layer
[27x27x256] CONV2: 256 5x5 filters at stride 1, pad 2
[13x13x256] MAX POOL2: 3x3 filters at stride 2
[13x13x256] NORM2: Normalization layer
[13x13x384] CONV3: 384 3x3 filters at stride 1, pad 1
[13x13x384] CONV4: 384 3x3 filters at stride 1, pad 1
[13x13x256] CONV5: 256 3x3 filters at stride 1, pad 1
[6x6x256] MAX POOL3: 3x3 filters at stride 2
--- TOTAL NUMBER OF PARAMETERS = 6*6*256 ---
[4096] FC6: 4096 neurons
--- TOTAL NUMBER OF PARAMETERS = 4096*36*256=37,748,736 ---
[4096] FC7: 4096 neurons
--- TOTAL NUMBER OF PARAMETERS = 4096*4096=16,777,216 ---
[1000] FC8: 1000 neurons (class scores)
--- TOTAL NUMBER OF PARAMETERS = 1000*4096=4,096,000 ---
=== TOTAL NUMBER OF PARAMETERS => 37,748,736 + 16,777,216 + 4,096,000 => 6000W ===
|
上图明确显示了两个GPU之间的职责划分。一个 GPU 运行图中顶部的层次部分,另一个 GPU 运行图中底部的层次部分。GPU 之间仅在某些层互相通信。
为了防止过拟合,AlexNet 用了以下三种技术
- 数据增强
a. 由生成图像转化和水平反射组成 如从 256×256 的图像中随机提取 224×224 的碎片(以及水平反射的镜像),并在这些提取的碎片上训练网络,相当于增加了 ((256-224)^2)*2=2048 倍的数据量
b. 改变训练图像中RGB通道的强度 在整个 ImageNet 训练集的 RGB 像素值集合中执行PCA。对每个训练图像,成倍增加已有主成分,比例大小为对应特征值乘以一个从均值为 0,标准差为 0.1 的高斯分布中提取的随机变量 - Dropout
以一定的概率(如 0.5)将每个隐层神经元的输出设置为零。AlexNet 主要是最后几个全连接层使用了 dropout - LRN 层
LRN (Local Response Normalization 局部响应归一化),对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
一些细节:
1
2
3
4
5
6
7
8
9
10
11
|
Details/Retrospectives:
- first use of ReLU
- used Norm layers (not common anymore)
- heavy data augmentation
- dropout 0.5
- batch size 128
- SGD Momentum 0.9
- Learning rate 1e-2, reduced by 10
manually when val accuracy plateaus
- L2 weight decay 5e-4
- 7 CNN ensemble: 18.2% -> 15.4%
|
AlexNet 的学习过程,用随机梯度下降法和一批大小为 128、动力为 0.9、权重衰减为 0.0005 的样例来训练网络。用一个均值为 0、标准差为 0.01 的高斯分布初始化每一层的权重,用常数 1 初始化第 2、第 4 和第 5 个卷积层以及全连接隐层的神经元偏差,在其余层用常数 0 初始化神经元偏差。对所有层都使用了相等的 learning rate,并在整个训练过程中手动调整。当 validation error 在当前 learning rate 下不再提高时,就将 learning rate 除以 10。learning rate 初始化为 0.01,在终止前降低三次。训练该网络时大致将这 120 万张图像的训练集循环了 90 次,在两个 NVIDIA GTX 580 3GB GPU 上花了五到六天。
AlexNet 在 ILSVRC-2010 大赛上实现了top-1测试集误差率 37.5%,top-5测试集误差率 17.0% ,在 ILSVRC-2012大赛上实现了测试集误差率 top-5 15.3%。
VGG: AlexNet增强版
VGG 相当于 AlexNet 的增强版,有着结构简单且深度、精度增强的优势。这里一个 tricky 的地方是,VGG 不是模型的缩写,而是 Visual Geomety Group,也就是牛津大学计算机视觉组(Department of Engineering Science, University of Oxford)的简称。
VGG 与 AlexNet 最鲜明的对比是卷积层、卷积核设计的变化。VGGNet 探索了卷积神经网络的深度与其性能之间的关系,通过反复堆叠 3x3 的小型卷积核和 2x2 的最大池化层,成功构筑了 16~19 层深的卷积神经网络。
- 结构变化: 卷积层转化为卷积群(如下图)
- => 参数变化: 60m => 138m
- => 识别率变化(TOP5): 15.3% => 7.3%
VGGNet 有 5 个卷积群,每一群内有 2~3 个卷积层,每个群连接一个 max-pooling 层来缩小图片尺寸。每个卷积群内的卷积核数量一样,越靠后的卷积群的卷积核数量越多:64 – 128 – 256 – 512 – 512。其中经常出现多个完全一样的 3x3 的卷积层堆叠在一起的情况,为什么呢?看下图,可以发现两个 3x3 的卷积层串联其实相当于 1 个 5x5 的卷积层,也就是说一个像素会跟周围 5x5 的像素产生关联。类似的,3 个 3x3 的卷积层串联的效果则相当于 1 个 7x7 的卷积层。为什么要堆叠卷积层而不直接用 7x7 的呢?一是因为 3 个串联的 3x3 的卷积层的参数比 1 个 7x7 的卷积层更少,二是因为 3 个 3x3 的卷积层比 1 个 7x7 的卷积层有更多的非线性变换(前者可以用三次 ReLU 激活函数,而后者只有一次),对特征的学习能力更强。
网络结构及参数计算:
VGG的作用:
- 结构简单:同 AlexNet 结构类似,都是卷积层、池化层、全连接层的组合
- 性能优异:同 AlexNet 提升明显,同 GoogleNet, ResNet 相比,表现相近
- 选择最多的基本模型,方便进行结构的优化、设计,SSD, RCNN,等其他任务的基本模型(base model)
GooLeNet: 多维度识别
GoogLeNet,ILSVRC 2014 winner,TOP5 的错误率为 6.7%。特点是结构复杂、多分辨率融合。GooLeNet 主要目标是找到最优的稀疏结构单元,也就是 Inception module。Inception 结构是将不同的卷积层通过并联的方式结合在一起,它主要改进了网络内部计算资源的利用率,让我们能在固定计算资源下增加神经网络深度和宽度,另外,Inception 结构还遵循了 Hebbian 原则并增加了多尺度处理。
先看一下 GoogLeNet 的整体结构,其实是由 9 个相似的 Inception module 构成的。
Inception 结构发展
All we need is to find the optimal local construction and to repeat it spatially.
GooLeNet 的 Inception 对特征图进行了三种不同的卷积(1x1, 3x3, 5x5)来提取多个尺度的信息,也就是提取更多的特征。举个例子,一张图片有两个人,近处一个远处一个,如果只用 5x5,可能对近处的人的学习比较好,而对远处那个人,由于尺寸的不匹配,达不到理想的学习效果,而采用不同卷积核来学习,相当于融合了不同的分辨率,可以较好的解决这个问题。把这些卷积核卷积后提取的 feature map (再加多一个 max pooling 的结果)进行聚合操作合并(在输出通道数这个维度上聚合)作为输出,也就是左图的结构,会发现这样结构下的参数暴增,耗费大量的计算资源。
所以有了右图的改进方案,在 3x3,5x5 之前,以及 pooling 以后都跟上一个 1x1 的卷积用以降维,就可以在提取更多特征的同时,大量减少参数,降低计算量。1x1 的卷积核性价比很高,很小的计算量就能增加一层特征变换和非线性化,具体的作用见1x1大小的卷积层的作用
Inception v1 有 22 层,但只有 500w 的参数量,是 AlexNet 的 1/12。为什么要减少参数量?一是因为参数越多,需要喂给模型的数据量就越大,二是因为参数越多,耗费的计算资源就越大。InceptionNet 为什么参数少而且效果好?一是因为用平均池化层代替了最后的全连接层,二是因为上面解释的 Inception Module 的作用。
Inception v2 学习了 VGG,用两个 3x3 的卷积替代了 5x5 的大卷积(降低参数&减少过拟合),并提出了 Batch Normalization 方法,另外根据 BN 对其他部分做了一些调整,比如增大 learning rate,加快学习衰减速度,去除 dropout 减轻L2 正则,去除 LRN,更彻底的对训练样本进行 shuffle 等等。
Inception v3 优化了 Inception Module 的结构,同时引入了 Factorization into small convolutions 思想,把一个较大的二维卷积拆分成两个较小的一维卷积,如将 7x7 卷积拆成 1x7 卷积核 7x1 卷积,进一步节约参数减轻过拟合,此外,Inception v3 还增加了一层非线性扩展模型表达能力。
Inception v4 则结合了微软的 ResNet,在 TOP5 error 上反超了 ResNet 3.1%。
Inception 网络就是由多个上面所说的 inception model 堆叠起来的,Inception model 之间可能再通过 max pulling 减小 feature map,论文作者提出,为了 memory efficiency,最好前几层按正常 CNN 套路来,在深层的时候使用 Inception model。
网络结构图:
参数总数约为 5m,最后用 average pooling 层代替了全连接层。顺带讲一下全卷积结构(FCN),一般的神经网络是卷积层(CNN)+全连接层(FC),全卷积网络没有全连接层(全连接层一会需要大量的参数,二会引起过拟合),这样的特点是:
- 输入图片大小无限制
- 空间信息有丢失
- 参数更少,表达力更强
- 不适合分类,适合做数据生成
ResNet: 机器超越人类识别
由微软提出,最初灵感出自神经网络层数不断加深导致的训练集上误差增大的问题(Degradation),也就是随着网络层数增加,准确率会先上升然后达到饱和,再持续增加深度会导致准确率下降的现象。相比于 AlexNet 和 VGG,ResNet 层数更多,训练用了 8GPU,三周完成。
下图描述了 ResNet 的结构特性,ResNet 允许原始输入信息传输到后面的层中。特征图经过卷积层和非线性层后和之前的特征图进行数据融合,融合结果再往后面的网络推进。看最右边的部分,发现网络有很多“支线”来将输入直接连到后面的层,使得后面的层可以直接学习残差,这种结构也被称为 shortcut 或者 skip connections,它能够保护信息的完整性,整个网络只需要学习输入、输出差别的那一部分,简化了学习目标和难度。具体来说,假定某段神经网络的输入是 x,期望输出是 H(x),如果直接把输入 x 传到输出作为初始结果,那么此时需要学习的目标就是 F(x)=H(x)-x,这就是一个 ResNet 的残差学习单元(Residual Unit),ResNet 的学习目标不再是学习一个完整的输出,而是学习输出和输入的差别,也就是残差。
为什么 ResNet 有效?
- 前向计算:低层卷积网络高层卷积网络信息融合;层数越深,模型的表现力越强
- 反向计算:导数传递更直接,越过模型,直达各层
Benefits of depth in neural networks by Matus Telgarsky
DeepFace: 结构化图片的特殊处理
由 Facebook 提出。广义的人脸识别是说看到这个人脸,确定它是谁,而落在应用/产品层面,更多的是 verification,先拿到别人的照片,做一个 model,再拿一张新的照片,来判断是不是这个人,也就是人脸身份确认。
先来看一下人脸图片的数据特点:
- 结构化:所有人脸的组成相似,理论上可以实现对齐
- 差异化:相同的位置,形貌(appearance)不同
DeepFace 在训练神经网络前,使用了对齐(frontalization),论文认为神经网络能够 work 的原因在于一旦人脸经过对齐后,人脸区域的特征就固定在某些像素上了,所以就可以用卷积神经网络来学习特征。之后的 DeepID 和 FaceNet 并没有对齐这个步骤。
传统 CNN 用同一个卷积核对整张图片进行卷积运算,卷积核参数共享,不同局部特性对参数影响相互削弱,达不到最优的效果,对应的解决方法是局部卷积,不同的区域用不同参数。
人脸识别的基本流程:
1
|
detect -> aligh -> represent -> classify
|
结构:
经过 3D 对齐后,形成的图像都是 152×152 的图像,输入到上述网络结构中,该结构的参数如下:
1
2
3
4
5
6
7
8
|
- Conv:32 个 11×11×3 的卷积核
- max-pooling: 3×3, stride=2
- Conv: 16个9×9 的卷积核
- Local-Conv: 16 个 9×9 的卷积核,参数不共享
- Local-Conv: 16 个 7×7 的卷积核,参数不共享
- Local-Conv: 16 个 5×5 的卷积核,参数不共享
- Fully-connected: 4096 维
- Softmax: 4030 维
|
前三层的目的在于提取低层次的特征,比如简单的边和纹理。其中 Max-pooling 层使得卷积的输出对微小的偏移情况更加鲁棒。但没有用太多的 Max-pooling 层,因为太多的 Max-pooling 层会使得网络损失图像信息。
后面三层都是使用参数不共享的卷积核,之所以使用参数不共享,有如下原因:
- 对齐的人脸图片中,不同的区域会有不同的统计特征,卷积的局部稳定性假设并不存在,所以使用相同的卷积核会导致信息的丢失
- 不共享的卷积核并不增加抽取特征时的计算量,而会增加训练时的计算量
- 使用不共享的卷积核,需要训练的参数量大大增加,因而需要很大的数据量,然而这个条件本文刚好满足。
全连接层将上一层的每个单元和本层的所有单元相连,用来捕捉人脸图像不同位置的特征之间的相关性。其中,第7层(4096-d)被用来表示人脸。
全连接层的输出可以用于Softmax的输入,Softmax层用于分类。
全局部卷积连接的缺陷:
- 预处理:大量对准,对对准要求高,原始信息可能丢失
- 卷积参数数量很大,模型收敛难度大,需要大量数据
- 模型可扩展性差,基本限于人脸计算
U-Net: 图片生成网络
通过卷积神经网络生成特殊类型的图片,基本结构 CONV-FC-CONV
VGG U-Net:
主要要理解的概念是池化-反池化(Pooling-Unpooling),卷积-逆卷积(Convolution-Deconvolution)。
上采样/反池化实际是在池化的时候记住原本的位置,然后在上采样的时候对应回去放回原本的位置,前后空间位置保持一致,其他的地方可以直接补 0。而逆卷积实际上是有学习能力的上采样,它在生成图像有更好的连贯性,更好的空间表达能力。