【问题标题】:Pytorch: Modifying VGG16 ArchitecturePytorch:修改 VGG16 架构
【发布时间】:2019-04-06 11:31:46
【问题描述】:

我目前正在尝试修改 VGG16 网络架构,使其能够接受 400x400 像素的图像。

根据我读过的文献,这样做的方法是将全连接 (FC) 层转换为卷积 (CONV) 层。这实质上将“允许网络有效地“滑动”在更大的输入图像上,并对图像的不同部分进行多次评估,并结合所有可用的上下文信息。”之后,Average Pooling 层用于“将多个特征向量平均为一个总结输入图像的特征向量”。

我已经完成了using this function,并提出了以下网络架构:

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 400, 400]           1,792
              ReLU-2         [-1, 64, 400, 400]               0
            Conv2d-3         [-1, 64, 400, 400]          36,928
              ReLU-4         [-1, 64, 400, 400]               0
         MaxPool2d-5         [-1, 64, 200, 200]               0
            Conv2d-6        [-1, 128, 200, 200]          73,856
              ReLU-7        [-1, 128, 200, 200]               0
            Conv2d-8        [-1, 128, 200, 200]         147,584
              ReLU-9        [-1, 128, 200, 200]               0
        MaxPool2d-10        [-1, 128, 100, 100]               0
           Conv2d-11        [-1, 256, 100, 100]         295,168
             ReLU-12        [-1, 256, 100, 100]               0
           Conv2d-13        [-1, 256, 100, 100]         590,080
             ReLU-14        [-1, 256, 100, 100]               0
           Conv2d-15        [-1, 256, 100, 100]         590,080
             ReLU-16        [-1, 256, 100, 100]               0
        MaxPool2d-17          [-1, 256, 50, 50]               0
           Conv2d-18          [-1, 512, 50, 50]       1,180,160
             ReLU-19          [-1, 512, 50, 50]               0
           Conv2d-20          [-1, 512, 50, 50]       2,359,808
             ReLU-21          [-1, 512, 50, 50]               0
           Conv2d-22          [-1, 512, 50, 50]       2,359,808
             ReLU-23          [-1, 512, 50, 50]               0
        MaxPool2d-24          [-1, 512, 25, 25]               0
           Conv2d-25          [-1, 512, 25, 25]       2,359,808
             ReLU-26          [-1, 512, 25, 25]               0
           Conv2d-27          [-1, 512, 25, 25]       2,359,808
             ReLU-28          [-1, 512, 25, 25]               0
           Conv2d-29          [-1, 512, 25, 25]       2,359,808
             ReLU-30          [-1, 512, 25, 25]               0
        MaxPool2d-31          [-1, 512, 12, 12]               0
           Conv2d-32           [-1, 4096, 1, 1]     301,993,984
             ReLU-33           [-1, 4096, 1, 1]               0
          Dropout-34           [-1, 4096, 1, 1]               0
           Conv2d-35           [-1, 4096, 1, 1]      16,781,312
             ReLU-36           [-1, 4096, 1, 1]               0
          Dropout-37           [-1, 4096, 1, 1]               0
           Conv2d-38              [-1, 3, 1, 1]          12,291
AdaptiveAvgPool2d-39              [-1, 3, 1, 1]               0
          Softmax-40              [-1, 3, 1, 1]               0
================================================================
Total params: 333,502,275
Trainable params: 318,787,587
Non-trainable params: 14,714,688
----------------------------------------------------------------
Input size (MB): 1.83
Forward/backward pass size (MB): 696.55
Params size (MB): 1272.21
Estimated Total Size (MB): 1970.59
----------------------------------------------------------------

我的问题很简单:最后是否需要使用平均池化层?似乎通过最后一个卷积层,我们得到了一个 3 通道的 1x1 图像。对此进行平均池化似乎没有任何效果。

如果我的逻辑/架构有任何问题,请随时指出。 谢谢!

【问题讨论】:

    标签: computer-vision conv-neural-network pytorch vgg-net


    【解决方案1】:

    如何将 VGG 转换为除了 400 x 400 的输入尺寸?

    第一种方法

    VGG 风格架构的问题是我们在线性层中硬编码输入和输出特征的数量。 即

    vgg.classifier[0]: Linear(in_features=25088, out_features=4096, bias=True)
    

    预计有 25,088 个输入特征。

    如果我们传递大小为(3, 224, 224) 的图像 通过vgg.features,输出特征图将是维度:

    (512, 7, 7) => 512 * 7 * 7 => 25,088
    

    如果我们将输入图像大小更改为(3, 400, 400) 并通过 通过vgg.features,输出特征图将是维度:

    (512, 12, 12) => 512 * 12 * 12 =>  73,728
    
    throws `sizemismatch` error.
    

    解决此问题的一种方法是使用nn.AdaptiveAvgPool 代替nn.AvgPool。 AdaptiveAvgPool 有助于定义层的输出大小,无论通过vgg.features 层的输入大小如何,该层的输出大小都保持不变。

    例如:

    vgg.features[30] = nn.AdaptiveAvgPool(output_size=(7,7))
    
    will make sure the final feature maps have a dimension of `(512, 7, 7)` 
    irrespective of the input size.
    

    您可以在here 中阅读有关自适应池的更多信息。

    第二种方法

    如果您使用技术here 将线性层转换为卷积层,则不必担心输入维度,但是由于参数数量的变化,您必须更改权重初始化技术。

    最后使用平均池化层有必要吗?

    不,在这种情况下。它不会改变输入特征图的大小,因此它不会对一组节点进行平均。

    【讨论】:

      【解决方案2】:

      AdaptiveAvgPool2d 的目的是让卷积网络在任意大小的输入上工作(并产生固定大小的输出)。在您的情况下,由于输入大小固定为 400x400,因此您可能不需要它。

      我认为这篇论文可能会让您更好地了解这种方法 - https://arxiv.org/pdf/1406.4729v3.pdf

      【讨论】:

      • 自适应池化的一个缺点是,在尝试进行特定于硬件的图形优化时,通常不支持这种层类型
      猜你喜欢
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 2013-03-30
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      相关资源
      最近更新 更多