之前博文介绍了基于深度学习的常用的检测网络《学习笔记之——基于深度学习的目标检测算法》,本博文为常用的CNN分类卷积网络介绍,本博文的主要内容来自于R&C团队的成员的调研报告以及本人的理解~如有不当之处,还请各位看客赐教哈~好,下面进入正题。
目录
引言
分类网络
LeNet
网络结构
测试结果
总结
AlexNet
网络结构
测试结果
网络特点
总结
ZFNet
网络结构
网络特点
训练与测试结果
总结
VGGNet
网络结构
网格特点
训练与测试结果
总结
GoogLeNet
Inception-v1
Inception-v2
Inception-v3
总结
ResNet
网络结构 Residual Block
训练与测试结果
卷积神经网络(CNN)又称卷积网络,通常用做处理图像序列。经典的CNN层包括三个层次,卷积层、激活函数和池化层。通常在输出之前有几个完全连接的层来集成数据并完成分类。本博文将介绍几种经典的分类卷积网络:LeNet-5、AlexNet、ZFNet、VGGNet、GoogLeNet、ResNet。
LeNet-5由Yann LeCun等人于1989年提出,它是一种用于手写体字符识别的非常高效的卷积神经网络,推动了深度学习领域的发展。LeNet5通过巧妙的设计,利用卷积、参数共享、池化等操作提取特征,避免了大量的计算成本,最后再使用全连接神经网络进行分类识别,这个网络是卷积神经网络架构的起点,后续许多网络都以此为范本进行优化。
LeNet-5共有7层,不包含输入,每层都包含可训练参数;每个层有多个特征映射(feature map),每个feature map通过一种卷积滤波器(filter)提取输入的一种特征,最终经过全连接层和Softmax函数完成分类。
INPUT层-输入层:首先是数据 INPUT 层,输入图像(0~9的手写体数字)的尺寸统一归一化为32*32,使背景级别(白色)对应-0.1,前景(黑色)对应1.175。这使得输入平均值约为0,而方差约为1,目的是加速学习。32*32的图像大小比MNIST数据集的图片要大一些,这么做的原因是希望潜在的明显特征如笔画断点或角能够出现在最高层特征检测子感受野(receptive field)的中心。因此在训练整个网络之前,需要对28*28的图像加上paddings(即周围填充0)。
C1层-卷积层
输入图片:32*32
卷积核大小:5*5
卷积核种类:6
输出feature map大小:28*28
*注: 输入维度n×n,卷积核大小f×f,填充p,步长s,则输出维度为:
可训练参数:(5*5+1) * 6(每个滤波器5*5=25个unit参数和一个bias参数,一共6个滤波器)
连接数:(5*5+1)*6*28*28=122304
S2层-池化层(下采样层)
输入:28*28
采样区域:2*2
采样方式:4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid。
*注:sigmoid函数:
采样种类:6
输出featureMap大小:14*14
连接数:(2*2+1)*6*14*14
S2中每个特征图的大小是C1中特征图大小的1/4。
详细说明:第一次卷积之后紧接着就是池化运算,分别对2*2大小的区域进行池化,于是得到了S2,6个14*14的特征图。S2这个pooling层是对C1中的2*2区域内的像素求和并乘以一个权值系数再加上一个偏置,然后将这个结果再做一次映射。Pooling层的主要作用就是减少数据,降低数据维度的同时保留最重要的信息。在数据减少后,可以减少神经网络的维度和计算量,也可以防止参数太多过拟合。
C3层-卷积层
输入:S2的feature map组合
卷积核大小:5*5
卷积核种类:16
输出featureMap大小:10*10
可训练参数:6*(3*5*5+1)+6*(4*5*5+1)+3*(4*5*5+1)+1*(6*5*5+1)=1516
连接数:10*10*1516=151600
C3层是一个卷积层,卷积和和C1相同,卷积核大小依然为5*5,不同的是C3的每个节点与S2中的多个图相连。每个图与S2层的连接的方式如上表所示。这种不对称的组合连接的方式有利于提取多种组合特征。C3的前6个feature map(对应上图第一个红框的6列)与S2层相连的3个feature map相连接(上图第一个红框,每一列中X的数量为3),后面6个feature map与S2层相连的4个feature map相连接(上图第二个红框,每一列中X的数量为4),后面3个feature map与S2层部分不相连的4个feature map相连接,最后一个与S2层的所有feature map相连。总共有6*(3*5*5+1)+6*(4*5*5+1)+3*(4*5*5+1)+1*(6*5*5+1)=1516个参数。而图像大小为10*10,所以共有151600个连接。
C3与S2中前3个图相连的卷积结构如下图所示:
S4层-池化层(下采样层)
输入:10*10
采样区域:2*2
采样方式:4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid
采样种类:16
输出featureMap大小:5*5
神经元数量:5*5*16=400
连接数:16*(2*2+1)*5*5=2000
S4中每个特征图的大小是C3中特征图大小的1/4
C5层-卷积层
输入:S4层的全部16个单元特征map(与S4全相连)
卷积核大小:5*5
卷积核种类:120
输出featureMap大小:1*1
可训练参数/连接:120*(16*5*5+1)=48120
详细说明:C5层是一个卷积层。由于S4层的16个图的大小为5×5,与卷积核的大小相同,所以卷积后形成的图的大小为1×1。这里形成120个卷积结果。每个都与上一层的16个图相连。所以共有(5×5×16+1)×120 = 48120个参数,同样有48120个连接。C5层的网络结构如下:
F6层-全连接层
输入:C5层输出的 120维向量
计算方式:计算输入向量和权重向量之间的点积,再加上一个偏置,结果通过sigmoid函数输出。
可训练参数:84*(120+1)=10164
详细说明:6层是全连接层。F6层有84个节点,对应于一个7×12的比特图,-1表示白色,1表示黑色,这样每个符号的比特图的黑白色就对应于一个编码。该层的训练参数和连接数是(120 + 1)×84=10164。
F6层的连接方式如下:
Output层-全连接层
Output层也是全连接层,共有10个节点,分别代表数字0到9,且如果节点i的值为0,则网络识别的结果是数字i。采用的是径向基函数(RBF)的网络连接方式。假设x是上一层的输入,y是RBF的输出,则RBF输出的计算方式是:
上式w_ij 的值由i的比特图编码确定,i从0到9,j取值从0到7*12-1。RBF输出的值越接近于0,则越接近于i,即越接近于i的ASCII编码图,表示当前网络输入的识别结果是字符i。该层有84×10=840个参数和连接。然后与Softmax连接,最终输出结果。
上图是LeNet-5识别数字3的过程。下图是LeNet-5识别数字8的过程。
在MNIST 中60000个训练集上,误差在第10~12次迭代时趋近收敛。
随着训练集的扩充,测试误差在减小。在测试集经过人工随机扭曲扩展的情况下,测试误差达到了0.8%。
LeNet-5与其他分类算法的分类错误率结果比较。
LeNet-5与其他分类算法的所必需进行的累加乘法操作次数结果比较。
LeNet-5与其他分类算法的必需存储变量的空间大小结果比较。
优点:
LeNet-5是一种用于手写体字符识别的非常高效的卷积神经网络。
卷积神经网络能够很好的利用图像的结构信息。
卷积层的参数较少,这也是由卷积层的主要特性即局部连接和共享权重所决定。
缺点:
由于当时缺乏大规模训练数据,计算机的计算能力也跟不上,LeNet-5 对于复杂问题的处理结果并不理想,下图为82个被LeNet-5误判的数字图像,误判原因主要为训练集没有表现以下数字的特征。
意义:是第一个真正意义上的深度学习网络,也是现在许多卷积神经网络的雏形。在20世纪90年代,LeNet-5被用于欧美许多大银行的自动手写识别系统(读取支票手写数字等),为商业发展提供帮助。
2012年,Alex Krizhevsky、Ilya Sutskever设计出了一个深层的卷积神经网络AlexNet,夺得了2012年ImageNet LSVRC的冠军,且准确率远超第二名(top5错误率为15.3%,第二名为26.2%),引起了很大的轰动。AlexNet可以说是具有历史意义的一个网络结构,在此之前,深度学习已经沉寂了很长时间,自2012年AlexNet诞生之后,后面的ImageNet冠军都是用卷积神经网络(CNN)来做的,并且层次越来越深,使得CNN成为在图像识别分类的核心算法模型,带来了深度学习的大爆发。
AlexNet包括了8个参数层(不包括池化层和局部响应归一化LRN层),5层卷积层和3层全连接层,最后一个全连接层的输出送到一个1000维的Softmax层,产生一个覆盖1000类标签的分布。LRN层出现在第1个及第2个卷积层后,最大池化层(3*3,步长为2)出现在2个LRN层及最后一个卷积层后。ReLU激活函数应用在这8层每一层后面。
Local Response Normalization, LRN,局部响应归一化。指在某一层得到了多通道的响应图后,对响应图上某一位置和临近通道的值按照如下公式做归一化:
其中是特征响应feature map图第个通道上在位置上的值,k、α、β均为超参数(Alex选用的参数为)局部响应归一化模拟的是动物神经中的横向抑制效应。从公式中可看出,如果在该位置,该通道和临近通道的绝对值都比较大的话,归一化之后值会有变得更小的趋势。LRN示意图如下图所示,红色的feature map中特定的位置与其邻近通道上的相同位置的值进行归一化。
Alex等人提出LRN时指出其对网络分类指标的提升是有帮助的(top-1错误率下降1.4%,top-5错误率下降1.2%),然而随着更深层次的网络被提出,LRN被认为并没有什么作用,论文Very Deep Convolutional Networks for Large-scale Image Recognition指出在VGGNet第11层的网络中LRN已经起了副作用。
以上两个分组卷积是因为Alex当时的显卡不够强大,为了减少计算量同时方便并行,所以采用了同时在两块GPU上分组计算的方法。传统的卷积层中,相邻的池化单元是不重叠的。如果步长小于卷积核大小,那么池化层将重叠。在AlexNet中使用了MAXPooling,步长为2,卷积核大小为3。论文指出,这种重叠的池化层能“稍微”减轻过拟合。
在fc6、fc7两层,AlexNet使用了Dropout方法来避免过拟合。具体操作是每个神经元有50%的概率被设置为没有响应,这使得对于每次训练,神经网络的体系结构都会不同,使得网络更加健壮。
For 1: Sigmoid 是常用的非线性的激活函数,它能够把输入的连续实值“压缩”到0和1之间。特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。LeNet-5使用的激活函数便是Sigmoid函数。然而,Sigmoid函数有两个致命的缺点:1)当输入非常大或者非常小的时候,会有饱和现象,这些神经元的梯度是接近于0的。如果初始值很大的话,梯度在反向传播的时候因为需要乘上一个sigmoid 的导数,所以会使得梯度越来越小,这会导致网络变的很难学习。2)Sigmoid 的 输出不是0均值。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。产生的一个结果就是:如果数据进入神经元的时候是正的,那么计算出的梯度也会始终都是正的。Alex用ReLU代替了Sigmoid,发现使用 ReLU 得到的SGD的收敛速度会比sigmoid/tanh 快很多。如下图,在 CIFAR-10测试集上,实线代表使用ReLU作为激活函数的训练误差曲线,虚线代表使用tanh作为激活函数的训练误差曲线,ReLU收敛速度远快于tanh。主要是因为它是linear,而且 non-saturating(因为ReLU的导数始终是1),相比于sigmoid/tanh,ReLU 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的运算。
For 2: 对原始图片进行扩充以减少过拟合Data augmentation,方法有:从原始图像(256,256)中,随机的裁剪出一些图像(224,224)。水平翻转图像。给图像增加一些随机的光照。
优点:数据增强,采用了Dropout、Data augmentation避免过拟合,采用ReLU整流线性单元代替Sigmoid函数,第一次采用GPU加速,使得训练网络的速度大大提高。在ILSVRC2012的比赛中取得了优异的成绩。
意义:它证明了CNN在复杂模型下的有效性,然后利用GPU加速使得训练在可接受的时间范围内得到结果。AlexNet对几年前的神经网络结构影响深远,2013年ILVRC的冠军结构ZFNet、亚军结构VGGNet都是以AlexNet为基础的。从这一年开始,几乎所有参加ILVRC的参赛者都开始使用卷积神经网络,少数没有使用深度卷积神经网络的参赛者都处于垫底位置。AlexNet的提出确实让CNN和GPU的概念变得流行,且推动了监督学习的发展。
ZFNet是由纽约大学的Matthew Zeiler和Rob Fergus所设计,该网络在AlexNet上进行了微小的改进,但这篇文章主要贡献在于在一定程度上解释了卷积神经网络为什么有效,以及如何提高网络的性能。该网络的贡献在于:1)使用了反卷积网络,可视化了特征图。通过特征图证明了浅层网络学习到了图像的边缘、颜色和纹理特征,高层网络学习到了图像的抽象特征;2)根据特征可视化,提出AlexNet第一个卷积层卷积核太大,导致提取到的特征模糊;3)通过几组遮挡实验,对比分析找出了图像的关键部位;4)论证了更深的网络模型,具有更好的性能。
ZFNet大体保留了AlexNet的结构,而通过特征可视化发现了AlexNet的一些不足之处,对其中一些参数进行了调整:由于AlexNet第一层卷积核混杂了大量的高频和低频信息,缺少中频信息,故ZFNet将第1层卷积核的大小由11×11调整为7×7;b、c分别为AlexNet、ZFNet第1层所提取的特征。
由于AlexNet第2层卷积过程选择4作为步长,产生了混乱无用的特征,故ZFNet将卷积步长由4调整为2。d、e分别为AlexNet、ZFNet第2层所提取的特征,后者没有前者中的模糊特征。
反卷积网络Deconvnet:用于了解(可视化)卷积网络中间层的feature map。在ZFNet中,卷积网络的每一层都附加了一个反卷积层,提供了一条由输出feature map到输入图像的反通路。首先,输入图像通过卷积网络,每层都会产生特定feature map,而后将反卷积网络中观测层的其他连接权值全部置零,将卷积网络观测层产生的feature map当作输入,传送给对应的反卷积层,并依次进行i.unpooling,ii.矫正,iii.反卷积。
unpooling: 在MAXpooling的过程中,用Switches表格记录下每个pooling区域中的最大值,在unpooling过程中,将最大值标注回记录所在位置,其余位置填充0。
矫正:在卷积网络中,使用ReLU作为激活函数保证所有输出都为非负数,这个约束对反卷积过程依然成立,因此将重构信号同样传输入ReLU中。
反卷积:卷积网络使用学习得到的卷积核与上层输出feature map做卷积得到该层输出的feature map,为了实现逆过程,反卷积网络使用相同卷积核的转置作为核,与矫正后的feature map进行卷积运算。
特征不变性:如图,5张不同的图片分别被平移、旋转、缩放。在网络的第1层,输入图片任何小的微变都会导致输出特征变化明显,但随着层数的增加,平移和缩放的变化对最终结果影响越小,但旋转产生的变化并不会减小。这说明卷积网络无法对旋转操作产生不变性,除非物体具有很强的对称性。
遮挡实验:
ZFNet展示了输入图片被遮挡的情况。Zeiler等人使用一个灰色矩形对输入图像的每个部分进行遮挡,并测试在不同遮挡情况下,分类器的输出结果,当关键区域发生遮挡时,分类器性能急剧下降。上图中的第1行展示了狗狗图片产生的最强特征,当存在遮挡时,对应输入图片的特征产生刺激强度降低(蓝色区域)。使用部分遮挡的扩展训练集可以使网络产生相关性,提升分类准确度。
使用ImageNet2012所给的130万张图片进行测试,每张RGB图像被预处理为256×256的大小。ZFNet使用小批量数据SGD随机梯度下降,mini-batch=128,学习率为10-2,动量为0.9。在第6、第7层全连接层中使用Dropout方法(Dropout比率为50%)
利用改进后的ZFNet在ImageNet2012训练集上训练并测试,得出的top-5错误率为14.8%,比AlexNet的15.3%下降了0.5%。
Zeiler等人测试了改变AlexNet模型的结构对最终分类结果所造成的影响。当第6、7层被完全删除后,错误率上升至22.4%,而删除所有的卷积层后,错误率剧烈上升至50.1%,这说明模型的深度与分类效果密切相关,深度越大,效果越好,而改变全连接层的节点个数对分类性能影响不大。
为了测试模型泛化能力,Zeiler等人还利用ZFNet测试了Caltch-101,Caltch-256和PASCAL VOC2012共3个库,测试方法为不改变1~7层的训练结果,而只对最深层的softmax分类器重新训练。
比较可知,基于ImageNet学到的特征更有效。
PASCAL库中的测试图片有可能一张包含多个物体,而ZFNet模型一张图片只给出一个预测,所以没能超越历史最好记录,约落后了3.2%。
通过以上实验,说明使用ImageNet2012数据集训练得到的CNN的特征提取功能就有通用性。
优点 / 意义:ZFNet是CNN领域可视化理解的开山之作。在一定程度上解释了卷积神经网络为什么有效,以及如何提高网络的性能。
局限:大体继承了AlexNet的结构,没有提出太多对提升分类准确度有实际帮助的方法。
VGGNet是由牛津大学计算机视觉组和Google DeepMind项目的研究员共同研发的卷积神经网络模型,VGGNet探索了卷积神经网络的深度与其性能之间的关系,通过反复堆叠3*3的小型卷积核和2*2的最大池化层,VGGNet成功地构筑了16~19层深的卷积神经网络。该模型取得了ILSVRC2014比赛分类项目的第2名和定位项目的第1名。
VGG由5层卷积层、3层全连接层、softmax输出层构成,层与层之间使用max-pooling(最大化池)分开,所有隐层的激活单元都采用ReLU函数。VGG16
在训练期间,VGGNet的输入是固定大小的224×224 RGB图像。预处理是从每个像素中减去在训练集上计算的RGB均值。图像通过一堆卷积层,VGGNet使用感受野很小的滤波器:3×3(这是捕获左/右,上/下,中心概念的最小尺寸)。在其中一种配置中,我们还使用了1×1卷积滤波器,可以看作输入通道的线性变换(后面是非线性)。卷积步长固定为1个像素;卷积层输入的空间填充要满足卷积之后保留空间分辨率,即3×3卷积层的填充为1个像素。空间池化由五个最大池化层进行,这些层在一些卷积层之后(不是所有的卷积层之后都是最大池化)。在2×2像素窗口上进行最大池化,步长为2。各层参数如下图所示。
百万级别
VGG16的模型图如下:
在卷积层(在不同架构中具有不同深度)之后是三个全连接(FC)层:前两个每个都有4096个通道,第三个执行1000维ILSVRC分类,因此包含1000个通道(一个通道对应一个类别)。最后一层是softmax层。所有网络中全连接层的配置是相同的。
所有隐藏层都配备了ReLU。VGGNet网络(除了一个)都不包含局部响应规范化(LRN)因为这种规范化并不能提高在ILSVRC数据集上的性能,但增加了内存消耗和计算时间。
VGGNet将小卷积核带入人们的视线,对比AlexNet中第一个卷积层使用的filter大小为11×11,stride为4,C3和C5层中使用的都是5×5的卷积核;而出现在VGGNet大多数的卷积核的大小均为 3×3,stride均为1。将卷积核的大小缩小的好处为1)减少参数,2)相当于进行了更多的非线性映射,可以增加网络的拟合/表达能力。
For 1: 假设三层3×3卷积堆叠的输入和输出有C个通道,堆叠卷积层的参数为3(32C2)=27C2个权重;然而,单个7×7卷积层将需要72C2=49C2个参数,即参数多81%。这可以看作是对7×7卷积滤波器进行正则化,迫使它们通过3×3滤波器(在它们之间注入非线性)进行分解。
For 2: 多少个串联的小卷积核就对应着多少次激活的过程,而一个大的卷积核就只有一次激活的过程。引入了更多的非线性变换,也就意味着模型的表达能力会更强,可以去拟合更高维的分布。
VGG网络的通道数比AlexNet网络的通道数多,第一层的通道数为64,后面每层都进行了翻倍,最多到512个通道,通道数的增加,使得更多的信息可以被提取出来。
VGG结合1×1卷积层来替换输出前的3个全连接层,以增加决策函数非线性而不影响卷积层的感受野。这使得测试得到的全卷积网络因为没有全连接的限制,因而可以接收任意宽或高的输入。VGGNet使用1×1卷积来在相同维度空间上做线性投影(输入和输出通道的数量相同),再由修正函数对结果非线性化。
通过使用具有动量的小批量(mini-batch)梯度下降优化多项式逻辑回归目标函数来进行训练。批量大小设为256,动量为0.9。训练通过权重衰减进行L2正则化(weight decay=5×10-4),前两个全连接层使用Dropout方法(Dropout比率设定为0.5)。学习率初始设定为10−2,然后当验证集准确率停止改善时,减少10倍。学习率总共降低3次,学习在37万次迭代后停止(74个epochs)。
S定义为归一化训练图像的最小边(训练尺度),VGGNet的输入是从S图像中裁剪得到的。VGGNet训练图像大小的方式有两种,一是修正对应单尺度训练的S,VGGNet针对S=256和S=384进行测试(S=384时使用的是S=256时训练的权重,学习率调整为10-3),二是进行多尺度训练,每个训练图像通过从一定范围(分别为256、512)随机采样S来单独进行归一化。这种过程也可以看做通过尺度抖动使数据集增强。
单一尺度评估结果:
通过分析表3结果,得出如下结论。
多尺度评估结果:
相对于单一尺度评估,多尺度评估提高了分类精度。
与其他模型对比结果:
从上表可以看出,深度VGGNet显著优于前一代模型,在ILSVRC-2012和ILSVRC-2013竞赛中取得了最好的结果。VGGNet取得的结果对于分类任务获胜者(GoogLeNet具有6.7%的错误率)也具有竞争力,并且大大优于ILSVRC-2013获胜者Clarifai,其使用外部训练数据取得了11.2%的错误率,没有外部数据则为11.7%。这是非常显著的,考虑到我们最好的结果是仅通过组合两个模型实现的——明显少于大多数ILSVRC的参赛者。在单网络性能方面,VGG的架构取得了最好结果(7.0%测试误差),超过单个GoogLeNet 0.9%。
意义:VGGNet创新地使用3×3小卷积来代替之前模型中的大卷积,在训练和测试时使用了多尺度评估做数据增强。
优点:VGGNet相比于AlexNet层数更深,参数更多,但是却可以更快的收敛。利用卷积代替全连接,输入可适应各种尺寸的图片。
有了VGG的铺垫,人们开始意识到,为了更好的网络性能,有一条途径就是加深网络的深度和宽度,但是太过于复杂,参数过多的模型就会使得模型在不够复杂的数据上倾向于过拟合,并且过多的参数意味着需要更多的算力,也就是需要更多的时间和更多的钱。Google公司的Christian Szegedy在2015年提出了GoogLeNet,其核心思想是:将全连接,甚至是卷积中的局部连接,全部替换为稀疏连接。原因有二:1)生物神经系统中的连接是稀疏的;2)如果一个数据集的概率分布可以由一个很大、很稀疏的深度神经网络表示时,那么通过分析最后一层激活值的相关统计和对输出高度相关的神经元进行聚类,可以逐层地构建出一个最优网络结构。也就是说,一个深度稀疏网络可以被逐层简化,并且因为保留了网络的统计性质,其表达能力也没有被明显减弱。
但是由于计算机硬件计算稀疏数据的低效性,现在需要提出的是一种,既能保持网络结构的稀疏性,又能利用密集矩阵计算的高效性的方法。大量研究表明,可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,基于此,Inception模块应运而生。
首次出现在ILSVRC 2014的比赛中,以较大优势取得了第一名。该Inception Net通常被称为Inception-v1,它最大的特点是控制了计算量和参数量的同时,获得了非常好的分类性能——top-5错误率6.67%,只有AlexNet的一半不到。Inception V1有22层深,比AlexNet的8层或者VGGNet的19层还要更深。但其计算量只有15亿次浮点运算,同时只有500万的参数量,仅为AlexNet参数量(6000万)的1/12,却可以达到远胜于AlexNet的准确率 。
Inception 模块
这种基本模块使用了3种不同的卷积核,提取到的是3种不同尺度的特征,既有较为宏观的特征又有较为微观的特征,增加了特征的多样性。池化层目的是保留较为原始的输入信息。在模块的输出端将提取到的各种特征在channel维度上进行拼接,得到多尺度的特征feature map。
但是这种naive的版本在进行5×5卷积的时候依然会造成大量的计算成本。为了解决这个问题,引入1×1卷积,它可以跨通道组织信息,提高网络的表达能力,同时可以对输出通道降维以减少计算成本。
改进后的Inception模块如上图b所示,通过1×1卷积来降低通道channal数,把信息聚集起来,再进行计算,有效利用计算力同时进行了非线性化(VGGNet中使用1×1卷积仅是为了非线性化)。4个分支在最后通过一个聚合操作合并(在输出通道数这个维度上聚合)。Inception Module中包含了3种不同尺寸的卷积和1个最大池化,增加了网络对不同尺度的适应性,同时增加了网络的宽度,避免了因网络太深,训练梯度弥散的问题。
GoogLeNet-v1网络结构
其各层详细参数如下表所示:
GoogLeNet-v1网络特点
1)网络中有三个softmax,这是为了减轻在深层网络反向传播时梯度消失的影响,也就是说,整个网络的loss是由三个softmax共同组成的(辅助的两个loss的计算被乘以0.3再与最后的loss相加得到最终的损失函数),这样在反向传播的时候,即使最后一个softmax传播回来的梯度消失了,还有前两个softmax传播回来的梯度进行辅助。在对网络进行测试的时候,这两个额外的softmax将会被拿掉。这样不仅仅减轻了梯度消失的影响,而且加速了网络的收敛;
2)网络最后采用了average pooling来代替全连接层,想法来自NIN,事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家整合(finetune);
3)使用了Inception模块,提高了参数的利用效率,使用1×1卷积来减小计算成本。
GoogLeNet-v1训练与测试结果
在测试中,Christian Szegedy采用比Krizhevsky等人更积极的裁剪方法,将图像归一化为四个尺度,分别为256,288,320和352,取这些归一化的图像的左,中,右方块。对于每个方块,采用4个角以及中心224×224裁剪图像以及方块尺寸归一化为224×224,以及它们的镜像版本。这使得每张图像会得到4×3×6×2 = 144的裁剪图像。
GoogLeNet在ILSVRC2014比赛中以top-5错误率6.67%获得第一。
GoogLeNet凭借其优秀的表现,得到了很多研究人员的学习和使用,因此GoogLeNet团队又对其进行了进一步地发掘改进,产生了升级版本的GoogLeNet(Inception-v2)。GoogLeNet设计的初衷就是要又准又快,而如果只是单纯的堆叠网络虽然可以提高准确率,但是会导致计算效率有明显的下降,所以如何在不增加过多计算量的同时提高网络的表达能力就成为了一个问题。Inception V2版本的解决方案就是修改Inception的内部计算逻辑,提出了比较特殊的“卷积”计算结构。
Incepion-v2卷积分解
大尺寸的卷积核可以带来更大的感受野,但也意味着会产生更多的参数,比如5×5卷积核的参数有25个,3×3卷积核的参数有9个,前者是后者的25/9=2.78倍。因此,GoogLeNet团队提出可以用2个连续的3×3卷积层组成的小网络来代替单个的5×5卷积层,即在保持感受野范围的同时又减少了参数量,如下图:
受这种分解的启发,GoogLeNet团队考虑将卷积核大小进一步缩小为n×1,用3个3×1的卷积核代替卷积,如下图所示:
因此,任意n×n的卷积都可以通过1×n卷积后接n×1卷积来替代。GoogLeNet团队发现在网络的前期使用这种分解效果并不好,在中度大小的特征图(feature map)上使用效果才会更好(特征图大小建议在12到20之间)。于是Inception-v1的结构被改进如下:
Incepion-v2降低特征图大小
一般情况下,如果想让图像缩小,可以有如下两种方式:
但是方法一(左图)先作pooling(池化)会导致特征表示遇到瓶颈(特征缺失),方法二(右图)是正常的缩小,但计算量很大。为了同时保持特征表示且降低计算量,将网络结构改为下图,使用两个并行化的模块来降低计算量(卷积、池化并行执行,再进行合并)
Incepion-v2使用Label Smoothing来对网络输出进行正则化
Softmax层的输出可以用表示(即训练样本x与每个标签匹配的概率),其中表示对数单位或未归一化的对数概率。定义损失函数为,其中为样本在标签上的实际分布且归一化后。假设分类的标签是独热码表示(正确分类q=1,其他类别q=0),则可以反推出整个训练过程收敛时Softmax的正确分类的输入是无穷大,这是一种极其理想的情况,如果让所有的输入都产生这种极其理想的输出,就会过拟合、降低模型的适应能力,即模型过于自信。为了克服过拟合,防止最终出来的正确分类,考虑用来代替标签分布,表示当且仅当时,,否则为0。这种操作被称为标签平滑正则化LSR,它阻止了样本对应实际标签的最大逻辑单元变得比其它逻辑单元更大。在测试中,这样的做法使top-5错误率下降了0.2%。
Incepion-v2网络结构
使用Inception V2作改进版的GoogLeNet,网络结构图如下:
上表中的Figure 5指没有进化的Inception,Figure 6是指小卷积版的Inception(用3×3卷积核代替5×5卷积核),Figure 7是指不对称版的Inception(用1×n、n×1卷积核代替n×n卷积核),在Inception-v2中,抛弃了v1中对LRN的处理过程,训练时间有所缩短。
Incepion-v2训练与测试结果
利用TensorFlow分布式机器学习系统对网络进行随机梯度训练,使用50个副本,每个副本在NVidia Kepler GPU上运行,批次大小32个,共100个epoch。取得最好结果的模型是使用RMSProp优化算法进行训练,其中decay=0.9和ε= 1.0。采用的学习率为0.045,每两个epoch衰减一次。经实验,模型结果与旧的GoogleNet相比有较大提升,如下表所示:
"Inception-v3 = Inception-v2 + Factorization + Batch Normalization"
Inception V3一个最重要的改进是分解(Factorization),将7×7分解成两个一维的卷积(1×7,7×1),3×3也是一样(1×3,3×1),这样的好处,既可以加速计算,又可以将1个卷积拆成2个卷积,使得网络深度进一步增加,增加了网络的非线性(每增加一层都要进行ReLU)。另外,网络输入从224×224变为了299×299。
Batch Normalization批归一化
正如其字面意思,BN就是对每一批数据进行归一化,对于训练中某一个batch的数据(可以是输入数据,也可以是网络中间某一层的输出),BN的前三步如下:
到这步为止,就是一个标准的数据均值除方差的归一化过程。最后,完成下一步便完成了BN的过程:
其中,和是要学习的参数。所以,BN的本质就是利用优化改变一下方差大小和均值的位置,因为需要统计方差和均值,而这两个值是在每个batch的数据上计算的,所以叫做批归一化。在卷积神经网络中,使用批归一化的目的是使激活函数能够更有效地利用输入信息,确保随着模型的训练,层能够持续学习输入的分布,内部协方差不断变小,从而加速训练过程。
Inception-v3是在Inception-v2的基础上增加了分解、批归一化的方法,主体结构与Inception-v2并无太大区别,测试结果的对比图如下:
上图是作者在MMIST上,实现的3层全连接层,每层有100个神经元,激活函数使用的是sigmoid,权重被初始化为很小的高斯分布的随机数。最后一层接linear+softmax层来分类。训练50000 step,mini-batch大小为60。图中展示了分类的准确度,可以看出,BN后的网络准确率更高,收敛速度更快。
上图是各个模型在ILSVRC 2012上测试结果的对比情况:
Inception: Inception v1,初始学习速率为0.0015
BN-Baseline: Inception的激活函数前加BN
BN-x5: 在BN-Baseline基础上,将初始学习速率增大5倍:0.0075
BN-x30: 在BN-x5基础上,将初始学习速率从Inception的0.0015增大30倍:0.045
BN-x5-sigmoid: 在BN-x5基础上,将ReLU激活函数改为sigmoid
可以看出,使用了BN的网络在达到较高准确率所需的时间会大大减少。
意义:跳出了LeNet-5卷积、激活函数、池化传统结构,提出了Inception模块,网络更深。GoogLeNet解决了传统网络参数空间大,容易过拟合,且训练数据集有限;网络结构复杂,计算资源不足,导致难以应用;深层次网络结构容易出现梯度弥散,模型性能下降等问题,为图像识别领域的发展贡献巨大的力量。
ResNet在2015年被Kaiming He提出,在ImageNet比赛classification任务上获得第一名,因为它“简单与实用”并存,之后很多方法都建立在ResNet50或者ResNet101的基础上完成的,检测,分割,识别等领域都纷纷使用ResNet。ResNet所解决的问题是在网络越来越深的过程中,可能出现的梯度弥散或梯度爆炸,解决方法是提出了残差块的模型。
理论上讲,深度加深,网络的表现能力会越强,但是过深的网络可能会退化,如下图所示:
随着网络深度的增加,准确率达到饱和(这可能并不奇怪)然后迅速下降。意外的是,这种下降不是由过拟合引起的,并且在适当的深度模型上添加更多的层会导致更高的训练误差。
Kaiming He提出了残差学习来解决深度网络中的退化问题。假设多个非线性层可以渐近地近似复杂函数,它等价于假设它们可以渐近地近似残差函数,即 (假设输入输出是相同维度)。因此,残差学习就是明确让网络中的隐藏层近似残差函数,而不是近似。因此原始函数变为。尽管两种形式应该都能渐近地近似要求的函数(如假设),但学习的难易程度是不同的。
残差学习相比直接学习原始特征更容易。当残差为0时,此时堆积层仅仅做了恒等映射,至少网络性能不会下降。实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能。残差学习的结构上图右所示。这有点类似与电路中的“短路”,所以是一种短路连接(shortcut connection)。简单地说,就是将网络第l层的输入直接连接到第层激活函数之前。
ResNet-34以VGG19结构为基础,使用了许多Residual Block来构建网络,当两层间输入和输出特征的维度相同时,输出可以用表示,其中表示层的线性激活输出);若两层间输入和输出特征维度不同时,输出用表示,其中是将输入向量转换成输出向量同维的匹配矩阵。
在ResNet-152中,采取的Residual Block的形式如上图右所示。由于层数更多,故在每一个Residual Block中采用了1×1卷积核来减小参数和计算量。 不同层数的ResNet结构如下图所示:
其中layer数目不包括激活函数以及池化层。
在ISLVRC2012测试集上测试,用plain与ResNet进行比较,结果如下:
在ImageNet验证集上,ResNet-152单一结构的top-5错误率达到了4.49%,这一结果与人类水平相当。
对比