Pytorch中torch.nn.ConvTranspose2d函数详解

原理

ConvTranspose,即反卷积,通过卷积的形式,利用图像特征“恢复”到原图像。

当然,此处卷积核的权重参数与前面下采样卷积核的参数互相独立,且可更新。

也就是说“反”卷积不是之前的逆过程,无法保证完全恢复。

事实上,反卷积仅仅保留了特征与前级特征,点之间的对应关系

代码详解

简明起见,引入“正卷积”概念,意指从 低级特征 到 高级特征 的过程。

ConvTranspose2d 与 Conv2d 的参数形式、含义基本一致。需要注意的仅两点:

  • out_padding 这个也是补零,但是对反卷积后的特征图补零。
    • 设置该参数是由于不同尺寸的特征经卷积(下采样)后可以产生相同尺寸的特征,那么在反卷积对应回去的时候,通过out_padding解决多尺寸的问题。说白了,根本原因在于之前的卷积(下采样)有时会无法利用所有原始信息,有边角料未利用,如:input=5x5,padding=0,kernel_size=2x2,stride=2这种情况。
  • stride & padding 卷积步长和补零。
    • 反直觉的是:padding为之前“正卷积”补零个数
      • padding=0,“正卷积”为valid模式,那么要恢复原尺寸,反卷积就应为full模式,即为该特征两侧各补kernel_size-1个0;
      • padding=kernel_size-1,那么“正卷积”为full模式,则反卷积不用再补零。
      • padding=p,where 0p'=kernel_size-1-p。
    • stride 不再控制上采样的步长,而是控制输入特征图中,像素点间的间隙。原来的步长概念此时恒为1。stride默认为1,即无间隙。若stride=m,则输入特征图的像素点增添间隙,散开来,尺寸变为(input-1)x stride+1。
      • 事实上,这里的增大间隙正是下采样增大步长的对应过程。原来增大步长后,所卷积得到的特征图的相邻点,映射到原特征的区域之间的间距会变大。那么再通过卷积反求原来的低级特征时,就要将这个间距实实在在体现到对高级特征的处理上,即所谓增大间隙。(反卷积又称分数步长卷积,此即分数步长之体现、由来)

综上,给出ConvTranspose2d输入、输出特征大小计算式:

令输入特征大小为 i,输出为 o,反卷积核为 k x k,则有

o=\frac{\left \{ \left [\left ( i-1 \right )\times stride +1 \right ] +\left [ \left ( k-1-padding \right ) \times 2\right ]-k\right \}}{default\equiv 1}+1+outpadding

o=\left ( i-1 \right )\times stride+k-2padding+outpadding

 

可参考如下链接:Transposed convolution arithmetic

你可能感兴趣的:(Pytorch,反卷积,卷积神经网络)