反卷积(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)
可以看出,经过3x3的kernel卷积之后,4x4的input变成了2x2的output。feature map变小了。
Transposed convolution (input = 2, stride = 1, padding = 0, output = 4)
经过transposed convolution之后,2x2的输入变成了4x4的输出。补充一下,其实在做反卷积的时候是有补0的,尽管它声称padding = 0。
对转置卷积的理解:
卷积实际可以写成矩阵的形式:(具体形式可参考:A guide to convolution arithmetic for deeplearning)
Y = C*X
那么很自然的:
X = (C)^T * Y