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
。
在制作网络时我使用了反卷积层:
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
。