首页 理论教育 深入解析CNN中的AlexNet模型

深入解析CNN中的AlexNet模型

时间:2023-06-21 理论教育 版权反馈
【摘要】:表2-54事故配压阀性能参数AlexNet使用了GTX580的GPU进行训练,由于单个GTX580 GPU只有3GB内存,限制了在其上训练的网络的最大规模,因此在每个GPU中放置的核,将网络分布在两个GPU上进行并行计算,大大加快了AlexNet的训练速度。

深入解析CNN中的AlexNet模型

下面以CNN经典模型——AlexNet模型讲述深度学习工作原理。2012年,Alex Krizhevsky、Ilya Sutskever在加拿大多伦多大学Geoff Hinton的实验室设计出了一个深层的卷积神经网络AlexNet,夺得了2012年ImageNet LSVRC的冠军,并且表现远超第二名,达到最低的5.3%的Top-5错误率,比第二名低10.8%,引起了很大的轰动。AlexNet可以说是具有历史意义的一个网络结构,在此之前,深度学习已经沉寂了很长时间。自2012年AlexNet诞生之后,后面的ImageNet冠军都是用CNN来做的,并且层次越来越深,使得CNN成为图像识别分类的核心算法模型,带来了深度学习的大爆发[11]

1.AlexNet模型的特点

AlexNet之所以能够成功,跟这个模型设计的特点有关,主要有:使用了非线性激活函数ReLU;防止过拟合的方法:Dropout和数据扩充;重叠池化:多GPU实现,使用LRN归一化层。

1)使用ReLU激活函数

传统的神经网络普遍使用Sigmoid或者tanh等非线性函数作为激励函数,然而它们容易出现梯度弥散或梯度饱和的情况。以Sigmoid函数为例,当输入的值非常大或者非常小时,这些神经元的梯度接近于0,称为梯度饱和现象。如果输入的初始值很大,梯度在反向传播时因为需要乘上一个Sigmoid导数,会造成梯度越来越小,导致网络变得很难学习[12]

在AlexNet中,使用了ReLU激活函数,该函数的公式为:f(x)=max(0,x),当输入信号小于0时,输出都是0;当输入信号大于0时,输出等于输入,如图7-10所示。

图7-10 ReLU激活函数

使用ReLU替代Sigmoid/tanh,由于ReLU是线性的,且导数始终为1,计算量大大减少,收敛速度会比Sigmoid/tanh快很多。

2)数据扩充

有一种观点认为神经网络是靠数据喂出来的,如果能够增加训练数据,提供海量数据进行训练,则能够有效提升算法的准确率,因为这样可以避免过拟合,从而可以进一步增大、加深网络结构。而当训练数据有限时,可以从已有的训练数据集中通过一些变换生成一些新的数据,以快速扩充训练数据。其中,最简单、通用的图像数据变形的方式为水平翻转图像,即从原始图像中随机裁剪、平移变换以及颜色、光照变换等,如图7-11所示。

图7-11 图像数据变形

(a)水平翻转,随机裁剪、平移交换;(b)颜色、光照变换

AlexNet在训练时,数据扩充是按下面的方法处理的。

(1)随机裁剪:对256×256像素的图片进行随机裁剪到224×224像素,然后进行水平翻转,相当于将样本数量增加了((256-224)2)×2=2 048倍。

(2)测试时,对左上、右上、左下、右下、中间分别做了5次裁剪,然后翻转,共10个裁剪,之后对结果求平均。通过随机裁剪,可以有效避免过拟合。

(3)对定义空间做主成分分析(Principal Component Analysis,PCA),然后对主成分做一个(0,0.1)的高斯扰动,也就是对颜色、光照做变换,结果使错误率又下降了1%。

3)重叠池化

一般的池化是不重叠的,池化区域的窗口大小与步长相同,如图7-12所示。

图7-12 一般的池化

在AlexNet中使用的池化却是可重叠的,也就是说,在池化时,每次移动的步长小于池化的窗口长度。AlexNet池化的大小为3×3的正方形,每次池化移动步长为2,这样就会出现重叠。重叠池化可以避免过拟合,这个策略贡献了0.3%的top5错误率。

4)局部归一化(Local Response Normalization,LRN)

神经生物学有一个概念叫做“侧抑制”,指的是被激活的神经元抑制相邻神经元。归一化的目的是“抑制”,局部归一化就是借鉴了“侧抑制”的思想来实现局部抑制,尤其当使用ReLU时这种“侧抑制”很有效[13],因为ReLU的响应结果是无界的(可以非常大),所以需要归一化。使用局部归一化的方案有助于增强泛化能力。

LRN的公式如下,其核心思想是利用邻近的数据做归一化,这个策略贡献了1.2%的top5错误率:

