一、卷积
1. 定义
之前在博客里面提到过卷积神经网络,里面有提到卷积操作,最近在阅读论文的时候又遇到了反卷积,所以将二者拿出来进行分析比较。
卷积是利用卷积核实现的,以一副图片为例,当它与一个卷积核进行卷积运算的时候,会得到一个feature map,feature map的大小与原图像相比一般会减小,这样就达到了提取特征的目的,同时,与全连接神经网络相比,又能够有效的减少参数数量,假设图像的大小为M*N, 卷积核大小为s*t, 步长为k,padding大小为p, 则对应的feature map大小为
H
=
[
(
M
+
2
∗
p
−
s
)
/
k
]
+
1
,
W
=
[
(
N
+
2
∗
p
−
t
)
/
k
]
+
1
H=[(M+2*p-s)/k]+1, W=[(N+2*p-t)/k]+1
H=[(M+2∗p−s)/k]+1,W=[(N+2∗p−t)/k]+1
二者均要向下取整。
2. 实现
假设有一副4*4的图像为
x
1
,
1
x
1
,
2
x
1
,
3
x
1
,
4
x
2
,
1
x
2
,
2
x
2
,
3
x
2
,
4
x
3
,
1
x
3
,
2
x
3
,
3
x
3
,
4
x
4
,
1
x
4
,
2
x
4
,
3
x
4
,
4
\begin{matrix} x_{1,1}&x_{1,2}&x_{1,3}&x_{1,4} \\x_{2,1}&x_{2,2}&x_{2,3}&x_{2,4} \\x_{3,1}&x_{3,2}&x_{3,3}&x_{3,4} \\x_{4,1}&x_{4,2}&x_{4,3}&x_{4,4} \end{matrix}
x1,1x2,1x3,1x4,1x1,2x2,2x3,2x4,2x1,3x2,3x3,3x4,3x1,4x2,4x3,4x4,4
一个3*3的卷积核为
w
1
,
1
w
1
,
2
w
1
,
3
w
2
,
1
w
2
,
2
w
2
,
3
w
3
,
1
w
3
,
2
w
3
,
3
\begin{matrix} w_{1,1}&w_{1,2}&w_{1,3} \\w_{2,1}&w_{2,2}&w_{2,3} \\w_{3,1}&w_{3,2}&w_{3,3} \end{matrix}
w1,1w2,1w3,1w1,2w2,2w3,2w1,3w2,3w3,3
将他们进行卷积操作,得到一个2*2的feature map,
r
1
,
1
r
1
,
2
r
2
,
1
r
2
,
2
\begin{matrix} r_{1,1}&r_{1,2} \\r_{2,1}&r_{2,2} \end{matrix}
r1,1r2,1r1,2r2,2
相应地,我们有
r
1
,
1
=
w
1
,
1
∗
x
1
,
1
+
w
1
,
2
∗
x
1
,
2
+
w
1
,
3
∗
x
1
,
3
+
w
2
,
1
∗
x
2
,
1
+
w
2
,
2
∗
x
2
,
2
+
w
2
,
3
∗
x
2
,
3
+
w
3
,
1
∗
x
3
,
1
+
w
3
,
2
∗
x
3
,
2
+
w
3
,
3
∗
x
3
,
3
r_{1,1}=w_{1,1}*x_{1,1}+w_{1,2}*x_{1,2}+w_{1,3}*x_{1,3}+w_{2,1}*x_{2,1}+w_{2,2}*x_{2,2}+w_{2,3}*x_{2,3}+w_{3,1}*x_{3,1}+w_{3,2}*x_{3,2}+w_{3,3}*x_{3,3}
r1,1=w1,1∗x1,1+w1,2∗x1,2+w1,3∗x1,3+w2,1∗x2,1+w2,2∗x2,2+w2,3∗x2,3+w3,1∗x3,1+w3,2∗x3,2+w3,3∗x3,3
r
1
,
2
,
r
2
,
1
,
r
2
,
2
r_{1,2},r_{2,1},r_{2,2}
r1,2,r2,1,r2,2可以依次类推。
如果原图用矩阵X表示,feature map用矩阵Y表示,则卷积运算可以表示为如下:
Y
=
C
∗
X
Y=C*X
Y=C∗X
Y是一个4*1的矩阵,
[
r
1
,
1
,
r
1
,
2
,
r
2
,
1
,
r
2
,
2
]
T
[r_{1,1},r_{1,2},r_{2,1},r_{2,2}]^T
[r1,1,r1,2,r2,1,r2,2]T
C是一个4*16的系数矩阵,
w
1
,
1
w
1
,
2
w
1
,
3
0
w
2
,
1
w
2
,
2
w
2
,
3
0
w
3
,
1
w
3
,
2
w
3
,
3
0
0
0
0
0
0
w
1
,
1
w
1
,
2
w
1
,
3
0
w
2
,
1
w
2
,
2
w
2
,
3
0
w
3
,
1
w
3
,
2
w
3
,
3
0
0
0
0
0
0
0
0
w
1
,
1
w
1
,
2
w
1
,
3
0
w
2
,
1
w
2
,
2
w
2
,
3
0
w
3
,
1
w
3
,
2
w
3
,
3
0
0
0
0
0
0
w
1
,
1
w
1
,
2
w
1
,
3
0
w
2
,
1
w
2
,
2
w
2
,
3
0
w
3
,
1
w
3
,
2
w
3
,
3
\begin{matrix} w_{1,1}&w_{1,2}&w_{1,3}&0&w_{2,1}&w_{2,2}&w_{2,3}&0&w_{3,1}&w_{3,2}&w_{3,3}&0&0&0&0&0\\ 0&w_{1,1}&w_{1,2}&w_{1,3}&0&w_{2,1}&w_{2,2}&w_{2,3}&0&w_{3,1}&w_{3,2}&w_{3,3}&0&0&0&0\\ 0&0&0&0&w_{1,1}&w_{1,2}&w_{1,3}&0&w_{2,1}&w_{2,2}&w_{2,3}&0&w_{3,1}&w_{3,2}&w_{3,3}&0\\ 0&0&0&0&0&w_{1,1}&w_{1,2}&w_{1,3}&0&w_{2,1}&w_{2,2}&w_{2,3}&0&w_{3,1}&w_{3,2}&w_{3,3} \end{matrix}
w1,1000w1,2w1,100w1,3w1,2000w1,300w2,10w1,10w2,2w2,1w1,2w1,1w2,3w2,2w1,3w1,20w2,30w1,3w3,10w2,10w3,2w3,1w2,2w2,1w3,3w3,2w2,3w2,20w3,30w2,300w3,1000w3,2w3,100w3,3w3,2000w3,3
X是一个16*1的矩阵
[
x
1
,
1
,
x
1
,
2
,
x
1
,
3
,
x
1
,
4
,
x
2
,
1
,
x
2
,
2
,
x
2
,
3
,
x
2
,
4
,
x
3
,
1
,
x
3
,
2
,
x
3
,
3
,
x
3
,
4
,
x
4
,
1
,
x
4
,
2
,
x
4
,
3
,
x
4
,
4
]
T
[x_{1,1},x_{1,2},x_{1,3},x_{1,4},x_{2,1},x_{2,2},x_{2,3},x_{2,4},x_{3,1},x_{3,2},x_{3,3},x_{3,4},x_{4,1},x_{4,2},x_{4,3},x_{4,4}]^T
[x1,1,x1,2,x1,3,x1,4,x2,1,x2,2,x2,3,x2,4,x3,1,x3,2,x3,3,x3,4,x4,1,x4,2,x4,3,x4,4]T
由此可见,卷积运算可以转化为矩阵的运算。
具体的运算过程如下:
二、反卷积
反卷积的英文名称有很多,deconvolution, transposed convolution, fractionally-strided convolution,其实都是一个意思。
我们将卷积运算展开成了矩阵的运算,同样的,我们也可以利用矩阵的运算来实现反卷积。
利用卷积操作,我们将4*4的图像变成了2*2的feature map, 我们的方法是利用一个4*16的矩阵乘一个16*1的矩阵;反过来,我们要将2*2的feature map恢复成一个4*4的图像,可以利用一个16*4的矩阵乘一个4*1的矩阵,于是有
Y
=
C
T
∗
X
Y=C^T*X
Y=CT∗X
Y是一个16*1的矩阵,
C
T
C^T
CT是一个16*4的矩阵,X是一个4*1的矩阵。这里的C的size和卷积操作中的是一样的。卷积的正向传播是反卷积的反向传播;卷积的反向传播是反卷积的反向传播。
反卷积中的系数矩阵C不一定和原卷积操作中的一致,但是他们的size符合转置的关系。
所以,我们可以将反卷积看作卷积的逆过程,他们的系数矩阵互为转置。反卷积的操作可以分为三步
- 在输入矩阵中添加0
- 对1中的矩阵进行卷积操作
- 对2中的结果进行裁剪
keras中有Conv2DTranspose之类的网络层,可以实现相关的操作。
参考资料1
Up-sampling with Transposed Convolution. https://towardsdatascience.com/up-sampling-with-transposed-convolution-9ae4f2df52d0, 2016/2018-8.19. ↩︎