反卷积(Deconvolution)|转置卷积(Transposed Convolution)

反卷积的叫法其实有点让人误解,其实叫转置卷积更为合适。

转置卷积被用到的地方还挺多,比如做图片的unsupervised learning, ZF-Net的卷积网络可视化,FCN的upsampling和GAN网络的图片生成等等。

比较直观一点的理解是,在CNN中,通过convolution过后的feature map通常会一层层缩小,而反卷积则相反,它会对feature产生“放大”的作用。

具体的众多动画示例可以在github(https://github.com/vdumoulin/conv_arithmetic)中看到。这个只贴出几个典型的例子。

正常的Convoluation (input = 4, stride = 1, padding = 0, output = 2)

反卷积(Deconvolution)|转置卷积(Transposed Convolution)

可以看出,经过3x3的kernel卷积之后,4x4的input变成了2x2的output。feature map变小了。

Transposed convolution (input = 2, stride = 1, padding = 0, output = 4)

反卷积(Deconvolution)|转置卷积(Transposed Convolution)

经过transposed convolution之后,2x2的输入变成了4x4的输出。补充一下,其实在做反卷积的时候是有补0的,尽管它声称padding = 0。

对转置卷积的理解:

卷积实际可以写成矩阵的形式:(具体形式可参考:A guide to convolution arithmetic for deeplearning)

Y = C*X

那么很自然的:

X = (C)^T * Y

反卷积(Deconvolution)|转置卷积(Transposed Convolution)