卷积神经网络相较于 B P BP BP神经网络的进步主要是极大地减少了构建网络所需要的参数。对于一个 1000 ∗ 1000 1000*1000 1000∗1000像素的 R G B RGB RGB图像( w i d t h = 1000 , h e i g h t = 1000 , d e p t h = 3 width=1000, height=1000, depth=3 width=1000,height=1000,depth=3),如果应用单层、十个神经元的BP神经网络构建网络模型,那么该网络就需要计算 10 ∗ 1000 ∗ 1000 ∗ 3 + 10 10*1000*1000*3+10 10∗1000∗1000∗3+10个参数的梯度。如果网络的层数或神经元数目增加,该模型的计算成本将无比巨大。Hubel和Wiesel在研究猫脑皮层时发现了局部感受野(某些神经细胞对于特定部分的视觉区域敏感),并据此提出了卷积神经网络,不再像 B P BP BP神经网络那样采用全连接。如下图(图取自):
Filter
根据局部感受野,卷积神经网络引入了
f
i
l
t
e
r
filter
filter(在部分学术文章中,也称
k
e
r
n
e
l
kernel
kernel)的概念。假设我们有一张
5
∗
5
5*5
5∗5像素的灰度图像
i
n
p
u
t
input
input,
2
∗
2
2*2
2∗2的
f
i
l
t
e
r
filter
filter对
i
n
p
u
t
input
input卷积后的结果如下图
o
u
t
p
u
t
output
output所示。有一点需要注意!
f
i
l
t
e
r
filter
filter的
d
e
p
t
h
depth
depth值始终和其输入数据的
d
e
p
t
h
depth
depth值一致,且
o
u
t
p
u
t
output
output的
d
e
p
t
h
=
1
depth=1
depth=1。但是可以应用多个
f
i
l
t
e
r
filter
filter对同一个输入数据卷积,并将其
o
u
t
p
u
t
s
outputs
outputs叠在一起形成网络下一层的输入,
o
u
t
p
u
t
s
outputs
outputs的
d
e
p
t
h
depth
depth等于
f
i
l
t
e
r
filter
filter的数目。
下面给出卷积的公式:
O
u
t
p
u
t
=
C
o
n
v
f
(
I
n
p
u
t
)
O
u
t
p
u
t
i
,
j
=
∑
h
=
0
H
f
−
1
∑
w
=
0
W
f
−
1
∑
d
=
1
D
f
I
n
p
u
t
i
+
h
,
j
+
w
,
d
∗
f
i
l
t
e
r
i
+
h
,
j
+
w
,
d
Output = Conv_f(Input) \\ Output_{i,j} = \sum\limits_{h=0}^{H_f-1} \sum\limits_{w=0}^{W_f-1} \sum\limits_{d=1}^{D_f} Input_{i+h,j+w,d}*filter_{i+h,j+w,d}
Output=Convf(Input)Outputi,j=h=0∑Hf−1w=0∑Wf−1d=1∑DfInputi+h,j+w,d∗filteri+h,j+w,d
其中, i ∈ { 1 , 2 , … , H I − H f + 1 } ; j ∈ { 1 , 2 , … , W I − W f + 1 } i \in \{1,2,\dots,H_I-H_f+1\}; j \in \{1,2,\dots,W_I-W_f+1\} i∈{1,2,…,HI−Hf+1};j∈{1,2,…,WI−Wf+1}。 H I H_I HI和 H f H_f Hf表示 I n p u t Input Input和 f i l t e r filter filter的 h e i g h t height height, W I W_I WI和 W f W_f Wf表示 I n p u t Input Input和 f i l t e r filter filter的 w i d t h width width。
Zero-Padding
观察上例可以发现,直接对原始数据
I
n
p
u
t
Input
Input进行卷积,会造成每个像素对输出的贡献不均衡。例如,
I
n
p
u
t
[
1
,
1
]
Input[1,1]
Input[1,1]对
O
u
t
p
u
t
Output
Output只有一次影响,而
I
n
p
u
t
[
3
,
3
]
Input[3,3]
Input[3,3]对
O
u
t
p
u
t
Output
Output有四次影响。或者是想控制
O
u
t
p
u
t
Output
Output的
h
e
i
g
h
t
height
height或
w
i
d
t
h
width
width。都可以通过对原始数据的上下、左右四侧填充
0
0
0。
Stride
同时,我们也可以调整
f
i
l
t
e
r
filter
filter的移动步伐。如下图:
结合
P
a
d
d
i
n
g
Padding
Padding和
S
t
r
i
d
e
Stride
Stride,
I
n
p
u
t
Input
Input、
f
i
l
t
e
r
filter
filter和
O
u
t
p
u
t
Output
Output之间的维度关系如下:
D
e
p
t
h
f
i
l
t
e
r
=
D
e
p
t
h
I
n
p
u
t
H
e
i
g
h
t
O
u
t
p
u
t
=
H
e
i
g
h
t
I
n
p
u
t
+
2
∗
P
a
d
d
i
n
g
−
H
e
i
g
h
t
f
i
l
t
e
r
S
t
r
i
d
e
+
1
W
i
d
t
h
O
u
t
p
u
t
=
W
i
d
t
h
I
n
p
u
t
+
2
∗
P
a
d
d
i
n
g
−
W
i
d
t
h
f
i
l
t
e
r
S
t
r
i
d
e
+
1
D
e
p
t
h
O
u
t
p
u
t
=
1
Depth_{filter} = Depth_{Input} \\ Height_{Output} = \frac {Height_{Input} + 2*Padding - Height_{filter}}{Stride} + 1 \\ Width_{Output} = \frac {Width_{Input} + 2*Padding - Width_{filter}}{Stride} + 1 \\ Depth_{Output} = 1
Depthfilter=DepthInputHeightOutput=StrideHeightInput+2∗Padding−Heightfilter+1WidthOutput=StrideWidthInput+2∗Padding−Widthfilter+1DepthOutput=1
卷积层
至此,我们已经可以构建出
C
N
N
CNN
CNN的卷积层了。如下图:
Pooling层
通过增减卷积层
f
i
l
t
e
r
filter
filter的数目,可以控制该卷积层输出数据的
d
e
p
t
h
depth
depth,避免过拟合。而
P
o
o
l
i
n
g
Pooling
Pooling层的目的则是控制输出数据的
h
e
i
g
h
t
height
height和
w
i
d
t
h
width
width。
P
o
o
l
i
n
g
Pooling
Pooling主要有
a
v
e
r
a
g
e
p
o
o
l
i
n
g
average\ pooling
average pooling和
m
a
x
p
o
o
l
i
n
g
max\ pooling
max pooling,故名思义,前一个是在计算
f
i
l
t
e
r
filter
filter覆盖范围内值的均值,后一个选取
f
i
l
t
e
r
filter
filter覆盖范围内的最大值。如下图:
请注意!
P
o
o
l
i
n
g
Pooling
Pooling层中
f
i
l
t
e
r
filter
filter的
d
e
p
t
h
depth
depth始终为1,不改变输入数据的
d
e
p
t
h
depth
depth值。输入数据与输出数据的深度一致。结合上面的卷积层,
C
N
N
CNN
CNN网络演变如下:
全连接层
最后,介绍卷积神经网络中的最后一种网络层——全连接层。在
C
N
N
CNN
CNN中,继输入层后,会连续交替放置若干个卷积层和
P
o
o
l
i
n
g
Pooling
Pooling层的组合,然后将最后一层
P
o
o
l
i
n
g
Pooling
Pooling层向量化,放置全连接层,输出层多采用
S
o
f
t
m
a
x
Softmax
Softmax或
L
o
g
i
s
t
i
c
R
e
g
r
e
s
s
i
o
n
Logistic\ Regression
Logistic Regression做分类输出。完整的
C
N
N
CNN
CNN网络如下图:
请注意!卷积层和 P o o l i n g Pooling Pooling层可以有多个接替组合,而上图仅包含一个组合。