讲完了全连接网络接下来讲卷积,本篇博客,主要讲解卷积神经网络中,卷积操作正向和反向传播过程,不会有特别难的公式,特别是反向传播中,推导比较麻烦。
正向传播
如下图(图片来源):
图中image矩阵也就是绿色的部分(当然包括黄色的部分)就是输入的数据,也就是神经网络上游传过来的数据。黄色的部分为卷积核(卷积核的内容是黄色部分
×
\times
×后面的数字就是它的内容)。
根据上面的动图知道,卷积操作过程中,它们的内容都是不会变的。然后得到了最终的convolved feautre,那么具体的值是如何得到的呢?
如下图:
其中的-3就是对应数据中的值
×
\times
×卷积核,再相加得到最终的-3。(图片来源)
在第一张动图中,convolved feautre左上角的值4也是怎么得来的:
4
=
1
∗
1
+
1
∗
0
+
1
∗
1
+
0
∗
1
+
1
∗
1
+
1
∗
0
+
0
∗
1
+
0
∗
0
+
1
∗
1
4=1*1+1*0+1*1+0*1+1*1+1*0+0*1+0*0+1*1
4=1∗1+1∗0+1∗1+0∗1+1∗1+1∗0+0∗1+0∗0+1∗1
同时我们还要提出两个概念,一个是步长(stride),一个是填充(padding)。
步长就是卷积核移动的格子数(上下左右差距),如动图中,它的步长就是1。
填充就是对数据周围填充
p
p
p圈数值,一般是0。那么上图image本身是
5
∗
5
5*5
5∗5矩阵,填充
p
p
p圈后便是
(
5
+
p
)
∗
(
5
+
p
)
(5+p)*(5+p)
(5+p)∗(5+p)矩阵,因为上面并没有填充,所以依然
5
∗
5
5*5
5∗5
那么我们已知image的长(H) 和 宽(W) 以及 卷积核(kernel) 的 长(h) 和 宽(w),如何求得特征图(feature map)的长(o_h) 和 宽(o_w)。
设已知image的
H
,
W
H,W
H,W,卷积核的
h
,
w
h,w
h,w,步长
s
t
r
i
d
e
stride
stride,填充
p
a
d
d
i
n
g
padding
padding。
就可以得以下公式:
o
_
w
=
W
+
2
∗
p
a
d
d
i
n
g
−
w
s
t
r
i
d
e
+
1
o\_w=\frac{W+2*padding-w}{stride}+1
o_w=strideW+2∗padding−w+1
o
_
h
=
H
+
2
∗
p
a
d
d
i
n
g
−
h
s
t
r
i
d
e
+
1
o\_h=\frac{H+2*padding-h}{stride}+1
o_h=strideH+2∗padding−h+1
这个公式还是比较重要的。
反向传播
有张图其实概括的很好了:
图来源
已知卷积层
d
A
[
l
]
dA^{[l]}
dA[l],求取上一层
d
A
[
l
−
1
]
dA^{[l-1]}
dA[l−1]。注意以下
∗
*
∗为卷积运算
d
Z
[
l
]
=
d
A
[
l
]
∗
g
[
l
]
′
(
Z
[
l
]
)
dZ^{[l]}=dA^{[l]}*g^{[l]'}(Z^{[l]})
dZ[l]=dA[l]∗g[l]′(Z[l])
d
A
[
l
−
1
]
=
d
Z
[
l
]
∗
∂
Z
[
l
]
∂
A
[
l
−
1
]
dA^{[l-1]}=dZ^{[l]}*\frac{\partial Z^{[l]}}{\partial A^{[l-1]}}
dA[l−1]=dZ[l]∗∂A[l−1]∂Z[l]
因此
d
A
[
l
−
1
]
=
d
Z
[
l
]
∗
∂
Z
[
l
]
∂
A
[
l
−
1
]
=
d
Z
[
l
]
∗
r
o
t
180
(
W
[
l
]
)
dA^{[l-1]}=dZ^{[l]}*\frac{\partial Z^{[l]}}{\partial A^{[l-1]}}=dZ^{[l]}*rot180(W^{[l]})
dA[l−1]=dZ[l]∗∂A[l−1]∂Z[l]=dZ[l]∗rot180(W[l])
同时给出下
W
,
b
W,b
W,b的误差:
d
W
[
l
]
=
d
Z
[
l
]
∗
∂
Z
[
l
]
∂
W
[
l
]
=
d
Z
[
l
]
∗
A
[
l
−
1
]
dW^{[l]}=dZ^{[l]}*\frac{\partial Z^{[l]}}{\partial W^{[l]}}=dZ^{[l]}*A^{[l-1]}
dW[l]=dZ[l]∗∂W[l]∂Z[l]=dZ[l]∗A[l−1]
这里就不需要旋转180度.
而对于b,则稍微有些特殊,因为
δ
l
δ^l
δl是高维张量,而b只是一个向量,不能像DNN那样直接和
δ
l
δ^l
δl相等。通常的做法是将
δ
l
δ^l
δl的各个子矩阵的项分别求和,得到一个误差向量,即为
b
b
b的梯度:
d
b
l
=
∑
u
,
v
(
δ
l
)
u
,
v
db^{l} = \sum\limits_{u,v}(\delta^l)_{u,v}
dbl=u,v∑(δl)u,v