【问题标题】:Why VGG-16 takes input size 512 * 7 * 7?为什么 VGG-16 的输入大小为 512 * 7 * 7?
【发布时间】:2018-07-23 11:27:33
【问题描述】:

根据https://github.com/pytorch/vision/blob/master/torchvision/models/vgg.py

我不明白为什么 VGG 模型需要 512 * 7 * 7 input_size 的全连接层。 最后一个卷积层是

  • nn.Conv2d(512, 512, kernel_size=3, padding=1),
  • nn.ReLU(真),
  • nn.MaxPool2d(kernel_size=2, stride=2, dilation=1)

以上链接中的代码。

class VGG(nn.Module):

    def __init__(self, features, num_classes=1000, init_weights=True):
        super(VGG, self).__init__()
        self.features = features
        self.classifier = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, num_classes),
        )

【问题讨论】:

    标签: neural-network pytorch vgg-net


    【解决方案1】:

    要理解这一点,您必须了解卷积算子在 CNN 中的工作原理。 nn.Conv2d(512, 512, kernel_size=3, padding=1) 表示该卷积的输入图像有 512 个通道,卷积后的输出也将是 512 个通道。输入图像将与一个大小为 3x3 的内核进行卷积,该内核作为滑动窗口移动。最后,padding=1 表示在应用卷积之前,我们在输入矩阵的边缘对称地添加零。

    在您所说的示例中,您可以认为 512 是深度,而 7x7 是通过应用多个卷积获得的宽度和高度。想象一下,我们有一个具有一定宽度和高度的图像,我们将它提供给卷积,结果大小将是

    owidth  = floor(((width  + 2*padW - kW) / dW) + 1) 
    oheight = floor(((height + 2*padH - kH) / dH) + 1)
    

    其中heightwidth 是原始大小,padWpadH 是高度和宽度(水平和垂直)填充,kWkH 是内核大小,dWdH 是内核移动的宽度和高度(水平和垂直)像素(即如果是dW=1,内核将首先位于像素(0,0),然后移动到(1,0))

    CNN 中的第一个卷积运算符通常看起来像:nn.Conv2d(3, D, kernel_size=3, padding=1),因为原始图像有 3 个输入通道 (RGB)。假设输入图像的大小为 256x256x3 像素,如果我们应用之前定义的运算符,则生成的图像具有与输入图像相同的宽度和高度,但现在它的深度为 D。同样,如果我们将卷积定义为 c = nn.Conv2d(3, 15, kernel_size=25, padding=0, stride=5)使用kernel_size=25,输入图像中没有填充,使用stride=5 (dW=dH=5,这意味着如果我们在 (0,0) 处,内核每次移动 5 个像素,然后它移动到 (5,0),直到我们在 x 轴上到达图像的末端,然后它移动到 (0,5) -> (5,5) -> (5,15) 直到它再次到达末端)生成的输出图像将具有尺寸为 47x47xD

    【讨论】:

      【解决方案2】:

      VGG 神经网络有两部分层:“特征”层和“分类器”层。要素层的输入始终是大小为 224 x 224 像素的图像。

      特征层有5个nn.MaxPool2d(kernel_size=2, stride=2)卷积。请参阅参考源代码第 76 行:配置中的每个“M”字符设置一个 MaxPool2d 卷积。

      具有这些特定参数的 MaxPool2d 卷积将张量大小减少了一半。所以我们有 224 --> 112 --> 56 --> 28 --> 14 --> 7 这意味着特征层的输出是一个 512 个通道 * 7 * 7 的张量。这是“分类器”层的输入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多