为什么VGG-16的输入尺寸为512 * 7 * 7?

时间:2018-02-13 06:46:02

标签: neural-network pytorch vgg-net

根据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),
        )

2 个答案:

答案 0 :(得分:2)

要理解这一点,您必须知道卷积运算符如何为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是高度和宽度(水平和垂直)填充,kW和{{ 1}}是内核大小,kHdW是内核移动的宽度和高度(水平和垂直)像素(即如果它是dH,则内核将首先出现像素(0,0)然后移动到(1,0))

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

答案 1 :(得分:0)

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张量。这是“分类器”层的输入。