ImageNet Classification with Deep Convolutional Neural Networks[1]

这篇文章主要是针对阅读AlexNet论文后的论文笔记,方便自己日后复习。在文中很多是作者较先尝试并且取得了很好效果的技术,而现在已经普遍使用了,如ReLUoverlapping poolingdropout等等,对于这些技术,在这篇中也不做过多赘述。

网络结构

AlexNet 论文笔记
模型的主要结构如上图所示,经过考证,作者在文章中应该是写错了,输入的图片大小应为227×227×3

Multi GPU training

首先要说明一下,上面这个网络长得奇怪的原因是因为作者使用了两个GPU进行训练,由于在每一层里参数过多,不能把每一层的全部参数都放在同一个GPU上,所以才分出两部分,每一部分的参数放在一个GPU上。同时,从上图中可以看到,在每个GPU上的结果,并不是在所有阶段都会传输给下一层的两个GPU上的。只有Conv Stage 2和Conv Stage 5以及全连接层之后的结果会传输给两个GPU。

Local Response Normalization

虽然ReLU不太需要做输入的normalization来方式防止梯度饱和,但是作者提出了一种Local Response Normalization的方式,仍可以对结果有一定的提升。
假设ax,yi表示使用第i个kernel在(x,y)上计算的结果,并且已经使用了ReLU**,则normalize之后的结果为

bx,yi=ax,yi/(k+αj=max(0,in/2)min(N1,i+n/2)(ax,yj)2))β

n表示与i相邻的n个kernel,N表示kernel的总数。在公式中k,n,α,β都是超参数,通过在验证集上进行测试之后选定。最终设定k=2,n=5,α=104,β=0.75

网络结构

网络一共由5层conv和三层fully connection组成。输入的图片大小为227×227×3

第一层卷积

输入:227×227×3
卷积:9611×11×3stride=4 的卷积核(48个kernel/GPU)
**:ReLU
归一化:Local Response Normalization[2]
池化:3×3stride=2max pooling[3]
输出:27×27×9627×27×48 / GPU)
     conv输出结果:227114+1=55,feature map的大小为55×55×96
     max pooling输出结果:5532+1=27,feature map的大小为27×27×96

第二层卷积

输入:27×27×9627×27×48 / GPU)
卷积:2565×5×48stride=1padding=2 的卷积核(128个kernel/GPU)
**:ReLU
归一化:Local Response Normalization[2]
池化:3×3stride=2max pooling[3]
输出:13×13×25613×13×128 / GPU)
     conv输出结果:27+2×251+1=27,feature map的大小为27×27×256
     max pooling输出结果:2732+1=13,feature map的大小为13×13×256

第三层卷积

输入:13×13×25613×13×128 / GPU)
卷积:3843×3×256stride=1padding=1 的卷积核(192个kernel/GPU)
**:ReLU
输出:13×13×38413×13×192 / GPU)
     conv输出结果:13+1×231+1=13,feature map的大小为13×13×384

第四层卷积

输入:13×13×192 / GPU
卷积:3843×3×192stride=1padding=1 的卷积核(192个kernel/GPU)
**:ReLU
输出:13×13×38413×13×192 / GPU)
     conv输出结果:13+1×231+1=13,feature map的大小为13×13×384

第五层卷积

输入:13×13×192 / GPU
卷积:2563×3×192stride=1padding=1 的卷积核(128个kernel/GPU)
**:ReLU
池化:3×3stride=2max pooling[3]
输出:6×6×2566×6×128 / GPU)
     conv输出结果:13+1×231+1=13,feature map的大小为13×13×256
     max pooling输出结果:1332+1=6,feature map的大小为6×6×256

第六层全连接

输入:6×6×256
输出:4096(2048/GPU)
**:ReLU

第七层全连接

输入:4096
输出:4096(2048/GPU)
**:ReLU

第八层全连接(softmax)

输入:4096
输出:1000


Reducing Overfitting

为了避免过拟合,文中采取了两种应对方式

data augmentation

在图像处理中一个比较常用的方式就是数据增强。作者在训练AlexNet时使用了两种数据增强的方式。
第一种方式是从原图(256×256)中随机裁切出若干227×227大小的子图以及子图的水平翻转。这种方式使得训练集扩充了2048倍。在测试时,使用5张(四个角以及中心)裁切出来的图片(及他们的翻转)作为测试输入,最后的结果模型为对10个子图预测结果的平均值(average of softmax)。
第二种方式是改变原图中RGB通道的强度[4]。方法是,先对整个训练集中的RGB的像素值组成的集合做了一个PCA,得到其主成分。对于某张图片,我们在其原有的RGB像素值得基础上加上其主成分的若干倍(该倍数为一个随机变量,从一个N(0,0.12)的高斯分布中采样得到)。因此,对于一个RGB通道的像素值Ixy=[IxyR,IxyG,IxyB]T,为其加上一个值,得到Ixy=[IxyR,IxyG,IxyB]T+[p1,p2,p3][α1λ1,α2λ2,α3λ3]T。其中piλi是又三通道的值算出的一个3×3的协方差矩阵的特征向量和特征值。αi是一个随机生成的数,在一次训练中,对于一张图片,αi只生成一次(训练过程中再遇到该图片时则重新生成αi)。这样的处理方式在某种程度上降低了光照和颜色和灯光对结果的影响。

dropout

训练时使用dropout技术避免过拟合,在训练时,以0.5的概率将隐藏层的输出置0。在测试时,使用所有的输出(即不进行置零操作),但是需要将输出乘0.5。

训练细节

使用SGD训练,batch_size=128momentum=0.9weight_decay=0.0005
权重迭代规则为:
vi+1:=0.9vi0.0005ϵwiϵLw|wiDi
wi+1:=wi+vi+1
其中ϵ是学习率,Lw|wiDi是第i个batch Diwi偏导的均值。
初始化时,参数从一个N(0,0.012)的高斯分布中采样得到。在卷积的第二层、第四层、第五层以及全连接层(隐藏层)中初始化bias为1。剩下层中bias初始化为0
学习率初始化为0.01,并且当val error不降时,将学习率除以10。在120万张图片上使用两个NVIDIA GTX 580 3GB GPU训练了90个cycles,在训练的过程中,学习率总共降了三次。



[1] ImageNet Classification with Deep Convolutional Neural Networks
[2] [3] 我在很多博客或者source code中看到,都是先做pooling后做normalization。如[A]或是[B]。但是,论文中叙述为

Max-pooling layers, of the kind described in Section 3.4, follow both response-normalization layers as well as the fifth convolutional layer.

对此甚是不解,希望大神能够帮忙解答。
[4] AlexNet中data augmentation是如何实现的?

相关文章: