ImageNet Classification with Deep Convolutional Neural Networks
序言:
本篇文章于2012年发表,是近年来深度学习领域的代表之作,同样是由多伦多大学G.Hinton大神领导的人工智能小组发表,从此引发了卷积网络在图像领域应用的高潮。 本文主要提出了一个8层的深度神经网络,包括5层卷积层和3层连接层,以及三个池化层(不计入总层数),并且使用Relu作为激活函数,取得了优异的效果,这种网络架构被称为AlexNet(论文一作是Alex Krizhevsky)
1.数据介绍
文章主要用到的数据集是ILSVRC-2010,包括1.2million张training images,5000张validate images以及15000张test images。首先对图片处理取一个固定的分辨率256X256,然后对每个训练样本都进行了零均值处理。
2.网络特点
(1)Relu Nonlinearity
使用Relu(non-saturating nonlinearity)作为激活函数取代传统的tanh和sigmoid(satiration nonlinearity)函数, 可以有效加快收敛速度和减少计算量,因为Relu:f(x)=max(0,x)更易于求导。
(2)Training on Multiple GPUs
受限于当时的算理使用了两块GTX 580 GPU,共6GB内存来计算,有效提高了计算速度和支持更复杂的网络。
(3)Local Response Normalization
在每一层的输出进行normalization,此方法已经被batch-normalization取代?
(4)Overlapping Pool
原理很简单,每个卷积层的运算可看做是一个pooling unit的网格,每个网格大小为z*z,stride=s。if s=z,这样每个pooling unit就不会有重合;if s<z,这样就会产生重合(overlapping)。对于一个pooling unit可能包含的像素只是有效信息的一部分,如果不重合下一个pooling unit里就会完全跳过上一个pooling unit,这样上一个pooling unit的有效信息就会被当前unit忽略掉,overlapping有效的避免了这个问题。如本文使用的就是s=2,z=3。
3.网络架构
(1)整体结构
各层结构如下:
Input: [ m x227 x 227 x 3 ] (#images x width x height x #channels)
Conv1: [ 96 x 11 x 11 x 3/
s
=
4
_{s=4}
s=4] (#filters x width x height x #channels)
Maxpool1: [ 3 x 3/
s
=
2
_{s=2}
s=2 ] (#filters x width x height x #channels)
Conv2: [ 256 x 5 x 5 x 48 /$_{p=2} $ ] (#filters x width x height x #channels)
Maxpool2: [ 3 x 3/
s
=
2
_{s=2}
s=2 ] (#filters x width x height x #channels)
Conv3: [ 384 x 3 x 3 x 256 ] (#filters x width x height x #channels)
Conv4: [ 384 x 3 x 3 x 192 ] (#filters x width x height x #channels)
Conv5: [ 256 x 3 x 3 x 192 ] (#filters x width x height x #channels)
Maxpool3: [ 3 x 3/
s
=
2
_{s=2}
s=2 ] (#filters x width x height x #channels)
FC6: 4096 (#neural units)
FC7: 4096 (#neural units)
FC8: 1000 (#neural units)
Output: [ m x 1000 ] (#images x #classes)
(2) 架构展开(以一张图片作为输入为例):
这是本篇论文八层网络架构的核心,接下来一层一层介绍:
<0. 输入图片大小为227x227x3(width x height x number_channels),论文中写的是224x224x3,但是如果按照卷积变换公式:
n
w
l
=
n
w
l
−
1
−
f
l
+
2
p
l
s
l
+
1
n_w^l=\frac{n_w^{l-1}-f^l+2p^l}{s^l}+1
nwl=slnwl−1−fl+2pl+1
n
h
l
=
n
h
l
−
1
−
f
l
+
2
p
l
s
l
+
1
n_h^l=\frac{n_h^{l-1}-f^l+2p^l}{s^l}+1
nhl=slnhl−1−fl+2pl+1
n
c
l
=
n
f
i
l
t
e
r
s
l
n_c^l=n_{filters}^{l}
ncl=nfiltersl
其中:
n
w
l
∗
n
h
l
n_w^l*n_h^l
nwl∗nhl 是图像卷积后的size,
n
w
l
−
1
∗
n
h
l
−
1
n_w^{l-1}*n_h^{l-1}
nwl−1∗nhl−1是卷积前图像的size,
f
f
f,
p
p
p,
s
s
s分别代表卷积核的filter size,padding和stride,
n
f
i
l
t
e
r
s
n_{filters}
nfilters代表卷积层用的卷积核的总个数。按公式推断的话,224是不正确的,应为227。
<1.输入图像经过一次卷积和一次maxpool池化得到了2个27 x 27 x 48的输出,分为由两个GPU单独计算,具体计算过程参照上面卷积计算的三个公式。
<2. 经过第一层的计算得到的输出,作为下一层运算的输入,然后同样经过一次卷积 和maxpool池化得到13 x 13 x 128的输出。
❤️. 同样的道理得到第三层的输出为13 x 13 x 192,注意本层没有池化层,且GPU1和GPU2有通信,所以箭头有相交,注意这里用了padding=SAME,所以输入输出图像大小不变。
<4. 第四层同样只计算一次卷积运算,注意这里用了padding=SAME,所以输入输出图像大小不变。
<5. 先经过卷积,padding=SAME,然后经过池化层,图像大小减半,最终得到6 x 6 x 128x2 的输出。
<6. FC6, 全连接层,也就是普通的神经网络层。先把上一层的输出全部展开(dense)一共得到6 x 6 x 128 (以单GPU单输入为例)个神经元作为当前的输入层, 隐层为2048个神经元,这样在当前全连接层的总的参数的个数为6x6x128x2048x4=37,748,736(这里x4是因为每个输入都被GPU计算了两次,有两个GPU),相比一共60million的参数,第一个全连接层占据了大多数。
<7. 原理同上层一样,一共有2048x2048x4=16,777,216 个。
<8. 同上,参数为2048x1000x2=4,096,000个。
到此,AlexNet的网络结构就已经分析完成了,了解更多信息请阅读原论文。
4.参考文献
1.ImageNet Classification with Deep Convolutional Neural Networks:
https://www.nvidia.cn/content/tesla/pdf/machine-learning/imagenet-classification-with-deep-convolution
2.https://www.cnblogs.com/gongxijun/p/6027747.html
3.https://blog.youkuaiyun.com/chaipp0607/article/details/72847422