1.导读

ALexNet在2012图像识别竞赛中ILSVRC大放异彩,直接将错误了降低了近10个百分点。

example input output gif

论文《ImageNet Classification with Deep Convolutional Neural Networks》,链接点击here

2.网络结构

image

AlexNet整体的网络结构包括:1个输入层(input layer)、5个卷积层(C1、C2、C3、C4、C5)、2个全连接层(FC6、FC7)和1个输出层(output layer)。下面对网络结构详细介绍:
注意:作者由于资源有限,是在两张GPU张进行的分布式训练,因此这张网络结构图可以看作上半部分是在GPU0,下半部在是GPU1上;
网络结构输入是224X224X3(但实际图像尺寸为227X227X3,这里据说是手误或者可能是后来对网络做了调整),经过5个卷积后接入全连接层,输出4096维向量,最后接入一个softmax层进行分类,值得注意的是C2->C3与C5、FC6、FC7中是交叉了的,这是作者想融合两张GPU上的特征,这是网络结构的大体思想,现在我们一个个层来分析:

2.1 输入层

输入图像的尺寸为224X224X3(227X227X3),这里值得一提的是作者的图像预处理的方法,这里我们在第3大部分说。

2.2 卷积层

这里先写出卷积计算公式:输出尺寸=[(输入尺寸+2*padding-kernel_size)/stride]+1

2.2.1 C1卷积层

C1卷积层为:卷积-->激活函数-->局部响应归一化-->池化;
卷积:输入227X227X3,使用96个11X11X3的kernel(两种GPU分别48个),padding=0,stride=4,得到输出55X55X96;
激活函数:这里作者没有用以往的sigmoid、tanh,使用的是ReLU,f(x)=max(0,x),速度要快许多,不过对于现在的模型来说,用哪个激活函数差别不大,更重要的是你的网络结构,当然ReLU也是用得比较多的;补充知识点:如果没有激活函数,神经网络下一层的输出只是上一层输入函数的线性变换,无论神经网络多么复杂,最后输出都是输入的线性组合,因此使用激活函数引入非线性性,使得神经网络可以逼近任何的非线性函数。
局部响应归一化:Local Response Normalization简称LRN,LRN对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。跟现在的BN操作类似,LRN公式如下:

example input output gif

其中a为归一化之前的神经元,b为归一化之后的神经元;N是卷积核的个数,也就是生成的FeatureMap的个数;k,α,β,n是超参数,论文中使用的值是k=2,n=5,α=0.0001,β=0.75;

经过LRN层后输出仍然是55X55X96;

池化:这里使用的是max Pooling即最大池化操作,使用3X3的池化单元,得到27X27X96;这里补充一个知识,为什么相比于average pooling,max pooling在分类任务中更常用?虽然average pooling和average pooling都对数据做了下采样,但max pooling更像是做了特征选择,选出了分类识别度更好的特征,很多时候,我们需要知道的是这张图片中有什么object,这时max pooling的效果会更好。

2.2.2 C2卷积层

C2卷积层结构和C1一致
卷积:input为27X27X96,256个5x5x48的kernel size(每个GPU128个),padding=2,stride=1,根据公式输出为27x27x256;
激活函数:ReLU;
局部响应归一化:使用参数k=2,n=5,α=0.0001,β=0.75进行归一化,输入尺寸不变;
池化:k3x3,stride=2的池化单元的max pooling 输出13x13x256;

2.2.3 C3卷积层

该层的结构为:卷积-->激活函数;
卷积:输入13x13x256,使用384个3x3x256的kernel size,padding=1,stride=1,得到输出13x13x384;
激活函数:ReLu;

2.2.4 C4卷积层

与C3卷积层结构一致;
卷积:输入13x13x384,384个3x3x384个kernel size,padding=1,stride=1,输出13x13x384;
激活函数:ReLU;

2.2.5 C5卷积层

该层结构为:卷积-->激活函数-->池化
卷积:输入13x13x384,256个3x3x192的卷积核,padding=1,stride=1,输出13x13x256;
激活函数:ReLU
池化:3x3,stride=2的池化单元进行max pooling,得到输出6x6x256;

2.2.6 FC6全连接层

该层的结构为:全连接-->激活函数-->Dropout
全连接层:输入为6x6x256,使用4096个6x6x256的kernel,输出1x1x4096,即有4096个神经元;
激活函数:ReLU;
Dropout:随机断开全连接层某些神经元的连接,让这些神经元不参与计算,降低了网络对于单个神经元的依赖,防止过拟合,作者在论文中表达的意思是这样可以组合不同的模型,现在来看是一个正则化技术。

2.2.7 FC7全连接层

与FC6层结构一样,输出1x1x4096

2.2.8 输出层

该层的结构为:全连接-->Softmax
全连接:输入1x1x4096,输出1x1x1000,即对应1000类;
Softmax:经过Softmax,算出1000个类别的对应预测概率;

3.论文总结

3.1 数据处理

作者创新点之一在于数据处理方面,他使用了两种数据增强的方法,第一种是随机裁剪和水平翻转,作者从256x256图像中随机提取224x224并且结合其水平翻转,这样扩充了数据集;第二种是对RGB空间使用PCA,做一个高斯扰动,改变其RGB通道的强度值,也就是对颜色、光照做变换。这样端到端的处理数据方式给后来带来了很大影响,但这样扩充数据是有冗余的。

3.2 激活函数ReLU

ReLU简单且好用,比当时的tanh要快很多,ReLU函数是一个分段线性函数,小于等于0则输出0;大于0的则恒等输出。反向传播中,ReLU有输出的部分,导数始终为1。而且ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

3.3 相似特征向量

神经网络的可解释性一直是一个困扰问题,下面这张图是作者将最后一个全连接后的4096维向量拿出来,并选出产生欧式距离较小的其他特征向量,我们认为在高维空间中他们是相似的,然后作者将他们可视化了一些,如下图所示,这些在高维空间相似的向量真的代表着同一类,这些充分证明了神经网络的的确确学到了东西,能够将他们很好地分类出来,这个实验思路是很重要的。

example input output gif

3.4 Dropout

过拟合一直是被关注的问题,Dropout能抑制过拟合,我们现在认为其就是一种正则化技术,但当时作者在文中表达的是Dropout可以看成是一种模型组合,每次生成的网络结构都不一样,通过组合多个模型的方式能够有效地减少过拟合。

3.5 复现训练细节

训练使用的是小批量随机梯度下降,batch size = 128,动量momentum为0.9,weight deay权重衰减为0.0005;每一层的权重初始化为均值1标准差0.01的正态分布,在第2,4,5卷积层和全连接层中的bias初始化为常数1,其余层则为0.所有层采用了相同的初始化为0.01的学习率,不过可以手动调整。整个训练过程在两台NVIDIA GTX 580 3GB gpu上用了5到6天的时间,120万张图像的训练集,大约90轮迭代。 论文中提到:weight deay对模型的学习很重要。换句话说,这里的重量衰减不仅仅是一个正则化器:它减少了模型的训练误差。

3.5 讨论

作者在论文中指出:一个大型的、深度的卷积神经网络能够在一个高度挑战的数据集上使用纯监督学习获得破纪录的结果。如果去掉AlexNet网络中的任意个卷积层,整体性能就会下降约2%,可见,网络的深度很重要

4 代码实现

复现AlexNet的demo我放在了github上,你可以点击这里,我使用了4000多张flower的图片,分5个类。用1050的显卡训练15个epoch很快,而且效果还不错。

example input output gif