【问题标题】:Formula to compute the padding in convolutions pytorch (googlenet)计算卷积pytorch(googlenet)中的填充的公式
【发布时间】:2021-02-16 01:05:58
【问题描述】:

我正在 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)。两个分支的尺寸相似。它们是:
Downsample Convolution:torch.Size([1, 80, 15, 15])
Maxpool Convolution:torch.Size([1, 80, 15, 15])
  • 但是,当我们调用self.pool2 = DownSampleModule(in_channel = 144, ch3 = 96, w=15) 时。尺寸不同,因此无法连接。
Downsample Convolution:torch.Size([1, 96, 8, 8])
Maxpool Convolution:torch.Size([1, 144, 7, 7])

有人知道计算正确填充的公式吗?谢谢。

在 Keras 中,您可以设置 padding="same" 或 "valid",但 pytorch 不支持。

【问题讨论】:

    标签: tensorflow deep-learning computer-vision pytorch


    【解决方案1】:

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

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

    顺便说一句,您可以删除您的nn.Sequential。您的图层“序列”仅由一层组成,所以...不是真正的连续 :)

    【讨论】:

    • 太棒了!谢谢!你真是帮了大忙。早些时候,尽管添加了类似的填充,但尺寸并不相同。我刚刚删除了 ceil_mode=True。谢谢!
    • 感谢您指出我们的,我错过了那个细节。更新了我关于 ceil_mode 的回答
    猜你喜欢
    • 2020-12-10
    • 2020-11-04
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多