pytorch 转置卷积api
nn.ConvTranspose2d(in_channels, out_channels, kernel_size=3, stride=2, padding=1, dilation=1, output_padding=1)
作用:进行转置卷积,用于上采样
设原本图像大小为 i n ∗ i n in*in in∗in,图像的padding为1,经过一个为 k e r n e l kernel kernel_ s i z e size size为3,卷积的 d i l a t i o n dilation dilation为1的给定卷积核,得到一个特征图大小为 o u t ∗ o u t out*out out∗out,而这个转置卷积就是用于将当前 o u t ∗ o u t out*out out∗out的特征图上采样成 i n ∗ i n in*in in∗in, p a d d i n g , s t r i n g , k e r n e l padding,string,kernel padding,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呢?
卷积输出的特征图计算公式为 o u t = i n + 2 ∗ p a d d i n g − k e r n e l s i z e s t r i d e + 1 out = \frac{in + 2*padding-kernelsize}{stride} + 1 out=stridein+2∗padding−kernelsize+1
这里的除法一般都是下取整,所以导致上面的问题。
现在逆卷积要做的是给定out和卷积核的参数,恢复in,那么将公式变换一下
i n = ( o u t − 1 ) ∗ s t r i d e − 2 ∗ p a d d i n g + k e r n e l s i z e in = (out - 1)*stride -2*padding + kernelsize in=(out−1)∗stride−2∗padding+kernelsize
但是为了防止上面的现象,多加了一个out_padding参数,可以自己指定恢复的大小,新的公式变成
i n = ( o u t − 1 ) ∗ s t r i d e − 2 ∗ p a d d i n g + k e r n e l s i z e + o u t p a d d i n g in = (out - 1)*stride -2*padding + kernelsize + outpadding in=(out−1)∗stride−2∗padding+kernelsize+outpadding
因此现在无论原来是否发生下整除现象,我们都可以指定恢复原来的大小。
就上述的例子,如果原来是5x5,那么我们令out_padding为0(原来是刚好整除的),如果原来是6x6,那么我们令out_padding为1,就代入公式就得到6了。这里的out_padding最多是 s t r i d e − 1 stride - 1 stride−1,
因为进行下取整最多舍去stride-1,因此有了这个参数一定可以恢复成原来指定的大小。
一般为了保持卷积same模式( i n = s t r i d e ∗ o u t in = stride*out in=stride∗out),我们令padding = (kernelsize-1)/2,out_padding = kersize - 1,带入式子就可以得到 i n = s t r i d e ∗ o u t in = stride*out in=stride∗out