式中:表示使用核i作用于(x,y),然后再采用ReLU非线性函数计算得到的活跃度;n为该层的核的总数目;常数k,n,α,β为超参数,它们的值使用一个验证集来确定。

5)引入Dropout

引入Dropout主要是为了防止过拟合。在神经网络中Dropout通过修改神经网络本身结构来实现,对于某一层的神经元,通过定义的概率将神经元置为0,这个神经元就不参与前向和后向传播,如同在网络中被删除了一样,同时保持输入层与输出层神经元的个数不变,然后按照神经网络的学习方法进行参数更新。在下一次迭代中,又重新随机删除一些神经元(置为0),直至训练结束。

Dropout是AlexNet中一个很大的创新,以至于“神经网络之父”Hinton在后来很长一段时间里的演讲中都拿Dropout举例。Dropout也可以看成是一种模型组合,每次生成的网络结构都不一样,通过组合多个模型的方式能够有效地减少过拟合,Dropout只需要两倍的训练时间即可实现模型组合(类似于取平均)的效果,非常高效。Dropout原理如图7-13所示。

图7-13 Dropout原理

(a)完整网络(非Dropout);(b)Dropout

6)多GPU训练

AlexNet使用了GTX580的GPU进行训练,由于单个GTX580 GPU只有3GB内存,限制了在其上训练的网络的最大规模,因此在每个GPU中放置的核(或神经元),将网络分布在两个GPU上进行并行计算,大大加快了AlexNet的训练速度。

2.AlexNet网络结构的逐层解析

AlexNet的网络结构图如图7-3所示。AlexNet网络结构共有8层,前面5层是卷积层,后面3层是全连接层,最后一个全连接层的输出传递给一个1 000路的softmax层,对应1 000个类标签的分布。

由于AlexNet采用了两个GPU进行训练,因此,该网络结构图由上下两部分组成,一个GPU运行图上方的层,另一个GPU运行图下方的层,两个GPU只在特定的层通信。例如,第二、第四、第五层卷积层的核只和同一个GPU上的前一层的核特征图相连,第三层卷积层和第二层所有的核特征图相连接,全连接层中的神经元和前一层中的所有神经元相连接。

1)第一层(卷积层)(www.xing528.com)

该层的处理流程为卷积→ReLU→池化→归一化。

(1)卷积:输入的原始图像大小为224×224×3像素(RGB图像),在训练时会经过预处理变为227×227×3像素。在本层使用96个11×11×3像素的卷积核进行卷积计算,生成新的像素。由于采用了两个GPU并行运算,因此,网络结构图中上下两个部分分别承担了48个卷积核的运算。

卷积核在图像上按一定步长沿x轴方向、y轴方向移动计算卷积,然后生成新的特征图,其大小为:floor((img_size-filter_size)/stride)+1=new_feture_size,其中floor表示向下取整,img_size为图像大小,filter_size为核大小,stride为步长,new_feture_size为卷积后的特征图大小,这个公式为图像尺寸减去卷积核尺寸,再除以步长,然后加上被减去的核大小像素对应生成的一个像素,结果是卷积后特征图的大小。

AlexNet中本层的卷积移动步长是4个像素,卷积核经移动计算后生成的特征图大小为(227-11)/4+1=55像素,即55×55像素。

(2)ReLU:卷积后的55×55像素层经过ReLU单元的处理,生成激活像素层,尺寸仍为两组55×55×48的像素层数据。

(3)池化:RuLU后的像素层再经过池化运算,池化运算的尺寸为3×3,步长为2,则池化后图像的尺寸为(55-3)/2+1=27像素,即池化后像素的规模为27×27×96。

(4)归一化:池化后的像素层再进行归一化处理,归一化运算的尺寸为5×5,归一化后的像素规模不变,仍为27×27×96,这96层像素层被分为两组,每组48个像素层,分别在一个独立的GPU上进行运算。

2)第二层(卷积层)

该层与第一层类似,处理流程为卷积→ReLU→池化→归一化。

(1)卷积:第二层的输入数据为第一层输出的27×27×96的像素层(分成两组27×27×48的像素层放在两个不同GPU中进行运算),为方便后续处理,在这里每幅像素层的上下左右边缘都被填充了2个像素(填充0),即图像的大小变为(27+2+2)×(27+2+2)像素。第二层的卷积核大小为5×5,移动步长为1个像素,与第一层第(1)点的计算公式一样,经卷积核计算后的像素层大小变为(27+2+2-5)/1+1=27,即卷积后大小为27×27像素。

本层使用了256个5×5×48的卷积核,同样也是被分成两组,每组为128个,分给两个GPU进行卷积运算,结果生成两组27×27×128个卷积后的像素层。

