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

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

先来规范表达

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

    examples (as shown on the left below):*

    输入X ∈R (4 ,4 )X∈R(4,4)矩阵,卷积核w ∈R (3 ,3 ),p a d d i n g =0 ,s t r i d e =1 w∈R(3,3),padding=0,stride=1的情况下,卷积的输出Y ∈R (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,是一种上采样过程,举个比方:输入X ∈R (4 ,4 )X∈R(4,4)矩阵,卷积核w ∈R (3 ,3 ),p a d =0 ,s t r i d e =1 w∈R(3,3),pad=0,stride=1的情况下(如下左图),卷积的输出Y ∈R (2 ,2 )Y∈R(2,2)。对Y Y进行deconv,它只能做到把还原输出大小到和X X一样大,输出值和X X有那么一点联系。
所以啊deconv这个名字相当误导人呐!这在cs231n课程里也被吐槽过,大家现在更喜欢用transposed conv来表述反卷积。为了方便起见,后文就用反卷积这个词了。

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

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

卷积
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

注意图中蓝色(下面)是输入,绿色(上面)是输出,卷积和反卷积在p 、s 、k 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变为w T wT,但如果将卷积计算写成矩阵乘法(在程序中,为了提高卷积操作的效率,就可以这么干,比如tensorflow中就是这种实现),Y ⃗ =C X ⃗ Y→=CX→(其中Y ⃗ Y→表示将Y ⃗ Y→拉成一维向量,X ⃗ X→同理),那么反卷积确实可以表示为C T Y ⃗ CTY→,而这样的矩阵乘法,恰恰等于w w左右翻转再上下翻转后与 补0的Y Y 卷积的情况。

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

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

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

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

Original: https://www.cnblogs.com/hdk1993/p/8784578.html
Author: 程序员修练之路
Title: 深度学习卷积网络中反卷积/转置卷积的理解 transposed conv/deconv

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/7615/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部