转置卷积Deconvolution/Transposed Convolution

来源

转置卷积也成为分数步卷积、反卷积;

当需要进行上采样是,可以使用转置卷积,与插值方法相比(Resize,如双线性插值直接缩放,类似于图像缩放),他具有可学习的参数;

转置卷积通常用在两个方面:

  • CNN可视化,通过反卷积将卷积得到的feature map还原到像素空间,来观察feature map对哪些pattern相应最大,即可视化哪些特征是卷积操作提取出来的;
  • FCN全卷积网络,由于要对图像进行像素级的分割,需要将图像尺寸还原到原来的大小,upsampling操作,所以需要采用反卷积;
  • GAN网络中,由于需要从输入图像到生成图像,自然需要将提取的特征图还原到和原图同样尺寸的大小,即也需要反卷积操作。

栗子:

  1. strides=1
    卷积:卷积核为 3x3;no padding
    转置卷积Deconvolution/Transposed Convolution_第1张图片
    反卷积:卷积核为:3x3
    转置卷积Deconvolution/Transposed Convolution_第2张图片
  2. strides=2
    卷积转置卷积Deconvolution/Transposed Convolution_第3张图片
    反卷积
    转置卷积Deconvolution/Transposed Convolution_第4张图片

在实际计算过程中,我们要转化为矩阵的乘积的形式,一个转化为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

反卷积的操作:
首先看stride=1时候的反卷积:这里写的是no padding,但是其实这对应的是正常卷积操作的no padding,然而实际意义上卷积操作是no padding,那么反卷积就是full padding;同时带来一个新的问题,那么padding到底是多少呢?这里我目前理解的是添加的padding值等于**(kernel_size - stride),像此处就是padding = kernel_size - stride = 3 - 1 = 2,那么padding添加为2。同样对于下面stride=2的时候,padding = 3 - 2 = 1。
但是当stride>1的时候,需要在原输入中插入0像素值,如上图stride=2的时候,填充padding其实是进行了两个步骤:其一是根据步长stride来填充,即在原输入矩阵中间插入
(stride-1)**= 2 - 1 = 1个像素值为0的值;其二再根据padding来填充,padding = kernel_size - stride = 3 - 2 = 1,所以需要在输入外围填充1个像素值为0的值。
然后,我们来稍微理解一下Toeplitz matrix这个东西,假设我们的输入input = [4,4],reshape之后是[1,16],B(可以理解为滤波器)=[16,4](Toeplitz matrix),那么A*B=C=[1,4]。Reshape C=[2,2]
所以,通过B 卷积,我们从shape=[4,4]变成了shape=[2,2]。
这里,我们的B滤波器为:(其实我们的B滤波器中的权重值也就是9个值,即kernel是3×3的卷积核。)
在这里插入图片描述
其实这里卷积核B的参数仍然只有9个,加上多个稀疏值0,来构成一个Toeplitz matrix和输入进行矩阵乘积操作。这里为什么B的shape会是16×4呢,因为其实输入是[4,4],其实是有16个值,所以第一维是16,然后因为kernel_size为3,4×4大小的输入需要计算四次,所以第二维是4。

注:以上卷积核B也可称为卷积矩阵,为了使用它,我们把 (44) 拉长为(161),再将这个矩阵与拉长的向量相乘,转置卷积矩阵即为卷积矩阵的转置。

反卷积和转置卷积的真正区别: 反卷积在数学含义上是可以还原输入信号的;但是转置卷积只能还原到原来输入的shape,其value值是不一样的。

你可能感兴趣的:(ML/DL)