pytorch 转置卷积api
nn.ConvTranspose2d(in_channels, out_channels, kernel_size=3, stride=2, padding=1, dilation=1, output_padding=1)
作用:进行转置卷积,用于上采样
设原本图像大小为in∗inin*inin∗in,图像的padding为1,经过一个为kernelkernelkernel_sizesizesize为3,卷积的dilationdilationdilation为1的给定卷积核,得到一个特征图大小为out∗outout*outout∗out,而这个转置卷积就是用于将当前out∗outout*outout∗out的特征图上采样成in∗inin*inin∗in,padding,string,kernelpadding,string,kernelpadding,string,kernel_size,dilation 都是指原来的图像经过的卷积操作的参数,从而变成大小当前的特征图。out_padding用于防止stride大于1的时候1对多的现象。
什么是dilation?

卷积运算时,卷积核元素之间的距离,如果dilation不为1,卷积核的作用点更加分散,最后输出的特征图会更小,大小等于用**kernel_size+(dilation-1)*(kernel_size-1)**大小的卷积核得到的特征图
卷积多对一现象
假设现在有一个卷积核3*3,stride = 2;那么一个5x5的图,经过卷积得到的大小为2x2,一个6x6的图经过卷积也是2x2,那给定2x2的特征图,经过转置卷积要恢复到哪个size呢?
卷积输出的特征图计算公式为out=in+2∗padding−kernelsizestride+1out = \frac{in + 2*padding-kernelsize}{stride} + 1out=stridein+2∗padding−kernelsize+1
这里的除法一般都是下取整,所以导致上面的问题。
现在逆卷积要做的是给定out和卷积核的参数,恢复in,那么将公式变换一下
in=(out−1)∗stride−2∗padding+kernelsizein = (out - 1)*stride -2*padding + kernelsizein=(out−1)∗stride−2∗padding+kernelsize
但是为了防止上面的现象,多加了一个out_padding参数,可以自己指定恢复的大小,新的公式变成
in=(out−1)∗stride−2∗padding+kernelsize+outpaddingin = (out - 1)*stride -2*padding + kernelsize + outpaddingin=(out−1)∗stride−2∗padding+kernelsize+outpadding
因此现在无论原来是否发生下整除现象,我们都可以指定恢复原来的大小。
就上述的例子,如果原来是5x5,那么我们令out_padding为0(原来是刚好整除的),如果原来是6x6,那么我们令out_padding为1,就代入公式就得到6了。这里的out_padding最多是stride−1stride - 1stride−1,
因为进行下取整最多舍去stride-1,因此有了这个参数一定可以恢复成原来指定的大小。
一般为了保持卷积same模式(in=stride∗outin = stride*outin=stride∗out),我们令padding = (kernelsize-1)/2,out_padding = kersize - 1,带入式子就可以得到in=stride∗outin = stride*outin=stride∗out
本文深入探讨PyTorch中转置卷积(ConvTranspose2d)API的使用,解析其在图像上采样过程中的作用及参数设置,包括in_channels、out_channels、kernel_size、stride、padding、dilation和output_padding。详细阐述了dilation的概念及其对特征图尺寸的影响,并解释了如何通过调整out_padding避免多对一的上采样问题。
1780

被折叠的 条评论
为什么被折叠?



