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

    参考:打开链接

    卷积:

    就是这个图啦,其中蓝色部分是输入的feature map,然后有3*3的卷积核在上面以步长为2的速度滑动,可以看到周围还加里一圈padding,用更标准化的参数方式来描述这个过程:
    二维的离散卷积(N=2)
    方形的特征输入((i_{1}=i_{2}=i))
    方形的卷积核尺寸((k_{1} = k_{2}=k))
    每个维度相同的步长((s_{1}=s_{2}=s))
    每个维度相同的padding((p_{1}=p_{2}=p))
    这里写图片描述
    ((i = 5, k = 3, s = 2, p = 1)), (输出特征尺寸o_{1} = o{2} = o)
    其中,卷积层输入特征与输出特征尺寸和卷积核参数的关系为: (o = (floor)[frac{i+2p-k}{s}+1])

    反卷积

    这里写图片描述
    这里写图片描述
    考虑一下这个图,其中的参数描述是:(i=4,k=3,s=1,p=0),输出o=2。
    对于这个运算,我们把33的卷积核展开成如下图所示的[4,16]的稀疏矩阵,其中非0元素(w_{ij})表示卷及核的第i行和第j列。
    这里写图片描述
    然后再把4
    4的输入特征转换成[16,1]的矩阵X,那么Y=CX则是一个[4,1]的输出特征矩阵,把它重新排列2×2的输出特征就得到最终的结果,从上述分析可以看出卷积层的计算其实是可以转化成矩阵相乘的。值得注意的是,在一些深度学习网络的开源框架中并不是通过这种这个转换方法来计算卷积的,因为这个转换会存在很多无用的0乘操作,Caffe中具体实现卷积计算的方法可参考Implementing convolution as a matrix multiplication。通过上述的分析,我们已经知道卷积层的前向操作可以表示为和矩阵C相乘,那么我们很容易得到卷积层的反向传播就是和C的转置相乘。
    反卷积的作用:噪声升维,上采样,从低维度进入高维度,比直接给定高维度随机形更强,这样就可以通过修改转置conv kernel去梯度下降出网络超参数

    反卷积和卷积的关系

    全面我们已经说过反卷积又被称为Transposed(转置) Convolution,我们可以看出其实卷积层的前向传播过程就是反卷积层的反向传播过程,卷积层的反向传播过程就是反卷积层的前向传播过程。因为卷积层的前向反向计算分别为乘 (C)
    (C^{T}),而反卷积层的前向反向计算分别为乘 (C^{T})((C^{T})^{T}) ,所以它们的前向传播和反向传播刚好交换过来。

    下图表示一个和上图卷积计算对应的反卷积操作,其中他们的输入输出关系正好相反。如果不考虑通道以卷积运算的反向运算来计算反卷积运算的话,我们还可以通过离散卷积的方法来求反卷积(这里只是为了说明,实际工作中不会这么做)。

    同样为了说明,定义反卷积操作参数如下:
    二维的离散卷积 ((N = 2))
    方形的特征输入 (i^{prime}_{1}=i^{prime}_{2}=i^{prime})
    方形的卷积核尺寸(k_{1}^{prime}=k_{2}^{prime}=k^{prime})
    每个维度相同的步长(s_{1}^{prime}=s_{2}^{prime}=s^{prime})
    每个维度相同的padding (p_{1}^{prime}=p_{2}^{prime}=p^{prime})

    下图表示的是参数为((i^{prime} = 2, k^{prime} = 3, s^{prime} = 1, p^{prime} = 2))的反卷积操作,其对应的卷积操作参数为((i = 4, k = 3, s = 1, p = 0))。我们可以发现对应的卷积和非卷积操作其((k = k ^{prime}, s = s^{prime} = 1)),但是反卷积却多了(p^{prime} = 2)。通过对比我们可以发现卷积层中左上角的输入只对左上角的输出有贡献,所以反卷积层会出现(p^{prime} = k - p - 1 = 2).通过示意图,我们可以发现,反卷积层的输入输出在$ s = s^{prime} = 1$的情况下关系为: $$o^{prime} = i^{prime} - k^{prime} + 2p^{prime} + 1 = i^{prime} + (k-1) - 2p$$
    这里写图片描述

    Fractionally Strided Convolution

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

    [o^{prime} = s(i^{prime} -1)+k-2p ]

    这里写图片描述

  • 相关阅读:
    [转发]深入浅出EventSourcing和CQRS
    [转载]缓存与数据库双写一致性问题
    关于com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“java.lang.RuntimeException: Could not generate DH keypair”
    [转载]安装sql2016时提示Polybase 要求安装Oracle JRE 7更新51 (64位)或更高版本”规则失败
    windows安装配置压缩版mysql
    virtualbox虚拟机centeros7系统桥接网卡网络配置
    oracle导入dmp文件(恢复数据)
    解决PL/SQL DEVELOPER12查询中文乱码问题(本地没装Oracle)
    JAVA线程Thread
    深入构造器
  • 原文地址:https://www.cnblogs.com/kk17/p/10094075.html
Copyright © 2011-2022 走看看