经典卷积神经网络AlexNet原理详细介绍

 

《ImageNet Classification with Deep Convolutional Neural Networks》

这篇文章的网络是在2012年的ImageNet竞赛中取得冠军的一个模型整理后发表的文章。作者是多伦多大学的Alex Krizhevsky等人。AlexNet是由Alex Krizhevsky 提出的首个应用于图像分类的深层卷积神经网络。在这之前,常见的第一个CNN网络结构LeNet5并不被人所熟知,本文所提出的AlexNet才引起了大家对于CNN的注意。在这之后。越来越多更深层次的网络结构被提出,使得CNN成为了成为了图像领域的核心算法。

这篇文章是本人对于这一网络学习之后的一点记录,算是学习笔记,如果有不对之处欢迎大家指正。

1.论文里提出的模型结构

经典卷积神经网络AlexNet原理详细介绍_第1张图片

 

怎么看这幅图呢?前面是5个卷积层(图示虚线部分所示),后面是三个全连接层(图中实线所示)。首先这幅图分为上下两个部分的网络,论文中提到这两部分网络是分别对应两个GPU,只有到了特定的网络层后才需要两块GPU进行交互,这种设置完全是利用两块GPU来提高运算的效率,其实在网络结构上差异不是很大。对网络细节做一下简单的梳理:

AlexNet共分为8层结构,其中前5层为卷积层,后面3层为全连接层;
AlexNet采用两路GTX 580 3G并行训练;
AlexNet在第2,4,5层均是前一层自己GPU内连接,第3层是与前面两层全连接,全连接是2个GPU。

2.AlexNet的一些亮点

1.AlexNet在双gpu上运行,每个gpu负责一半网络的运算.训练速度得到提升,大概是使用CPU的20~50倍;

2.激活函数使用了非线性非饱和的ReLU函数,而不是传统的非线性饱和函数(如sigmoid函数,tanh函数),在训练阶段梯度衰减更快;

3.采用局部响应归一化(LRN)。对于非饱和函数ReLU来说,不需要对其输入进行标准化,而ReLU激活函数得到的值域没有一个区间,所以要对ReLU得到的结果进行归一化。也就是Local Response Normalization(LRN),形成横向抑制,提升泛化能力。论文作者发现进行局部标准化能提高性能,但之后又说作用不大。。

4.池化采用overlapping pooling。即池化窗口的大小大于步长,使得每次池化都有重叠的部分。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。论文说,在训练模型过程中,覆盖的池化层更不容易过拟合;

5.训练时使用Dropout随机失活一部分神经元,以避免模型过拟合,论文作者主要是在最后几个全连接层使用了Dropout,因为全连接层的参数更多;

6.数据增强,防止过拟合的最简单的方法,对原始数据进行适当变换,就会得到更多有差异的数据集,防止过拟合。论文提到的两种方法:镜像反射和随机剪裁。随机剪裁是原图片以及他们水平方向的映像大小为256*256中随机提取224*224的图片。

3.模型结构详解

介绍模型结构前先给出经卷积核卷积后的矩阵大小计算公式:

gif.latex?N%3D%5Ctfrac%7BW-F+2P%7D%7BS%7D+1

padding后矩阵大小的两种计算公式: 

padding=‘VALID:gif.latex?N%3D%5Cfrac%7BW-F+1%7D%7BS%7D’[向上取整]

 

padding=‘same:’gif.latex?N%3D%5Cfrac%7BW%7D%7BS%7D[向上取整]

W:输入图片大小W*W

F:卷积核大小F*F

S:步长stride

P:padding

 

经典卷积神经网络AlexNet原理详细介绍_第2张图片

第一层卷积 

第一层输入数据为原始的227*227*3的图像,这个图像被kernel_size=11*11*3的卷积核进行卷积运算,卷积核沿原始图像的x轴方向和y轴方向两个方向移动,移动的步长strides=4。因此,卷积核在移动的过程中会生成55个像素。共有96个卷积核,会生成55*55*96个卷积后的像素层。96个卷积核分成2组,每组48个卷积核。对应生成2组55*55*48的卷积后的像素层数据,这些像素层经过ReLU处理,生成激活像素层,尺寸仍为2组55*55*48的像素层数据。

池化运算,max_pooling, pool_size = (3, 3), stride = 2,池化后像素的规模为27*27*96。这96层像素层分为2组,每组48个像素层,每组在一个独立的GPU上进行运算。

第二层卷积 

第二层输入数据为第一层输出的27*27*96的像素层,为便于后续处理,padding=[2,2],即每幅像素层的左右两边和上下两边都填充2个像素;27*27*96的像素数据分成27*27*48的两组像素数据,两组数据分别再两个不同的GPU中进行运算。每组像素数据被kernel_size=5*5的卷积核进行卷积运算。卷积核沿原始图像的x轴方向和y轴方向两个方向移动,移动的步长为stride=1。因此,卷积核在移动的过程中会生成27个像素,共有256个5*5的卷积核;这256个卷积核分成两组,每组针对一个GPU中的27*27*48的像素进行卷积运算。会生成两组27*27*128个卷积后的像素层。这些像素层经过ReLU处理,生成激活像素层,尺寸仍为两组27*27*128的像素层。

池化运算,max_pooling, pool_size = (3, 3), stride = 2,池化后像素的规模为2组13*13*128的像素层,这256层像素层分为2组,每组128个像素层每组在一个GPU上进行运算。

