【问题标题】:Pytorch does not pad the layersPytorch 不填充图层
【发布时间】:2020-12-15 04:25:10
【问题描述】:

在制作网络时,我使用了反卷积层:

def deconv3d(cin,cout,k=4,s=2,pad=-1):
    pad = (k - 1) // 2 if pad < 0 else pad
    return nn.Sequential(
        nn.ConvTranspose3d(cin,cout,kernel_size=k,stride=s,padding = pad,bias=False),
        nn.ReLU(inplace=True)
    )

我将其调整为网络,它不断减小层的大小。

self.conv_f5 = conv3d(128, 128, k=3, s=1, pad=1)
    self.conv_f6 = deconv3d(128,64,k=3,s=2,pad=1) 
    self.conv_f7 = conv3d(64,64,k=3,s=1,pad=1)                                                        
    self.conv_f8 = deconv3d(64,32,k=3,s=2,pad=1)
    self.conv_f9 = conv3d(32,32,k=3,s=1,pad=1)

这是我制作的图层,结果是:

Cost Volume: torch.Size([2, 128, 100, 120, 160])
fc5 torch.Size([2, 128, 50, 60, 80])
fc6 torch.Size([2, 64, 99, 119, 159])
fc8 torch.Size([2, 32, 197, 237, 317])

我不明白为什么 f3 的尺寸比预期的要小,并且正在寻找解决方法。

请告诉我怎么做,非常感谢。

【问题讨论】:

  • 我不明白 f5 到 f9 层与您显示的尺寸有何关系。什么是 fc2/3/4 ?你预期的尺寸是多少?理想情况下,您应该提供一个可以复制粘贴并且开箱即用的最小可重现示例
  • 我进行了编辑以避免您的混淆。看看 fc6,它是 fc5 的反卷积层,所以我希望它的大小为 [2, 64, 100, 120, 160]。但正如您所见,它不断减小层的大小。

标签: deep-learning pytorch torchvision


【解决方案1】:

这仍然不是一个可重现的例子。我看到有人调用conv3d,但您没有提供源代码。我相信它不仅仅是 nn.Conv3d 的包装,因为结果大小不匹配(例如,self.conv_5 不应使用给定参数更改张量形状)

但我相信让你感到困惑的是奇怪的大小([2, 64, 99, 119, 159])。在这种情况下,您需要非常仔细地阅读documentation for nn.ConvTranspose3d。特别是:

但是,当 stride > 1 时,Conv3d 将多个输入形状映射到相同的输出形状。提供 output_padding 以通过有效增加一侧计算的输出形状来解决这种歧义。请注意,output_padding 仅用于查找输出形状,但实际上并未在输出中添加零填充。

根据文档中提供的形状方程,我相信你想在你的 deconv 层中添加一个output_padding=1

【讨论】:

  • 在这种情况下请将答案标记为已接受,无需感谢:)
猜你喜欢
  • 2020-11-04
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
相关资源
最近更新 更多