搞明白了卷积网络中所谓deconv究竟是个什么东西后,不写下来怕又忘记,根据参考资料,加上我本身的理解,记录在这篇博客里。git
第一次看到deconv这个词,觉得deconv的结果就是卷积的逆,以为神奇,不由产生了“哦?转置的卷积就能够求逆了吗?”这样的想法,而后在matlab里面实验求证,我还记得当时觉得反卷积可以求逆,考虑到图片进行常规卷积操做输出大小又不可能变大(same/valid),因而我还假设反卷积输出大小不变,用了same padding和原核的转置做为反卷积配置,结果发现根本不是那么一回事好吗。
其实DL中的deconv,是一种上采样过程,举个比方:输入
矩阵,卷积核
的状况下(以下左图),卷积的输出
。对
进行deconv,它只能作到把还原输出大小到和
同样大,输出值和
有那么一点联系。
因此啊deconv这个名字至关误导人呐!这在cs231n课程里也被吐槽过,你们如今更喜欢用transposed conv来表述反卷积。为了方便起见,后文就用反卷积这个词了。github
第二个容易confused的地方,就是不少文章都说卷积核的转置就能够求反卷积,又陷入迷茫“就算把卷积核转置(或者左右翻转上下翻转),卷积后输出仍是愈来愈小(或不变,至少不会增大)啊”……直到看到文献和相应的这个动画(其余动画在github-convolution arithmetic1)web
![]() |
![]() |
---|---|
卷积 | 反卷积 |
注意图中蓝色(下面)是输入,绿色(上面)是输出,卷积和反卷积在
等参数同样时,是至关于
和
调了个位。
这里说明了反卷积的时候,是有补0的,即便人家管这叫no padding(
),这是由于卷积的时候从蓝色
缩小为绿色
,因此对应的
反卷积应该从蓝色
扩展成绿色
。并且转置并非指这个
的核
变为
,但若是将卷积计算写成矩阵乘法(在程序中,为了提升卷积操做的效率,就能够这么干,好比tensorflow中就是这种实现),
(其中
表示将
拉成一维向量,
同理),那么反卷积确实能够表示为
,而这样的矩阵乘法,偏偏等于
左右翻转再上下翻转后与补0的
卷积的状况。网络
而后就产生了第三个confuse:“补0了会不会有影响,还能经过反卷积近似输入 吗?”其实反卷积也不必定能达到近似的效果,图像里的卷积,至关于一种相关操做,而反卷积维持了这种相关操做时的 与 、与 之间的联系维持了。至于补0后操做是否还等价,上一段已经说明了是等价的,读者能够在阅读完后面的文章后本身尝试一下。app
卷积和反卷积的过程在arXiv-A guide to convolution arithmetic for deep learning2写的很是详细,还有不少例子便于理解,在这里我就截图出重点来(ps.文中的figure2.1就是上图的左边)。剩下的例子请你们多看看原文,最好本身动手算一下,我也贴个我算的过程(
表示矩阵
的第
行),供参考。
关于反向传播, 知乎-如何理解深度学习中的deconvolution networks3有详细的推导过程。
ide