Pytorch中的转置卷积
转置卷积(Transposed Convolution)
又称为转置卷积。
torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1, padding_mode='zeros')
输出大小计算
先说结论
是output_padding
,后面一直是在分析这个式子是怎么来的。
注:当有空洞卷积时,k=dilation[0]×(kernel_size[0]−1)+1
起点
首先回顾正常的卷积计算公式
其中,表示输入大小,表示输出大小,表示卷积核大小,表示pading,表示卷积步长。正常来说,
反卷积的输入输出,而此时。(毕竟我们的目的是放大图像。)带入上式得到以下,我们需要根据下面式子,反推出。
麻烦的是向下取整,所以分类讨论:
可以整除
即当时,上式变为,
此时反卷积的输入输出可以一一对应。
代码验证
>>> x = torch.ones([1,10,5,5])
>>> a2 = torch.nn.ConvTranspose2d(in_channels=10,
out_channels=10,
kernel_size=3,
stride=2,
padding=0,
output_padding=0)
>>> y = a2(x)
>>> print(y.shape)
torch.Size([1, 10, 11, 11])
也就是当时,。
不可以整除
即当时,向下取整不能去掉时。我们减去一部分,让它能取整。我们定义,也就是output_padding
反推得到
代码验证
>>> x = torch.ones([1,10,4,4])
>>> a2 = torch.nn.ConvTranspose2d(in_channels=10,
out_channels=10,
kernel_size=3,
stride=2,
padding=0,
output_padding=1
)
>>> y = a2(x)
>>> print(y.shape)
torch.Size([1, 10, 10, 10])
也就是当时,。
回过头来说,这样直接减去一项合理吗?看着不合理,其实很合理。毕竟标准卷积也是向下取整。而这里只是取下界:
综合起来
前面一直是反推反推,还得考虑是否整除。难道你还让计算机挨个去世吗?显然不是,计算机知道的只是下面这个式子,
等式右边的参数全都可以控制输入,也就是控制了输出。前文只不过是对这个式子的理解,当是整除情况,当是不可整除情况。