首先, 引用一篇博文的图,讲解的很清楚,这篇博文讲解的也很清楚,还有手写代码实现,我就说下我自己的理解.
tensorflow的反卷积也被成为转置卷积, 在执行反卷积的时候, tensorflow通常会做以下几个操作:
- 根据设置的stride对featuremap填充0, 具体来说, 就是将featuremap填充至
(h*stride-stride+3, w*stride-stride+3)
(感谢葉相惜的指正)大小. 填充方式为在原来的featuremap元素之间填充stride-1
个零,然后四周再补一圈0. - 然后再根据填充0之后的featuremap进行普通的卷积,此时的stride变成1, padding方式为传入反卷积的padding方式
- 最后再对卷积的结果进行crop,裁去右边最后一列和下边最后一行
一般在神经网络中,反卷积的作用都是用作上采样来的,所以反卷积的结果一般都是原来的featuremap size两倍大小. 更普通的反卷积(指定输出大小但不是原图的2倍)没有尝试过.