Tensorflow 计算卷积中填充的公式pytorch(googlenet)

Tensorflow 计算卷积中填充的公式pytorch(googlenet),tensorflow,deep-learning,computer-vision,pytorch,Tensorflow,Deep Learning,Computer Vision,Pytorch,我正在pytorch中从头开始实现googlenet(较小的版本)。架构如下: 对于下采样模块,我有以下代码: class DownSampleModule(nn.Module): def __init__(self, in_channel, ch3, w): super(DownSampleModule, self).__init__() kernel_size = 3 padding = (kernel_size-1)/2

我正在pytorch中从头开始实现googlenet(较小的版本)。架构如下:

对于下采样模块,我有以下代码:

   class DownSampleModule(nn.Module):
   def __init__(self, in_channel, ch3, w):
       super(DownSampleModule, self).__init__()
       kernel_size = 3
       padding = (kernel_size-1)/2

       self.branch1 = nn.Sequential(
           ConvBlock(in_channel, ch3, kernel_size = 3,stride=2, padding=int(padding))
       )
       self.branch2 = nn.Sequential(
           nn.MaxPool2d(3, stride=2, padding=0, ceil_mode=True)
       )
   def forward(self, x):
       branch1 = self.branch1(x)
       branch2 = self.branch2(x)
      
       return torch.cat([padded_tensor, branch2], 1)
ConvBlock来自此模块

class ConvBlock(nn.Module):
   def __init__(self, in_channels, out_channels, kernel_size, stride, padding):
       super(ConvBlock, self).__init__()
       #padding = (kernel_size -1 )/2
       #print(padding)
       self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
       self.bn = nn.BatchNorm2d(out_channels)
       self.act = nn.ReLU()
       
   def forward(self, x):
       x = self.conv(x)
       x = self.bn(x)
       x = self.act(x)
       return x
基本上,我们创建了两个分支:卷积模块和最大池。然后,这两个分支的输出在通道维度上连接

但是,我有以下问题:

  • 首先,我们调用
    self.pool1=DownSampleModule(in_channel=80,ch3=80,w=30)
    。这两个分支的尺寸相似。这些是:
  • 然而,当我们调用
    self.pool2=DownSampleModule时(在_通道=144,ch3=96,w=15)
    。维度不同,因此无法将其连接起来
有人知道计算正确填充的公式吗?多谢各位


在Keras中,您可以只设置padding=“same”或“valid”,但pytorch上不支持它。

您的
maxpool
conv
分支具有相同的输入,如果您为它们提供相同的内核大小、步长和填充参数,它们将产生相同的输出。因此,只需将
padding=0
替换为
padding=int(padding)
就足以使这两个分支兼容

ceil\u模式
也应设置为
False
。当结果维度不是整数时,
conv2d
的舍入行为是使用
floor
,因此您希望您的
maxpool
也这样做


顺便说一下,您可以删除
nn.Sequential
。你的图层“序列”只由一个图层组成,所以。。。不是很连续:)

太棒了!非常感谢。你帮了大忙。之前,尽管添加了类似的填充,但尺寸却不相同。我刚刚删除了ceil_mode=True。非常感谢。谢谢你指出,我错过了那个细节。更新了我关于ceil_模式的回答
Downsample Convolution:torch.Size([1, 80, 15, 15])
Maxpool Convolution:torch.Size([1, 80, 15, 15])
Downsample Convolution:torch.Size([1, 96, 8, 8])
Maxpool Convolution:torch.Size([1, 144, 7, 7])