深度学习 | 反卷积/转置卷积 的理解 transposed conv/deconv

搞明白了卷积网络中所谓deconv到底是个什么东西后,不写下来怕又忘记,根据参考资料,加上我自己的理解,记录在这篇博客里。

先来规范表达

  • 为了方便理解,本文出现的举例情况都是2D矩阵卷积,卷积输入和核形状都为正方形,x和y轴方向的padding相同,stride也相同。
  • 记号:
     i,o,k,p,s   i , o , k , p , s 分别表示:卷积/反卷积的输入大小  input size   i n p u t   s i z e ,卷积/反卷积输出大小  output size   o u t p u t   s i z e ,卷积/反卷积核大小  kernel size   k e r n e l   s i z e  padding   p a d d i n g  stride   s t r i d e
  • 举例(如下左图):
    输入  XR(4,4)   X ∈ R ( 4 , 4 ) 矩阵,卷积核  wR(3,3)padding=0stride=1   w ∈ R ( 3 , 3 ) , p a d d i n g = 0 , s t r i d e = 1 的情况下,卷积的输出  YR(2,2)   Y ∈ R ( 2 , 2 ) ,就记为  i=4,o=2,k=3,p=0,s=1   i = 4 , o = 2 , k = 3 , p = 0 , s = 1

推翻错误的理解

第一次看到deconv这个词,以为deconv的结果就是卷积的逆,觉得神奇,不禁产生了“哦?转置的卷积就可以求逆了吗?”这样的想法,然后在matlab里面实验求证,我还记得当时以为反卷积能够求逆,考虑到图片进行常规卷积操作输出大小又不可能变大(same/valid),于是我还假设反卷积输出大小不变,用了same padding和原核的转置作为反卷积配置,结果发现根本不是那么一回事好吗。
其实DL中的deconv,是一种上采样过程,举个比方:输入  XR(4,4)   X ∈ R ( 4 , 4 ) 矩阵,卷积核  wR(3,3)pad=0stride=1   w ∈ R ( 3 , 3 ) , p a d = 0 , s t r i d e = 1 的情况下(如下左图),卷积的输出  YR(2,2)   Y ∈ R ( 2 , 2 ) 。对  Y   Y 进行deconv,它只能做到把还原输出大小到和  X   X 一样大,输出值和  X   X 有那么一点联系。
所以啊deconv这个名字相当误导人呐!这在cs231n课程里也被吐槽过,大家现在更喜欢用transposed conv来表述反卷积。为了方便起见,后文就用反卷积这个词了。

第二个容易confused的地方,就是很多文章都说卷积核的转置就可以求反卷积,又陷入迷茫“就算把卷积核转置(或者左右翻转上下翻转),卷积后输出还是越来越小(或不变,至少不会增大)啊”……直到看到文献和相应的这个动画(其他动画在github-convolution arithmetic1

卷积 $\ padding=0,stride=1$反卷积$\ padding=0,stride=1$
卷积  i=4,k=3,p=0,s=1, o=2   i = 4 , k = 3 , p = 0 , s = 1 , 则   o = 2 反卷积  i=2,k=3,p=0,s=1, o=4   i = 2 , k = 3 , p = 0 , s = 1 , 则   o = 4

注意图中蓝色(下面)是输入,绿色(上面)是输出,卷积和反卷积在  psk    p 、 s 、 k   等参数一样时,是相当于  i   i  o   o 调了个位。
这里说明了反卷积的时候,是有补0的,即使人家管这叫no padding  p=0   p = 0 ),这是因为卷积的时候从蓝色  4×4   4 × 4 缩小为绿色  2×2   2 × 2 ,所以对应的  p=0   p = 0 反卷积应该从蓝色  2×2   2 × 2 扩展成绿色  4×4   4 × 4 。而且转置并不是指这个  3×3   3 × 3 的核  w   w 变为  wT   w T ,但如果将卷积计算写成矩阵乘法(在程序中,为了提高卷积操作的效率,就可以这么干,比如tensorflow中就是这种实现),  Y⃗ =CX⃗    Y → = C X → (其中  Y⃗    Y → 表示将  Y⃗    Y → 拉成一维向量,  X⃗    X → 同理),那么反卷积确实可以表示为  CTY⃗    C T Y → ,而这样的矩阵乘法,恰恰等于  w   w 左右翻转再上下翻转后与补0的  Y   Y 卷积的情况。

然后就产生了第三个confuse:“补0了会不会有影响,还能通过反卷积近似输入  X   X 吗?”其实反卷积也不一定能达到近似的效果,图像里的卷积,相当于一种相关操作,而反卷积维持了这种相关操作时的  w   w  X   X 、与  Y   Y 之间的联系维持了。至于补0后操作是否还等价,上一段已经说明了是等价的,读者可以在阅读完后面的文章后自己尝试一下。


反卷积以及反向传播的过程

卷积和反卷积的过程在arXiv-A guide to convolution arithmetic for deep learning2写的非常详细,还有很多例子便于理解,在这里我就截图出重点来(ps.文中的figure2.1就是上图的左边)。剩下的例子请大家多看看原文,最好自己动手算一下,我也贴个我算的过程(  Ci   C i 表示矩阵  C   C 的第  i   i 行),供参考。
关于反向传播, 知乎-如何理解深度学习中的deconvolution networks3有详细的推导过程。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述


参考资料

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页