nn.ConvTranspose2d的参数output_padding的作用

参考:https://blog.csdn.net/qq_41368247/article/details/86626446

使用前提:stride > 1

补充:same卷积操作

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

 

举例:

 

比如输入特征图为6*6,stride=2, kernel_size = 3, 所以进行same卷机操作得输出特征图为3*3 (6/2 = 3)

如果输入特征图为5*5,stride=2,kernel_size = 3,这时候设置padding = 1,那么也会得到输出特征图为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 - stride + output_padding )/2

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

 

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

posted @ 2019-04-29 17:31  慢行厚积  阅读(16230)  评论(1编辑  收藏  举报