PyTorch中反卷积的用法详解
pytorch中的2D卷积层和2D反卷积层函数分别如下:
classtorch.nn.Conv2d(in_channels,out_channels,kernel_size,stride=1,padding=0,groups=1,bias=True)
classtorch.nn.ConvTranspose2d(in_channels,out_channels,kernel_size,stride=1,padding=0,output_padding=0,bias=True)
我不禁有疑问:
问题1:两个函数的参数为什么几乎一致呢?
问题2:反卷积层中的output_padding是什么意思呢?
问题3:反卷积层如何计算input和output的形状关系呢?
看了中文文档后,我得不出答案,看了英文文档,才弄明白了。花费了一个下午的时间去研究这个问题,值得用此文纪录一下。
我们知道,在卷积层中,输入输出的形状关系为:
o=[(i+2p-k)/s]+1(1)
其中:
O:为outputsize
i:为inputsize
p:为paddingsize
k:为kernelsize
s:为stridesize
[]为下取整运算
(1)当S=1时
若s等于1,则公式(1)中的取整符号消失,o与i为一一对应的关系。我们有结论:
如果卷积层函数和反卷积层函数的kernel_size,paddingsize参数相同(且stride=1),设反卷基层的输入输出形状为i'和o',卷积层的输入输出形状i和o,则它们为交叉对应的关系,即:
i=o' o=i'
为回答问题3,我们将上述关系代入公式中,即:
i'=o'+2p-k+1
已知i',即可推出o':
o'=i'-2p+k-1(2)
摘两个例子:
(2)当S>1时
若S>1,则公式(1)中的取整符号不能消去,o与i为多对1的关系。效仿S=1时的情形,我们有结论:
如果卷积层函数和反卷积层函数的kernel_size,paddingsize参数相同(且stride>1),设反卷基层的输入输出形状为i'和o',卷积层的输入输出形状i和o,
i'=[(o'+2p-k)/s]+1
已知i',我们可以得出s个o'解:
o'(0)=(i'-1)xs+k-2p o'(1)=o'(1)+1 o'(2)=o'(1)+2 ... o'(s-1)=o'(1)+s-1
即:
o'(n)=o'(1)+n=(i'-1)xs+k-2p+n, n={0,1,2...s-1}
为了确定唯一的o'解,我们用反卷积层函数中的ouputpadding参数指定公式中的n值。这样,我们就回答了问题(2)。
摘一个简单的例子:
(3)实验验证
给出一小段测试代码,改变各个参数值,运行比较来验证上面得出的结论,havefun~.
fromtorchimportnn fromtorch.nnimportinit fromtorch.autogradimportVariable dconv=nn.ConvTranspose2d(in_channels=1,out_channels=1,kernel_size=2,stride=2,padding=1,output_padding=0,bias=False) init.constant(dconv.weight,1) print(dconv.weight) input=Variable(torch.ones(1,1,2,2)) print(input) print(dconv(input))
以上这篇PyTorch中反卷积的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。