看了很多反卷积和转置卷积的文章,似乎还是一头雾水,记录下自己理解的过程~
有人一句话总结:逆卷积相对于卷积在神经网络结构的正向和反向传播中做相反的运算。其实还是不是很理解。
反卷积(转置卷积)通常用来两个方面:
1. CNN可视化,通过反卷积将卷积得到的feature map还原到像素空间,来观察feature map对哪些pattern相应最大,即可视化哪些特征是卷积操作提取出来的;
2. FCN全卷积网络中,由于要对图像进行像素级的分割,需要将图像尺寸还原到原来的大小,类似upsampling的操作,所以需要采用反卷积;
3. GAN对抗式生成网络中,由于需要从输入图像到生成图像,自然需要将提取的特征图还原到和原图同样尺寸的大小,即也需要反卷积操作。
卷积核为 3x3;no padding , strides=1
卷积核为:3x3; no padding , strides=1
卷积:
反卷积:
在实际计算过程中,我们要转化为矩阵的乘积的形式,一个转化为Toeplitz matrix,一个reshape为列矩阵。
举个简单的例子
比如 input= [3,3],Reshape之后,为A=[1,9]
B(可以理解为滤波器)=[9,4](Toeplitz matrix)
那么A*B=C=[1,4]。Reshape C=[2,2]
所以,通过B 卷积,我们从shape=[3,3]变成了shape=[2,2]
反过来。
输入A=[2,2],reshape之后为[1,4]
B的转置为[4,9]
那么A*B=C=[1,9],reshape为[3,3]
所以,通过B的转置 - "反卷积",我们从shape=[2,2]得到了shape=[3,3]
也就是输入feature map A=[3,3]经过了卷积滤波B=[2,2] 输出为 [2,2] ,所以padding=0,stride=1
反卷积则是
输入feature map A=[2,2],经过了反卷积滤波B=[2,2].输出为[3,3].padding=0,stride=1
那么[2,2]的卷积核(滤波器)是怎么转化为[4,9]或者[9,4]的呢?
所以,通过B 卷积,我们从shape=[4,4]变成了shape=[2,2]。
其实这里卷积核B的参数仍然只有9个,加上多个稀疏值0,来构成一个Toeplitz matrix和输入进行矩阵乘积操作。这里为什么B的shape会是16×4呢,因为其实输入是[4,4],其实是有16个值,所以第一维是16,然后因为kernel_size为3,4×4大小的输入需要计算四次,所以第二维是4。
如果你不理解Toeplitz matrix是怎么来的,你可以在草稿纸上笔划一下,即一个4×4的输入矩阵和一个3×3的卷积核进行卷积操作,然后对照[1,16]*[16,4]矩阵相乘,你会发现其实计算的结果是一样的。
另外要说明一点反卷积和转置卷积的真正区别:
反卷积在数学含义上是可以还原输入信号的;但是转置卷积只能还原到原来输入的shape,其value值是不一样的。
我们知道,池化是不可逆的过程,然而我们可以通过记录池化过程中,最大激活值得坐标位置。然后在反池化的时候,只把池化过程中最大激活值所在的位置坐标的值激活,其它的值置为0,当然这个过程只是一种近似,因为我们在池化的过程中,除了最大值所在的位置,其它的值也是不为0的。
2018.09.03
这里说一下什么是上采样。
实际上,上采样(upsampling)一般包括2种方式:
- Resize,如双线性插值直接缩放,类似于图像缩放(这种方法在原文中提到)
- Deconvolution,也叫Transposed Convolution。
传统的网络是subsampling的,对应的输出尺寸会降低;upsampling的意义在于将小尺寸的高维度feature map恢复回去,以便做pixelwise prediction,获得每个点的分类信息。