(2)ReLU:这些像素层经过ReLU单元的处理,生成激活像素层,尺寸仍为两组27×27×128的像素层。

(3)池化:再经过池化运算的处理,池化运算的尺寸为3×3,步长为2,池化后图像的尺寸为(57-3)/2+1=13,即池化后像素的规模为两组13×13×128的像素层。

(4)归一化:然后再经过归一化处理,归一化运算的尺度为5×5,归一化后的像素层的规模为两组13×13×128的像素层,分别由两个GPU进行运算。

3)第三层(卷积层)

第三层的处理流程为卷积→ReLU。

(1)卷积:第三层输入数据为第二层输出的两组13×13×128的像素层,为了便于后续处理,每幅像素层的上下左右边缘都填充1个像素,填充后变为(13+1+1)×(13+1+1)×128,分布在两个GPU中进行运算。这一层中每个GPU都有192个卷积核,每个卷积核的尺寸是3×3×256。因此,每个GPU中的卷积核都能对两组13×13×128的像素层的所有数据进行卷积运算。每个GPU要处理来自前一层的所有GPU的输入。本层卷积的步长是1个像素,经过卷积运算后的尺寸为(13+1+1-3)/1+1=13,即每个GPU中共13×13×192个卷积核,两个GPU中共有13×13×384个卷积后的像素层。

(2)ReLU:卷积后的像素层经过ReLU单元的处理,生成激活像素层,尺寸仍为两组13×13×192的像素层,分配给两组GPU处理。

4)第四层(卷积层)

与第三层类似,第四层的处理流程为卷积→ReLU。

(1)卷积:第四层输入数据为第三层输出的两组13×13×192的像素层,类似于第三层,为了便于后续处理,每幅像素层的上下左右边缘都填充1个像素,填充后的尺寸变为(13+1+1)×(13+1+1)×192,分布在两个GPU中进行运算。

这一层中每个GPU都有192个卷积核,每个卷积核的尺寸是3×3×192,与第三层不同,第四层的GPU之间没有通信。卷积的移动步长是1个像素,经卷积运算后的尺寸为(13+1+1-3)/1+1=13,每个GPU中有13×13×192个卷积核,两个GPU卷积后生成13×13×384的像素层。

(2)ReLU:卷积后的像素层经过ReLU单元处理,生成激活像素层,尺寸仍为两组13×13×192像素层,分配给两个GPU处理。

5)第五层(卷积层)

第五层的处理流程为卷积→ReLU→池化。

(1)卷积:第五层输入数据为第四层输出的两组13×13×192的像素层,为了便于后续处理,每幅像素层的上下左右边缘都填充1个像素,填充后的尺寸变为(13+1+1)×(13+1+1),两组像素层数据被送至两个不同的GPU中进行运算。这一层中每个GPU都有128个卷积核,每个卷积核的尺寸是3×3×192,卷积的步长是1个像素,经卷积后的尺寸为(13+1+1-3)/1+1=13,每个GPU中有13×13×128个卷积核,两个GPU卷积后生成13×13×256的像素层。

(2)ReLU:卷积后的像素层经过ReLU单元处理,生成激活像素层,尺寸仍为两组13×13×128像素层,由两个GPU分别处理。

(3)池化:两组13×13×128像素层分别在两个不同GPU中进行池化运算处理,池化运算的尺寸为3×3,步长为2,池化后图像的尺寸为(13-3)/2+1=6,即池化后像素的规模为两组6×6×128的像素层数据,共有6×6×256的像素层数据。

6)第六层(全连接层)

第六层的处理流程为卷积(全连接)→ReLU→Dropout。

(1)卷积(全连接):第六层输入数据是第五层的输出,尺寸为6×6×256像素。本层共有4 096个卷积核,每个卷积核的尺寸为6×6×256,由于卷积核的尺寸刚好与待处理特征图(输入)的尺寸相同,即卷积核中的每个系数只与特征图(输入)尺寸的一个像素值相乘,一一对应,因此,该层被称为全连接层。由于卷积核与特征图的尺寸相同,卷积运算后只有一个值。因此,卷积后的像素层尺寸为4 096×1×1,即有4 096个神经元。

(2)ReLU:这4 096个运算结果通过ReLU激活函数生成4 096个值。

(3)Dropout:再通过Dropout运算,输出4 096个结果值。

7)第七层(全连接层)

第七层的处理流程为全连接→ReLU→Dropout。

第六层输出的4 096个数据与第七层的4 096个神经元进行全连接,然后经ReLU进行处理后生成4 096个数据,再经过Dropout处理后输出4 096个数据。

8)第八层(全连接层)

第八层的处理流程为全连接。

第七层输出的4 096个数据与第八层的1 000个神经元进行全连接,经过训练后输出的1 000个浮点型数值为最终结果。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