第三层卷积

第三层输入数据为第二层输出的13*13*256的像素层,为便于后续处理,padding=[1,1],即每幅像素层的左右两边和上下两边都填充1个像素;13*13*256的像素数据分成13*13*128的两组像素数据,两组数据分别再两个不同的GPU中进行运算。每组像素数据被kernel_size=3*3的卷积核进行卷积运算。卷积核沿原始图像的x轴方向和y轴方向两个方向移动,移动的步长为stride=1。因此,卷积核在移动的过程中会生成13个像素,共有384个3*3的卷积核;这256个卷积核分成两组,每组针对一个GPU中的13*13*128的像素进行卷积运算。会生成两组13*13*192个卷积后的像素层。这些像素层经过ReLU处理,生成激活像素层,尺寸为两组13*13*192的像素层。

第四层卷积

第四层输入数据为第三层输出的13*13*384的像素层,为便于后续处理,padding=[1,1],即每幅像素层的左右两边和上下两边都填充1个像素;13*13*394的像素数据分成13*13*192的两组像素数据,两组数据分别再两个不同的GPU中进行运算。每组像素数据被kernel_size=3*3的卷积核进行卷积运算。卷积核沿原始图像的x轴方向和y轴方向两个方向移动,移动的步长为stride=1。因此,卷积核在移动的过程中会生成13个像素,共有384个3*3的卷积核;这256个卷积核分成两组,每组针对一个GPU中的13*13*192的像素进行卷积运算。会生成两组13*13*192个卷积后的像素层。这些像素层经过ReLU处理,生成激活像素层,尺寸为两组13*13*192的像素层。

池化运算,max_pooling, pool_size = (3, 3), stride = 2,池化后像素的规模为2组13*13*128的像素层,这256层像素层分为2组,每组128个像素层每组在一个GPU上进行运算。

第五层卷积

第五层输入数据为第四层输出的13*13*384的像素层,为便于后续处理,padding=[1,1],即每幅像素层的左右两边和上下两边都填充1个像素;13*13*384的像素数据分成13*13*192的两组像素数据,两组数据分别再两个不同的GPU中进行运算。每组像素数据被kernel_size=3*3的卷积核进行卷积运算。卷积核沿原始图像的x轴方向和y轴方向两个方向移动,移动的步长为stride=1。因此,卷积核在移动的过程中会生成13个像素,共有256个3*3的卷积核;这256个卷积核分成两组,每组针对一个GPU中的13*13*192的像素进行卷积运算。会生成两组13*13*128个卷积后的像素层。这些像素层经过ReLU处理,生成激活像素层,尺寸为两组13*13*128的像素层。

池化运算,max_pooling, pool_size = (3, 3), stride = 2,池化后像素的规模为2组6*6*128的像素层,这256层像素层分为2组,每组128个像素层每组在一个GPU上进行运算。

第六层全连接

第六层输入数据的是6*6*256的像素层,采用6*6*256尺寸的滤波器对第六层的输入数据进行卷积运算,每个滤波器对第六层的输入数据进行卷积运算生成一个运算结果,通过一个神经元输出这个运算结果,共有4096个6*6*256的滤波器对输入数据进行卷积运算,通过4096个神经元输出运算结果,这4096个运算结果通过ReLU激活函数生成4096个值,并通过dropout运算后输出4096个本层的输出结果值。由于第六层的运算过程中,采用的滤波器的尺寸(6*6*256)与待处理的feature map的尺寸(6*6*256)相同,即滤波器中的每个系数只与feature map中的一个像素值相乘;而其它卷积层中,每个滤波器的系数都会与多个feature map中像素值相乘;因此,将第六层称为全连接层。

 第七层全连接

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

 第八层全连接

第七层输出的4096个数据与第八层的1000个神经元进行全连接,经过训练后输出被训练的数值。最终输出softmax为1000,因为ImageNet这个比赛的分类个数为1000。

4.AlexNet为啥取得比较好的结果

  • ReLU(Rectified Linear Units) f(x)=max(0,x)。基于ReLU的深度卷积网络比基于tanh的网络训练块衰减快数倍,下图是一个基于CIFAR-10的四层卷积网络在tanh和ReLU达到25%的training error的迭代次数:(图片来自于网络。侵删)

经典卷积神经网络AlexNet原理详细介绍_第3张图片

实线、间断线分别代表的是ReLU、tanh的training error,可见ReLU比tanh能够更快的收敛。 

 

  • LRN公式如下:

7a18705048974cd760760b0748b2615b.png

ReLU输出的结果和它周围一定范围的邻居做一个局部的归一化。(图片来自于网络。侵删)

  • Dropout

在神经网络中Dropout通过修改神经网络本身结构来实现。对于某一层神经元,通过定义的概率来随机删除一些神经元,同时保持输入层与输出层神经元的个数不变,然后按照神经网络的学习方法进行参数更新,下一次迭代中,重新随机删除一些神经元,直至训练结束(图片来自于网络。侵删)。

经典卷积神经网络AlexNet原理详细介绍_第4张图片

  • Data Augmentation(图像增强)

防止模型过拟合的最简单的方法之一是增加数据,但是其实增加数据也是有策略的,论文从256*256中随机提出227*227的数据,还有就是通过PCA(主成分分析)来扩展数据集。

 

 

 

你可能感兴趣的:(目标分类网络,人工智能,cnn,神经网络)