卷积神经网络之AlexNet - SUSTC-XLAB/crops GitHub Wiki
AlexNet是什么
AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计的卷积神经网络算法,这个算法以巧妙的手法打破对神经网络的旧观念,不仅开创了图像识别的新局面,更引爆了Deep Learning的热潮。在AlexNet的基础上,全球多个团队开展了更为深入的研究,并开发出GoogleNet等更优秀的算法,因此学习AlexNet算法对于研究卷积神经网络具有重要的价值。本文将回顾AlexNet的架构并讨论它的主要贡献。
AlexNet的技术突破
AlexNet之所以能一石激起千层浪,开拓CNN在图像识别的领导地位,主要是其使用了大量的新技术。
(1)成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题,虽然ReLU激活函数在很久之前就被提出了,但是直到AlexNet的出现才将其发扬光大。
(2)训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果,在AlexNet中主要是最后几个全连接层使用了Dropout。
(3)在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
(4)提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
(5)使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半的神经元的参数。因为GPU之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。
(6)数据增强,随机地从256x256的原始图像中截取224x224大小的区域(以及水平翻转的镜像),相当于增加了2x(256-224)^2=2048倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值。同时,AlexNet论文中提到了会对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个方法可以让错误率再下降1%。
AlexNet架构
AlexNet架构如下图所示,由5个卷积层和3个全连接层组成。
总体概述如下:
-
AlexNet为8层结构,其中前5层为卷积层,后面3层为全连接层;学习参数有6千万个,神经元有650,000个
-
AlexNet在两个GPU上运行;
-
AlexNet在第2,4,5层均是前一层自己GPU内连接,第3层是与前面两层全连接,全连接是2个GPU全连接;
-
RPN层第1,2个卷积层后;
-
Max pooling层在RPN层以及第5个卷积层后;
-
ReLU在每个卷积层以及全连接层后。
第一层分析
第一层输入数据为原始图像的227x227x3的图像(最开始是224x224x3,为后续处理方便必须进行调整),这个图像被11x11x3(3代表深度,例如RGB的3通道)的卷积核进行卷积运算,卷积核对原始图像的每次卷积都会生成一个新的像素。卷积核的步长为4个像素,朝着横向和纵向这两个方向进行卷积。由此,会生成新的像素;(227-11)/4+1=55个像素(227个像素减去11,正好是54,即生成54个像素,再加上被减去的11也对应生成一个像素),由于第一层有96个卷积核,所以就会形成55x55x96个像素层,系统是采用双GPU处理,因此分为2组数据:55x55x48的像素层数据。重叠pool池化层:这些像素层还需要经过pool运算(池化运算)的处理,池化运算的尺度由预先设定为33,运算的步长为2,则池化后的图像的尺寸为:(55-3)/2+1=27。即经过池化处理过的规模为27x27x96.局部响应归一化层(LRN):最后经过局部响应归一化处理,归一化运算的尺度为55;第一层卷积层结束后形成的图像层的规模为27x27x96.分别由96个卷积核对应生成,这96层数据氛围2组,每组48个像素层,每组在独立的GPU下运算。
第二层分析
第二层输入数据为第一层输出的272796的像素层(为方便后续处理,这对每幅像素层进行像素填充),分为2组像素数据,两组像素数据分别在两个不同的GPU中进行运算。每组像素数据被5548的卷积核进行卷积运算,同理按照第一层的方式进行:(27-5+22)/1+1=27个像素,一共有256个卷积核,这样也就有了2727128两组像素层。重叠pool池化层:同样经过池化运算,池化后的图像尺寸为(27-3)/2+1=13,即池化后像素的规模为2组1313*128的像素层。局部响应归一化层(LRN):最后经过归一化处理,分别对应2组128个卷积核所运算形成。每组在一个GPU上进行运算。即共256个卷积核,共2个GPU进行运算。
第三层分析
第三层输入数据为第二层输出的两组1313128的像素层(为方便后续处理,这对每幅像素层进行像素填充),分为2组像素数据,两组像素数据分别在两个不同的GPU中进行运算。每组像素数据被33128的卷积核(两组,一共也就有33256)进行卷积运算,同理按照第一层的方式进行:(13-3+12)/1+1=13个像素,一共有384个卷积核,这样也就有了1313*192两组像素层。
第四层分析
第四层输入数据为第三层输出的两组1313192的像素层(为方便后续处理,这对每幅像素层进行像素填充),分为2组像素数据,两组像素数据分别在两个不同的GPU中进行运算。每组像素数据被33192的卷积核进行卷积运算,同理按照第一层的方式进行:(13-3+12)/1+1=13个像素,一共有384个卷积核,这样也就有了1313*192两组像素层。
第五层分析
第五层输入数据为第四层输出的两组1313192的像素层(为方便后续处理,这对每幅像素层进行像素填充),分为2组像素数据,两组像素数据分别在两个不同的GPU中进行运算。每组像素数据被33192的卷积核进行卷积运算,同理按照第一层的方式进行:(13-3+12)/1+1=13个像素,一共有256个卷积核,这样也就有了1313128两组像素层。重叠pool池化层:进过池化运算,池化后像素的尺寸为(13-3)/2+1=6,即池化后像素的规模变成了两组66128的像素层,共66*256规模的像素层。
第六层分析
第6层输入数据的尺寸是66256,采用66256尺寸的滤波器对第六层的输入数据进行卷积运算;每个66256尺寸的滤波器对第六层的输入数据进行卷积运算生成一个运算结果,通过一个神经元输出这个运算结果;共有4096个66256尺寸的滤波器对输入数据进行卷积,通过4096个神经元的输出运算结果;然后通过ReLU激活函数以及dropout运算输出4096个本层的输出结果值。很明显在第6层中,采用的滤波器的尺寸(66256)和待处理的feature map的尺寸(66256)相同,即滤波器中的每个系数只与feature map中的一个像素值相乘;而采用的滤波器的尺寸和待处理的feature map的尺寸不相同,每个滤波器的系数都会与多个feature map中像素相乘。因此第6层被称为全连接层。
第七层分析
第6层输出的4096个数据与第7层的4096个神经元进行全连接,然后经由ReLU和Dropout进行处理后生成4096个数据。
第八层分析
第7层输入的4096个数据与第8层的1000个神经元进行全连接,经过训练后输出被训练的数值。
Reference
Krizhevsky A, Sutskever I, Hinton G E. ImageNet classification with deep convolutional neural networks[C]// International Conference on Neural Information Processing Systems. Curran Associates Inc. 2012:1097-1105.