卷积神经网络之AlexNet网络详解

一  介绍

Alex Krizhevsky等人训练了一个大型的卷积神经网络用来把ImageNet LSVRC-2010比赛中120万张高分辨率的图像分为1000个不同的类别。在测试卷上,获得很高准确率(top-1 and top-5 error rates of 37.5%and 17.0% ).。通过改进该网络,在2012年ImageNet LSVRC比赛中夺取了冠军,且准确率远超第二名(top-5 test error rate of 15.3%,第二名26.2%。这在学术界引起了很大的轰动,开启了深度学习的时代,虽然后来大量比AlexNet更快速更准确的卷积神经网络结构相继出现,但是AlexNet作为开创者依旧有着很多值得学习参考的地方,它为后续的CNN甚至是R-CNN等其他网络都定下了基调,所以下面我们将从AlexNet入手,理解卷积神经网络的一般结构。

AlexNet网络包括了6000万个参数和65000万个神经元,5个卷积层,在一些卷积层后面还有池化层,3个全连接层,输出为 的softmax层。

 

二 数据集

实验采用的数据集是ImageNet。ImageNet是超过1500万个标记的高分辨率图像的数据集,大约有22,000个类别。这些图像是从网上收集的,并使用亚马逊的Mechanical Turk众包服务进行了标记。从2010年开始,举办ILSVRC比赛,数据使用的是ImageNet的 一个子集,每个类别大约有1000个图像,总共有1000个类别。总共有大约120万个训练图像,50000个验证图像,以及150000个测试图像。ImageNet比赛给出两个错误率,top-1和top-5,top-5错误率是指你的模型预测的概率最高的5个类别中都不包含正确的类别。ImageNet由可变分辨率的图像组成,而神经网络输入维度是固定的。 因此,我们将图像下采样到256×256的固定分辨率矩形图像,我们首先重新缩放图像,使短边长度为256,然后从结果图像中裁剪出中心256×256的图片。 我们没有预先处理图像以任何其他方式,我们在像素的原始RGB值上训练了我们的网络。

 

三 ReLU激活函数

在此之前,神经元的激活函数一般选择sigmoid或者tanh,然而在该论文中选择的是ReLU(修正线性单元),用这个激活函数其训练速度要比传统的神经网络快几倍,4层的卷积神经网络在CIFAR-10数据集上测试,当训练集 的错误率达到25%时,使用ReLU的速度要比tanh快6倍,如下图所示 :

 

四 局部归一化( Local Response Normalization)

AlexNet在激活函数之外又使用了局部归一化,公式如下:

其中a_{x,y}^{i}表示第i个卷积在(x,y)产生的值然后应用ReLU激活函数的结果,n表示相邻的几个卷积核,N表示这一层总的卷积核数量。k,n,α,β都是超参数,他们的值是在验证集实验上得到的,k=2,n=5,α=1e-4,β=0.75.这种归一化操作实现了某种形式的横向抑制,这也是真实神经元的某种行为启发。这种具有对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得更大,而对响应比较小的值更加加以抑制,从而增强模型的泛化能力,这和让更加明显的特征更加明显,很细微不明显的特征加以抑制是一个道理。

后来证明该步骤起到的作用很小,所以后来就很少使用。

 

五 重叠pooling(overlap pooling)

通常情况下,在卷积神经网络中我们设置池化层参数为步幅s=2,窗口大小f=2,这相当于对图像进行下采样,而AlexNet使用了重叠的池化层,设置s=2,f=3。在这以前大部分是使用平均池化,到了Alexnet中就全部使用最大池化(max pool),这可以很好的解决平均池化的模糊问题。同时Alexnet提出让卷积核扫描步长比池化核的尺寸小,这样在池化层的输出之间会有重叠和覆盖,在一定程度上提升了特征的丰富性。

 

六 网络结构

AlexNet总共包含8层,5个卷积层,3个全连接层,输出 为1000个类别的softmax层。如下图所示:

从图上可以明显看到网络结构分为上下两侧,这是因为网络分布在两个GPU上,这种药是因为NVIDIA GTX 580 GPU只用3GB内存,装不下那么大的网络。为了减少GPU之间的通信,第2,4,5个卷积层只连接同一个GPU上的上一层的kernel map(指和卷积核相乘后得到的矩阵)。第三个卷积层连接第二层的所有的kernel map。全连接的神经元连接到上一层的所有神经元。第1,2个卷积层里ReLU操作后轴LRN操作。第1,2,5卷积层卷积之后进行max pooling操作。ReLU激活函数应用于所有的卷积层和全连接层。

在AlexNet中,我们标记5个卷积层依次2为C1,C2,C3,C4,C5。而每次卷积后的结果在上图中可以看到,比如经过卷积层C1后,原始的图像变成了55x55的尺寸,一共有96个通道,分布在2张3G的显卡上,所以上图中一个立方体的尺寸是55x55x48,48是通道数目(后面会详细的说明),而在这个立方体里面还有一个5x5x48的小立方体,这个就是C2卷积层的核尺寸,48是核的厚度(后面会详细说明)。这样我们就能看到它每一层的卷积核尺寸以及每一层卷积之后的尺寸。我们按照上面的说明,推到下每一层的卷积操作:

需要说明的是,虽然AlexNet网络都用上图的结构来表示,但是其实输入图像的尺寸不是224x224x3,而应该是227x227x3,大家可以用244的尺寸推导下,会发现边界填充的结果是小数,这显然是不对的,在这里就不做推导了。

AlexNet各个层的参数和结构如下:

输入层:227x227x3 
C1:96x11x11x3 (卷积核个数/高/宽/深度) 
C2:256x5x5x48(卷积核个数/高/宽/深度)
C3:384x3x3x256(卷积核个数/高/宽/深度)
C4:384x3x3x192(卷积核个数/高/宽/深度)
C5:256x3x3x192(卷积核个数/高/宽/深度)

更详细的结构如下:

1.推导下C1后的输出是什么:

227x227x3的输入图像和卷积核11x11x3做卷积运算,步长为s=4,卷积后的尺寸是55x55x1。因为:(227-11+2*0)/4+1=55 。一共有96个卷积核,最后的输出:55x55x48x2。(图上之所以看起来是48个是由于2个GPU服务器处理,每个服务器承担了48个)

使用ReLU激励函数,然后还有个LRN标准化处理。

然后经过了一个最大池化层,池化层参数f=3,s=2.所以我们得到27x27x48x2的输出。27是是由(55-3)/2+1计算得到的。

2.推导下C2后的输出是什么:

27x27x48x2的输入,卷积核为5x5x48,。这是因为第1个卷积共有96个卷积核,第2个卷积核的尺寸应该为5x5x96,但是第一层的kernel maos分布在两个GPU上,且第二个卷积层只连接同一个GPU上的上一个网络,所以卷积核的尺寸为5x5x48。padding=2,s=1,(same卷积)经过卷积运算,卷积后的尺寸是27x27x1。因为:(27-5+2*2)/1+1=27 。一共有256个卷积核, 最后的输出:27x27x128x2。

使用ReLU激励函数,然后还有个LRN标准化处理。

然后经过了一个最大池化层,池化层参数f=3,s=2.所以我们得到13x13x128x2的输出。13是是由(27-3)/2+1计算得到的。

3.推导下C3后的输出是什么:

13x13x256的输入,卷积核为3x3x256,padding=1,s=1(same卷积)经过卷积运算,卷积后的尺寸是13x13x1。因为:(13-3+2*1)/1+1=13 。一共有384个卷积核, 最后的输出:27x27x192x2。

使用ReLU激励函数,不过C3层没有使用池化层和LRN。

4.推导下C4后的输出是什么:

13x13x192x2的输入,卷积核为3x3x192,padding=1,s=1(same卷积)经过卷积运算,卷积后的尺寸是13x13x1。因为:(13-3+2)/1+1=13 。一共有384个卷积核, 最后的输出:13x13x192x2。

使用ReLU激励函数,不过C4层没有使用池化层和LRN。

5.推导下C5后的输出是什么:

13x13x192x2的输入,卷积核为3x3x192,padding=1,s=1(same卷积)经过卷积运算,卷积后的尺寸是13x13x1。因为:(13-3+2)/1+1=13 。一共有个256卷积核, 最后的输出:13x13x128x2。

使用ReLU激励函数,不过C5层没有LRN.

然后经过了一个最大池化层,池化层参数f=3,s=2.所以我们得到6x6x256的输出。6是是由(13-3)/2+1计算得到的。

6.推导下FC6后的输出是什么:

这里使用4096个神经元,对256个大小为6X6特征图,进行一个全链接,卷积核为6x6x256,一共有4096卷积核。

然后进行一个dropout操作,随机从4096个节点中丢掉一些节点信息。

7.推导下FC7后的输出是什么:

这里和FC6是类似的。

8.输出层

  • 采用的是1000个神经元,然后对FC7中4096个神经元进行全链接,然后会通过高斯过滤器,得到1000个float型的值,也就是我们所看到的预测的可能性,。
  • 如果是训练模型的话,会通过标签label进行对比误差,然后求解出残差,再通过链式求导法则,将残差通过求解偏导数逐步向上传递,并将权重进行推倒更改,类似与BP网络思虑,然后会逐层逐层的调整权重以及偏置.

 由于上面网络是分布在两个GPU上面,看起来有些凌乱,因此我们把AlexNet网络整合在一块,如下:

  • AlexNet 首先用一张 227×227×3 的图片作为输入,实际上原文中使用的图像是 224×224×3,但是如果你尝试去推导一下,你会发现 227×227 这个尺寸更好一些。
  • C1 第一层我们使用 96 个11×11 的过滤器,步幅为 4,由于步幅是 4,因此尺寸缩小到 55×55,缩小了 4 倍左右。然后用一个 3×3 的过滤器构建最大池化层,f=3,s=2,尺寸缩小为 27×27×96。
  • C2 接着再执行一个 5×5 的same卷积, p=3,s=1,输出是 27×27×256。然后再次进行最大池化,尺寸缩小到 13×13。
  • C3 再执行一次 same 卷积,p=1,s=1,得到的结果是 13×13×384, 384 个过滤器。
  • C4 再做一次 same 卷积,p=1,s=1,得到的结果是 13×13×384, 384 个过滤器。
  • C5 再做一次 same 卷积,p=1,s=1,得到的结果是 13×13×256。最后再进行一次最大池化,尺寸缩小到 6×6×256。
  • 6×6×256 等于 9216,将其展开为 9216 个单元,然后是一些全连接层。最后使用 softmax 函数输出识别的结果。

 

七 防止过拟合

1.增加图片数据集(Data Augmentation)

  • 对图片进行变化,例如裁切,缩放,翻转等。
  • 在图片每个像素的RGB值上加入一个偏移量,使用主成分分析方法处理。将每个像素的RGB_{x,y}=[R_{x,y},G_{x,y},B_{x,y}]加上下面的值:

其中P_{i}\lambda _{i}分别是RGB值3x3协方差矩阵的第i个特征向量和特征值。\alpha_{i}是一个服从均值0,标准差为0.1的高斯分布的随机变量,在训练一张图片之前生成,同一张图片训练多次会生成多次。这两个矩阵相乘,得到一个3x1的矩阵。

这种方法将top-1错误率减少了1%。

2.Dropout

dropout是以一定的概率使神经元的输出为0,AlexNet设置概率为0.5,这种技术打破了神经元之间固定的依赖,使得学习到的参数更加健壮。AlexNet在第1,2个全连接网络中使用了dropout,这使得迭代收敛的速度增加了一倍。

 

八 训练学习

该模型训练使用了随机梯度下降法,每批图片有180张,权重更新公式如下:

其中i是迭代的索引,v是动量,0.9是动量参数,ε是学习率,0.0005是权重衰减系数,在这里不仅起到正则化的作用,而且减少了模型的训练误差。是这一批图片代价函数对权重w的偏导数。

所有的权重都采用均值为0,方差为0.01的高斯分布进行初始化。第2,4,5卷积层和所有全连接层的偏置都初始化为1,其他层的偏置初始化为0.学习率ε=0.01,所有层都使用这个学习率,在训练过程中,当错误率不在下降时,将学习率除以10,在终止训练之前减少3次,我们把120万张图片训练了90遍,总过花费了5到6天。

参考文章

[1]从AlexNet理解卷积神经网络的一般结构

[2]AlexNet 网络详解及Tensorflow实现源码

[3]神经网络模型之AlexNet的一些总结

[4]lenet-5,Alexnet详解以及tensorflow代码实现

[5]【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络AlexNet(推荐)

 

 

-----------------------------------------------------------------------------------------------------------------------

原文:https://www.cnblogs.com/zyly/p/8781224.html

你可能感兴趣的:(DeepLearning)