如何在 pytorch 中实现 fractionally-strided 卷积层?
How to implement fractionally strided convolution layers in pytorch?
之前,我搜索了 google 和 Whosebug,但我没有找到任何类似的问题,所以在这里我提出一个新问题。
我对 this paper 感兴趣并且想为我的项目实现这个 SGAN。论文中提到它的生成器网络是由“一堆分数步长的卷积层”组成的,我在pytorch中找到了两种不同的实现方式,一种是:
torch.nn.Sequential(
# other layers...
torch.nn.ConvTranspose2d(),
# other layers...
)
另一种方式是:
torch.nn.Sequential(
# other layers...
torch.nn.Upsample(scale_factor=2),
torch.nn.Conv2D(),
# other layers...
)
所以,我的问题是,哪个是 fractional-strided conv layer 的更好实现,还是我的理解完全错误?
提前致谢。
P.S,我在第 87 - 88 行找到了第二个实现 here。
tldr;有一些形状限制,但两者执行相同的操作。
nn.ConvTranspose2d
的输出形状由y = (x − 1)s - 2p + d(k-1) + p_out + 1
给出,其中x
和y
分别是输入和输出形状,k
是内核大小,s
步幅,d
扩张,p
和 p_out
填充和填充。在这里,我们使用 s=1
、p=0
、p_out=0
、d=1
.
让事情变得简单
因此,转置卷积的输出形状为:
y = x - 1 + k
如果我们看一下带有卷积的上采样 (x2)。使用与之前相同的符号,nn.Conv2d
is given by: y = floor((x + 2p - d(k - 1) - 1) / s + 1)
. After upsampling x
的输出大小为 2x
。我们将膨胀保持在 d=1
.
y = floor((2x + 2p - k) / s + 1)
如果我们想要匹配转置卷积的输出形状,我们需要有x - 1 + k = floor((2x + 2p - k) / s + 1)
。此关系将定义要为我们的卷积选择 s
和 p
的值。
举个简单的例子进行演示:k=2
。现在x + 1
需要等于floor((2x + 2p - k) / s + 1)
,设置s=2
和p=1
即可解决。
这是相同示例的可视化形式。
- 转置卷积
- 上采样+卷积
之前,我搜索了 google 和 Whosebug,但我没有找到任何类似的问题,所以在这里我提出一个新问题。
我对 this paper 感兴趣并且想为我的项目实现这个 SGAN。论文中提到它的生成器网络是由“一堆分数步长的卷积层”组成的,我在pytorch中找到了两种不同的实现方式,一种是:
torch.nn.Sequential(
# other layers...
torch.nn.ConvTranspose2d(),
# other layers...
)
另一种方式是:
torch.nn.Sequential(
# other layers...
torch.nn.Upsample(scale_factor=2),
torch.nn.Conv2D(),
# other layers...
)
所以,我的问题是,哪个是 fractional-strided conv layer 的更好实现,还是我的理解完全错误?
提前致谢。
P.S,我在第 87 - 88 行找到了第二个实现 here。
tldr;有一些形状限制,但两者执行相同的操作。
nn.ConvTranspose2d
的输出形状由y = (x − 1)s - 2p + d(k-1) + p_out + 1
给出,其中x
和y
分别是输入和输出形状,k
是内核大小,s
步幅,d
扩张,p
和 p_out
填充和填充。在这里,我们使用 s=1
、p=0
、p_out=0
、d=1
.
因此,转置卷积的输出形状为:
y = x - 1 + k
如果我们看一下带有卷积的上采样 (x2)。使用与之前相同的符号,nn.Conv2d
is given by: y = floor((x + 2p - d(k - 1) - 1) / s + 1)
. After upsampling x
的输出大小为 2x
。我们将膨胀保持在 d=1
.
y = floor((2x + 2p - k) / s + 1)
如果我们想要匹配转置卷积的输出形状,我们需要有x - 1 + k = floor((2x + 2p - k) / s + 1)
。此关系将定义要为我们的卷积选择 s
和 p
的值。
举个简单的例子进行演示:k=2
。现在x + 1
需要等于floor((2x + 2p - k) / s + 1)
,设置s=2
和p=1
即可解决。
这是相同示例的可视化形式。
- 转置卷积
- 上采样+卷积