zoukankan      html  css  js  c++  java
  • 反卷积 转置卷积的理解

    看了很多反卷积和转置卷积的文章,似乎还是一头雾水,记录下自己理解的过程~

    有人一句话总结:逆卷积相对于卷积在神经网络结构的正向和反向传播中做相反的运算。其实还是不是很理解。

    反卷积(转置卷积)通常用来两个方面:

    1. CNN可视化,通过反卷积将卷积得到的feature map还原到像素空间,来观察feature map对哪些pattern相应最大,即可视化哪些特征是卷积操作提取出来的;

    2. FCN全卷积网络中,由于要对图像进行像素级的分割,需要将图像尺寸还原到原来的大小,类似upsampling的操作,所以需要采用反卷积;

    3. GAN对抗式生成网络中,由于需要从输入图像到生成图像,自然需要将提取的特征图还原到和原图同样尺寸的大小,即也需要反卷积操作。

    我们先来看看卷积和反卷积的图,简直不要太形象。
    卷积(convolution):
    卷积核为 3x3;no padding , strides=1
     
    "反卷积"(the transpose of conv) 可以理解为upsample conv.
    卷积核为:3x3; no padding , strides=1

    那看下strides=2的时候。
    卷积:

    反卷积:

    在实际计算过程中,我们要转化为矩阵的乘积的形式,一个转化为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]的呢?
    通过Toeplitz matrix,不清楚自己百度下~
     
    重点来了:对于卷积操作很了解,这里不多说。我们梳理一下反卷积的操作:
    首先看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。

    如果你不理解Toeplitz matrix是怎么来的,你可以在草稿纸上笔划一下,即一个4×4的输入矩阵和一个3×3的卷积核进行卷积操作,然后对照[1,16]*[16,4]矩阵相乘,你会发现其实计算的结果是一样的。

    另外要说明一点反卷积和转置卷积的真正区别:

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

     借用一个反池化的图简单说明一下转置卷积是可以恢复到原来输入的shape,但是其value值是不一样的。

    我们知道,池化是不可逆的过程,然而我们可以通过记录池化过程中,最大激活值得坐标位置。然后在反池化的时候,只把池化过程中最大激活值所在的位置坐标的值激活,其它的值置为0,当然这个过程只是一种近似,因为我们在池化的过程中,除了最大值所在的位置,其它的值也是不为0的。

    2018.09.03

    这里说一下什么是上采样。

    实际上,上采样(upsampling)一般包括2种方式:

    1. Resize,如双线性插值直接缩放,类似于图像缩放(这种方法在原文中提到)
    2. Deconvolution,也叫Transposed Convolution

    传统的网络是subsampling的,对应的输出尺寸会降低;upsampling的意义在于将小尺寸的高维度feature map恢复回去,以便做pixelwise prediction,获得每个点的分类信息。

  • 相关阅读:
    google 地图 v2
    javascript 跨域名 异常:
    cvs 使用规范
    fastcgi apache fcgi
    玄幻系列
    必须掌握的命令行(转)
    浏览器,RIA,flash,flex,siliverlight,socket
    游戏外挂的一些原理
    shtml我几乎要忘了的东西
    北京下雨了,兴奋中
  • 原文地址:https://www.cnblogs.com/wmr95/p/9551490.html
Copyright © 2011-2022 走看看