【问题标题】:How to implement fractionally strided convolution layers in pytorch?如何在pytorch中实现部分步幅卷积层?
【发布时间】:2021-02-20 02:58:36
【问题描述】:

在一切之前,我搜索了谷歌和 StackOverflow,但我没有找到任何类似的问题,所以我在这里提出一个新的问题。

我对@9​​87654321@ 很感兴趣,并想为我的项目实现这个 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...
)

所以,我的问题是,哪个是分数跨步 conv 层的更好实现,还是我理解的完全错误?

提前致谢。

P.S,我在第 87 - 88 行找到了第二个实现 here

【问题讨论】:

  • 这个问题最好在Code Review问。
  • 以前不懂Code Review,下次会做。

标签: pytorch convolution generative-adversarial-network deconvolution


【解决方案1】:

tldr;有一些形状约束,但都执行相同的操作。


nn.ConvTranspose2d 的输出形状由y = (x − 1)s - 2p + d(k-1) + p_out + 1 给出,其中xy 分别是输入和输出形状,k 是内核大小,s 是步幅,@987654337 @ 膨胀,pp_out 填充和填充。在这里,我们使用s=1p=0p_out=0d=1 让事情变得简单。

因此,转置卷积的输出形状为:

y =  x - 1 + k

如果我们看一个带有卷积的上采样 (x2)。使用与以前相同的表示法,nn.Conv2d 的输出由:y = floor((x + 2p - d(k - 1) - 1) / s + 1) 给出。在upsampling x 大小为2x 之后。我们将膨胀保持在d=1

y = floor((2x + 2p - k) / s + 1)

如果我们想匹配转置卷积的输出形状,我们需要有x - 1 + k = floor((2x + 2p - k) / s + 1)。此关系将定义为我们的卷积选择的 sp 值。

举个简单的例子来演示:k=2。现在x + 1需要等于floor((2x + 2p - k) / s + 1),通过设置s=2p=1来解决。


这是一个可视化的例子。

  • 转置卷积

  • 上采样 + 卷积

【讨论】:

  • 出色的可视化效果!虽然为什么内核在转置卷积中“翻转”?我相信它是同一个内核,但它的行为/操作方式不同,如这些动画所示:github.com/aqeelanwar/conv_layers_animation。我还尝试使用相同的输入和内核权重重新创建您的示例,并且输出确实不同。
猜你喜欢
  • 1970-01-01
  • 2017-10-15
  • 2019-12-09
  • 2019-06-26
  • 2020-03-19
  • 2020-02-09
  • 2019-12-15
  • 2019-01-16
  • 2021-11-09
相关资源
最近更新 更多