Pytorch 不填充图层

Pytorch does not pad the layers

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

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 的大小比预期的要小,也不知道如何解决它。

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

这仍然不是一个可重现的例子。我看到有对 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