CNN unpooling和deconvolution

        我们知道,在auto_encoder中,有encode和decode两个部分,其中encode是将input变成code,一般是从高维变到低维,decode解码code,要使解码之后的output与input越接近越好,也就是从低维变高维。如果用CNN来做auto_encoder,那么convolution、pooling就是在encode,所以decode部分就要用到unpooling和deconvolution.
CNN unpooling和deconvolution

1.unpooling

        以maxpooling为例,设kernel的size是2*2
CNN unpooling和deconvolution
        从①到②就是maxpooling的过程,此时,我们还要记住每块最大值的位置,在做unpooling的时候,先把最大值填入原来的位置上,即③,然后把其他位置补零,即④,④就是unpooling的结果。
        也有其他做法,比如直接把这四个最大值复制三次,然后填入对应的色块中即可。

2.deconvolution

CNN unpooling和deconvolution
        假设input的size是5,kernel的size是 31,stride=1,padding=0,则output的size[(5-3)/1]+1 * 1 即31(线条颜色一样表示权值共享)。上图就是convolution的过程。以下是deconvolution的过程:
CNN unpooling和deconvolution
CNN unpooling和deconvolution
CNN unpooling和deconvolution
实际上,deconvolution的过程,也可以看作是一个convolution过程:
CNN unpooling和deconvolution
即先padding,然后再convolution
CNN unpooling和deconvolution
最终的结果就是这样:
CNN unpooling和deconvolution
CNN unpooling和deconvolution