深度学习中的卷积与反卷积

普通的神经网络(全连接网络):只能处理向量,因而需要把常见的把图像、音频等高维输入数据展开成向量才能输入给神经网络,这大大破坏了数据在空间上的位置信息。

卷积和反卷积:使得神经网络能够处理二维以上的数据,因而能够保持数据在空间上的位置信息。另外,权重共享使得网络参数大大减少,从而降低了计算复杂度。

卷积

首先假设对于卷积,已知:
input size i1=i2=i
kernel size k1=k2=k
stride s1=s2=s
padding size p1=p2=p

首先来看两个例子:
1) (i=5,k=3,s=1,p=1) -> (o1=o2=o=3)
深度学习中的卷积与反卷积

2) (i=7,k=3,s=2,p=1) -> (o1=o2=o=3)
深度学习中的卷积与反卷积

卷积层输入特征与输出特征尺寸与卷积核参数的关系为:

o=i+2pks+1

卷积与矩阵乘法的关系

考虑如下一个卷积运算。(i=4,k=3,s=1,p=0) -> (o=2)
深度学习中的卷积与反卷积
对于上述卷积运算,我们把上图所示的3×3卷积核展成一个如下所示的[4,16]的稀疏矩阵 C, 其中非0元素 wi,j表示卷积核的第i行和第j列:
C=

w0,0000w0,1w0,000w0,2w0,1000w0,200w1,00w0,00w1,1w1,0w0,1w0,0w1,2w1,1w0,2w0,10w1,20w0,2w2,00w1,00w2,1w2,0w1,1w1,0w2,2w2,1w1,2w1,10w2,20w1,200w2,0000w2,1w2,000w2,2w2,1000w2,2 

再把4×4的输入展开成[16,1]的矩阵:
X=
x0,0x0,1x0,2x0,3x1,0x1,1x1,2x1,3x2,0x2,1x2,2x2,3x3,0x3,1x3,2x3,3

CX=Y是一个[4,1]的输出矩阵。把Y重新排列成2×2的矩阵,就是卷积运算最终的输出。由此可以看出卷积层的计算其实是可以转化成矩阵相乘的。

通过上述的分析,我们已经知道卷积层的前向操作可以表示为输入X和矩阵C相乘,那么我们很容易得到卷积层的反向传播就是XC的转置相乘。
即卷积的前向操作为:CX=Y
卷积的反向操作为:CTY=X

卷积与反卷积的关系

其实卷积层的前向传播过程就是反卷积层的反向传播过程,卷积层的反向传播过程就是反卷积层的前向传播过程.
即反卷积的前向操作为:CTY=X
反卷积的反向操作为:CX=Y
假设对于反卷积,已知:
input size i1=i2=i
kernel size k1=k2=k
stride s1=s2=s
padding size p1=p2=p
反卷积层输入特征与输出特征尺寸与卷积核参数的关系为:
o=i+2pk+1=i+(k1)2p
其中带上标的为反卷积层参数,不带上标的是反卷积层对应的卷积层参数。其中会有关系:k=k′,s=s′。

举个例子:
反卷积参数为(i′=2,k′=3,s′=1,p′=2),其对应的卷积操作的参数为(i=4,k=3,s=1,p=0)。对比可以发下,反卷积多了p′=2。这是因为卷积层中左上角的输入只对左上角的输出有贡献,所以反卷积层会出现 p′=k−p−1=2。
反卷积:
深度学习中的卷积与反卷积
对应的卷积操作为:
深度学习中的卷积与反卷积

Fractionally Strided Convolution
上面也提到过反卷积有时候也被叫做Fractionally Strided Convolution,即卷积操作的步长不为1。对于步长 s>1的卷积,我们可能会想到其对应的反卷积步长 s′<1。 如下图所示为一个参数为 (i=5,k=3,s=2,p=1)的卷积操作(就是第一张图所演示的)所对应的反卷积操作。对于反卷积操作的小数步长我们可以理解为:在其输入特征单元之间插入 s−1 个0,插入0后把其看出是新的特征输入,然后此时步长 s′不再是小数而是为1。因此,结合上面所得到的结论,我们可以得出Fractionally Strided Convolution的输入输出关系为:
o'=s(i'1)+k2p

深度学习中的卷积与反卷积

总结:
卷积操作的输出尺寸:o=i+2pks+1
反卷积操作的输出尺寸:o=i+2pk+1=i+(k1)2p
小数步长反卷积操作的输出尺寸:o'=s(i'1)+k2p
(对于反卷积操作,在其输入特征单元之间插入s−1个0,周围再填充s-p-1个0)

参考:
https://buptldy.github.io/2016/10/29/2016-10-29-deconv/