nn.ConvTranspose2d的参数output_padding的作用(转)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nn.ConvTranspose2d的参数output_padding的作用(转)相关的知识,希望对你有一定的参考价值。

参考技术A

same卷积操作:
是通过padding使得卷积之后输出的特征图大小保持不变(相对于输入特征图),不代表得到的输出特征图的大小与输入特征图的大小完全相同,<u>而是</u>他们之间的比例保持为 输入特征图大小/输出特征图大小 = stride

举例:

比如输入特征图为 6*6,stride=2, kernel_size = 3, 进行same padding得到输出特征图为3*3 (6 / 2 = 3)

如果输入特征图为 5*5,stride=2,kernel_size = 3,进行same padding,那么也会得到输出特征图为3*3

那么这样的情况就会导致在逆卷积时出现一个问题。

不同大小的图片经过卷积运算能得到相同尺寸的输出,那么作为逆运算, 同样的一张输入图像经过反卷积是否会有不同尺寸的合法输出 ?这样的话就存在争议了

上面还只是进行same卷积的情况,如果考虑valid卷积,stride=2, kernel_size = 3,padding=0时,输入特征图为7*7和8*8的结果也是3*3

解决争议的办法就是 使用output_padding参数

output_padding的作用是:
当stride > 1时,Conv2d将多个输入形状映射到相同的输出形状。output_padding通过在一边有效地增加计算出的输出形状来解决这种模糊性。

首先我们要认同一个前提:

大多数情况下我们都希望经过卷积/反卷积处理后的图像尺寸比例与步长相等,即 输入特征图大小/输出特征图大小 = stride ,也就是same模式

所以我们只要通过添加output_padding这一参数来使得结果满足这一前提,那么输出的图片的大小就能够保证为输入图片*stride的大小,而不是任意可能的大小

实现办法:

因为pytorch将参数 padding(注意与output_padding区别)建议设置为(kernel_size - 1)/2 ,由式子padding= kernel - 1 - padding转换而来

那么根据式子:

当我们希望得到 输入特征图大小/输出特征图大小 = stride 的话,代入上面的式子能够得到结果:

所以为了让padding = (kernel_size - 1)/2,则 output_padding应该取值为stride - 1 ,这样就能够满足输入特征图大小/输出特征图大小 = stride

当然,你可以取别的值,这并不会影响到逆卷积的计算,但是在后面进行有关大小的操作时就很可能出现问题,因为输出的图片的大小并不能保证是 输入图片*stride的大小,可能是任意正确的大小,如上面举的例子,可能是7*7或8*8等

中文乱码解决方案

  •  读取csv文件出现中文乱码方案,增加编码格式参数
    read.csv(trainPath,header=TRUE,stringsAsFactors=TRUE,encoding = "UTF-8")
  • 保存csv文件中出现乱码,编码格式参数
    write.csv(outp, file = path, quote = F, fileEncoding = "UTF-8")
  • source 加载R脚本中文乱码
    source("core.R",encoding="utf-8")
  • RStudio中脚本中文乱码,编码格式设置:tools -> global option...., 如下图:
  • source加载R脚本waring, 函数及变量加载不进来的问题
    > source("core.R",encoding="utf-8")
    Warning message:
    In readLines(file, warn = FALSE) :
      invalid input found on input connection \'core.R\'
  •  R语言环境的显示问题

    > sessionInfo()
    R version 3.2.5 (2016-04-14)
    Platform: x86_64-w64-mingw32/x64 (64-bit)
    Running under: Windows >= 8 x64 (build 9200)
    
    locale:
    [1] LC_COLLATE=Chinese (Simplified)_China.936  LC_CTYPE=Chinese (Simplified)_China.936    LC_MONETARY=Chinese (Simplified)_China.936
    [4] LC_NUMERIC=C                               LC_TIME=Chinese (Simplified)_China.936    
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    
    other attached packages:
    [1] plyr_1.8.4   DT_0.2       RODBC_1.3-13
    
    loaded via a namespace (and not attached):
    [1] htmlwidgets_0.7 magrittr_1.5    htmltools_0.3.5 tools_3.2.5     Rwordseg_0.2-1  Rcpp_0.12.6     digest_0.6.9   
    > Sys.getlocale()
    [1] "LC_COLLATE=Chinese (Simplified)_China.936;LC_CTYPE=Chinese (Simplified)_China.936;LC_MONETARY=Chinese (Simplified)_China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_China.936"
    > Sys.setlocale(category = "LC_ALL",local="us")
    [1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"
    > Sys.setlocale(category = "LC_ALL",local="chinese")
    [1] "LC_COLLATE=Chinese (Simplified)_China.936;LC_CTYPE=Chinese (Simplified)_China.936;LC_MONETARY=Chinese (Simplified)_China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_China.936"

   

以上是关于nn.ConvTranspose2d的参数output_padding的作用(转)的主要内容,如果未能解决你的问题,请参考以下文章

pytorch 修改预训练model

[PyTorch]PyTorch中反卷积的用法

Pytorch入门实战:基于GAN生成简单的动漫人物头像

SS:转置卷积与膨胀卷积

代码实例

使用 FxCop 命令行参数使用多个自定义字典