ImageNet Classification with Deep Convolutional Neural Networks[1]
这篇文章主要是针对阅读AlexNet论文后的论文笔记,方便自己日后复习。在文中很多是作者较先尝试并且取得了很好效果的技术,而现在已经普遍使用了,如ReLU、overlapping pooling、dropout等等,对于这些技术,在这篇中也不做过多赘述。
网络结构
模型的主要结构如上图所示,经过考证,作者在文章中应该是写错了,输入的图片大小应为
227×227×3
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的方式,仍可以对结果有一定的提升。
假设
aix,y
a
x
,
y
i
表示使用第
i
i
个kernel在上计算的结果,并且已经使用了ReLU激活,则normalize之后的结果为
n n 表示与相邻的 n n 个kernel,表示kernel的总数。在公式中 k,n,α,β k , n , α , β 都是超参数,通过在验证集上进行测试之后选定。最终设定 k=2,n=5,α=10−4,β=0.75 k = 2 , n = 5 , α = 10 − 4 , β = 0.75 。
网络结构
网络一共由5层conv和三层fully connection组成。输入的图片大小为 227×227×3 227 × 227 × 3 。
第一层卷积
输入:
227×227×3
227
×
227
×
3
卷积:
96
96
个
11×11×3,stride=4
11
×
11
×
3
,
s
t
r
i
d
e
=
4
的卷积核(48个kernel/GPU)
激活:ReLU
归一化:
Local
L
o
c
a
l
Response
R
e
s
p
o
n
s
e
Normalization
N
o
r
m
a
l
i
z
a
t
i
o
n
[2]
池化:
3×3,stride=2
3
×
3
,
s
t
r
i
d
e
=
2
的
max
m
a
x
pooling
p
o
o
l
i
n
g
[3]
输出:
27×27×96
27
×
27
×
96
(
27×27×48
27
×
27
×
48
/ GPU)
conv输出结果:
227−114+1=55
227
−
11
4
+
1
=
55
,feature map的大小为
55×55×96
55
×
55
×
96
。
max pooling输出结果:
55−32+1=27
55
−
3
2
+
1
=
27
,feature map的大小为
27×27×96
27
×
27
×
96
。
第二层卷积
输入:
27×27×96
27
×
27
×
96
(
27×27×48
27
×
27
×
48
/ GPU)
卷积:
256
256
个
5×5×48,stride=1,padding=2
5
×
5
×
48
,
s
t
r
i
d
e
=
1
,
p
a
d
d
i
n
g
=
2
的卷积核(128个kernel/GPU)
激活:ReLU
归一化:
Local
L
o
c
a
l
Response
R
e
s
p
o
n
s
e
Normalization
N
o
r
m
a
l
i
z
a
t
i
o
n
[2]
池化:
3×3,stride=2
3
×
3
,
s
t
r
i
d
e
=
2
的
max
m
a
x
pooling
p
o
o
l
i
n
g
[3]
输出:
13×13×256
13
×
13
×
256
(
13×13×128
13
×
13
×
128
/ GPU)
conv输出结果:
27+2×2−51+1=27
27
+
2
×
2
−
5
1
+
1
=
27
,feature map的大小为
27×27×256
27
×
27
×
256
。
max pooling输出结果:
27−32+1=13
27
−
3
2
+
1
=
13
,feature map的大小为
13×13×256
13
×
13
×
256
。
第三层卷积
输入:
13×13×256
13
×
13
×
256
(
13×13×128
13
×
13
×
128
/ GPU)
卷积:
384
384
个
3×3×256,stride=1,padding=1
3
×
3
×
256
,
s
t
r
i
d
e
=
1
,
p
a
d
d
i
n
g
=
1
的卷积核(192个kernel/GPU)
激活:ReLU
输出:
13×13×384
13
×
13
×
384
(
13×13×192
13
×
13
×
192
/ GPU)
conv输出结果:
13+1×2−31+1=13
13
+
1
×
2
−
3
1
+
1
=
13
,feature map的大小为
13×13×384
13
×
13
×
384
。
第四层卷积
输入:
13×13×192
13
×
13
×
192
/ GPU
卷积:
384
384
个
3×3×192,stride=1,padding=1
3
×
3
×
192
,
s
t
r
i
d
e
=
1
,
p
a
d
d
i
n
g
=
1
的卷积核(192个kernel/GPU)
激活:ReLU
输出:
13×13×384
13
×
13
×
384
(
13×13×192
13
×
13
×
192
/ GPU)
conv输出结果:
13+1×2−31+1=13
13
+
1
×
2
−
3
1
+
1
=
13
,feature map的大小为
13×13×384
13
×
13
×
384
。
第五层卷积
输入:
13×13×192
13
×
13
×
192
/ GPU
卷积:
256
256
个
3×3×192,stride=1,padding=1
3
×
3
×
192
,
s
t
r
i
d
e
=
1
,
p
a
d
d
i
n
g
=
1
的卷积核(128个kernel/GPU)
激活:ReLU
池化:
3×3,stride=2
3
×
3
,
s
t
r
i
d
e
=
2
的
max
m
a
x
pooling
p
o
o
l
i
n
g
[3]
输出:
6×6×256
6
×
6
×
256
(
6×6×128
6
×
6
×
128
/ GPU)
conv输出结果:
13+1×2−31+1=13
13
+
1
×
2
−
3
1
+
1
=
13
,feature map的大小为
13×13×256
13
×
13
×
256
。
max pooling输出结果:
13−32+1=6
13
−
3
2
+
1
=
6
,feature map的大小为
6×6×256
6
×
6
×
256
。
第六层全连接
输入:
6×6×256
6
×
6
×
256
输出:
4096
4096
(2048/GPU)
激活:ReLU
第七层全连接
输入:
4096
4096
输出:
4096
4096
(2048/GPU)
激活:ReLU
第八层全连接(softmax)
输入:
4096
4096
输出:
1000
1000
Reducing Overfitting
为了避免过拟合,文中采取了两种应对方式
data augmentation
在图像处理中一个比较常用的方式就是数据增强。作者在训练AlexNet时使用了两种数据增强的方式。
第一种方式是从原图(
256×256
256
×
256
)中随机裁切出若干
227×227
227
×
227
大小的子图以及子图的水平翻转。这种方式使得训练集扩充了2048倍。在测试时,使用5张(四个角以及中心)裁切出来的图片(及他们的翻转)作为测试输入,最后的结果模型为对10个子图预测结果的平均值(average of softmax)。
第二种方式是改变原图中RGB通道的强度[4]。方法是,先对整个训练集中的RGB的像素值组成的集合做了一个PCA,得到其主成分。对于某张图片,我们在其原有的RGB像素值得基础上加上其主成分的若干倍(该倍数为一个随机变量,从一个
N(0,0.12)
N
(
0
,
0.1
2
)
的高斯分布中采样得到)。因此,对于一个RGB通道的像素值
Ixy=[IRxy,IGxy,IBxy]T
I
x
y
=
[
I
x
y
R
,
I
x
y
G
,
I
x
y
B
]
T
,为其加上一个值,得到
I′xy=[IRxy,IGxy,IBxy]T+[p1,p2,p3][α1λ1,α2λ2,α3λ3]T
I
x
y
′
=
[
I
x
y
R
,
I
x
y
G
,
I
x
y
B
]
T
+
[
p
1
,
p
2
,
p
3
]
[
α
1
λ
1
,
α
2
λ
2
,
α
3
λ
3
]
T
。其中
pi
p
i
和
λi
λ
i
是又三通道的值算出的一个
3×3
3
×
3
的协方差矩阵的特征向量和特征值。
αi
α
i
是一个随机生成的数,在一次训练中,对于一张图片,
αi
α
i
只生成一次(训练过程中再遇到该图片时则重新生成
αi
α
i
)。这样的处理方式在某种程度上降低了光照和颜色和灯光对结果的影响。
dropout
训练时使用dropout技术避免过拟合,在训练时,以0.5的概率将隐藏层的输出置0。在测试时,使用所有的输出(即不进行置零操作),但是需要将输出乘0.5。
训练细节
使用
SGD
S
G
D
训练,
batch_size=128,momentum=0.9,weight_decay=0.0005
b
a
t
c
h
_
s
i
z
e
=
128
,
m
o
m
e
n
t
u
m
=
0.9
,
w
e
i
g
h
t
_
d
e
c
a
y
=
0.0005
权重迭代规则为:
vi+1:=0.9⋅vi−0.0005⋅ϵ⋅wi−ϵ⋅⟨∂L∂w|wi⟩Di
v
i
+
1
:=
0.9
⋅
v
i
−
0.0005
⋅
ϵ
⋅
w
i
−
ϵ
⋅
⟨
∂
L
∂
w
|
w
i
⟩
D
i
wi+1:=wi+vi+1
w
i
+
1
:=
w
i
+
v
i
+
1
其中
ϵ
ϵ
是学习率,
⟨∂L∂w|wi⟩Di
⟨
∂
L
∂
w
|
w
i
⟩
D
i
是第
i
i
个batch 对
wi
w
i
偏导的均值。
初始化时,参数从一个
N(0,0.012)
N
(
0
,
0.01
2
)
的高斯分布中采样得到。在卷积的第二层、第四层、第五层以及全连接层(隐藏层)中初始化bias为
1
1
。剩下层中bias初始化为。
学习率初始化为
0.01
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是如何实现的?