Deconvolution

  1. Torch Function
    • torch.nn.ConvTranspose2d()
    • 经常出现在需要进行上采样的地方,通俗来讲,就是需要进行特征恢复或者图像扩大的地方。而之所以称其为“逆卷积”,是因为该方法进行上采样的方式与卷积操作互为“逆过程”。但也仅限于区域恢复,而无法确定原来的特征值在卷积域内的分布情况。
    • 参数列表
      • in_channels (int) – Number of channels in the input image
      • out_channels (int) – Number of channels produced by the convolution
      • kernel_size (int or tuple) – Size of the convolving kernel
      • output_padding (int or tuple, optional) – Additional size added to one side of each dimension in the output shape. Default: 0
      • stride (int or tuple, optional) – Stride of the convolution. Default: 1
        • 此处的stride与卷积不同,相当于对中间输入,进行区域扩张插值,而并非卷积核的跨度!!!
        • no_padding_strides_transposed
      • padding (int or tuple, optional) – dilation * (kernel_size - 1) - padding zero-padding will be added to both sides of each dimension in the input. Default: 0
        • 此处的padding也与卷积不同,注意deconv的核心是 “恢复” 即最终得到的图像要等于卷积前的m,因此在最原始的情况 no padding 时,注意针对的是卷积时no padding的情况,逆卷积扩展(k-1)!!!!才可以保证最终的输出结果可以为m
        • Conv : I(m,m)K(k,k)=O(mk+1,mk+1)I(m,m) *K(k,k) = O(m-k+1,m-k+1)
        • Deconv : O(mk+1+2(k1),mk+1+2(k1))K(kk)=O(m,m)O(m-k+1 + 2(k-1),m-k+1 + 2(k-1)) * K(k*k) = O^{'}(m,m)
  2. Detail derivation
    • basic formula m+2pks+1\frac{m + 2p -k}{s} + 1
    • 加入 stride s \rightarrow 中间图像扩张插值
      • Conv : I(m,m)Ks(k,k)=O(mks+1,mks+1)I(m,m) *K_s(k,k) = O(\frac{m-k}{s}+1,\frac{m-k}{s}+1)
      • OOk-1扩展,并且插值扩张,每组pixel之间插入(s1)(s-1)个,一共有(mks+11)(\frac{m-k}{s}+1 -1)
      • Deconv : O(mks+1+2(k1)+(s1)(mks+11),mks+1+2(k1)+(s1)(mks+11))=O(m+k1,m+k1)K(k,k)=O(m,m)O^{'}(\frac{m-k}{s}+1 + 2(k-1) + (s - 1)(\frac{m-k}{s}+1-1),\frac{m-k}{s}+1 + 2(k-1) + (s - 1)(\frac{m-k}{s}+1-1)) = O^{'}(m+k-1,m+k-1) * K(k,k) = O^{''}(m,m)
    • 加入 padding p \rightarrow 原始图像填充
      • Conv : I(m+2p,m+2p)K(k,k)=O(m+2pk+1,m+2pk+1)I(m + 2p, m + 2p) * K(k,k) = O(m+2p - k+1,m+2p - k+1)
      • OO此时不用做k-1扩展,而为k-1-p扩展
      • Deconv : O(m+2pk+1+2p,m+2pk+1+2p)K(k,k)=O(m+2p+2p2(k1),m+2p+2p2(k1))=O(m,m)O^{'}(m+2p - k+1 + 2p^{'},m+2p - k+1 + 2p^{'}) * K(k,k)\\ = O^{''}(m+2p+2p^{'}-2(k-1) , m+2p+2p^{'}-2(k-1)) = O^{''}(m,m)
      • p=k1pp^{'} = k-1-p
    • 同时加入stride s 和 padding p
    • Conv : I(m+2p,m+2p)Ks(k,k)=O(m+2pks+1,m+2pks+1)I(m+2p,m+2p) * K_s(k,k) = O(\frac{m+2p-k}{s}+1,\frac{m+2p-k}{s}+1)
    • k-1-p扩展, 并且插值扩张,每组pixel之间插入(s1)(s-1)个,一共有(m+2pks+11)(\frac{m+2p-k}{s}+1 -1)
    • Deconv : O(m+2pks+1+2p+(s1)(m+2pks+11),m+2pks+1+2p+(s1)(m+2pks+11))=O(m+2p+2pk+1,m+2p+2pk+1)K(s,s)=O(m+2p+2p2(k1),m+2p+2p2(k1)=O(m,m)O^{'}(\frac{m+2p-k}{s}+1 + 2p^{'} + (s-1)(\frac{m+2p-k}{s}+1 -1),\frac{m+2p-k}{s}+1 + 2p^{'} + (s-1)(\frac{m+2p-k}{s}+1 -1)) \\ = O^{'}(m+2p+2p^{'}-k +1,m+2p+2p^{'}-k +1) * K(s,s)\\ = O^{''}(m+2p+2p^{'}-2(k -1),m+2p+2p^{'}-2(k -1) = O^{''}(m,m)
    • p=k1pp^{'} = k-1-p
  3. Final formula
    Hout=(Hin1)stride2padding+kernel_size+output_paddingH_{out} = (H_{in} -1 )*stride -2*padding + kernel\_size + output\_padding