Neural network 为什么VGG-16采用512*7*7的输入大小?

Neural network 为什么VGG-16采用512*7*7的输入大小?,neural-network,pytorch,vgg-net,Neural Network,Pytorch,Vgg Net,据 我不明白为什么VGG模型采用512*7*7输入大小的全连接层。 最后一层是卷积层 Conv2d(512,512,内核大小=3,填充=1) nn.ReLU(正确) nn.MaxPool2d(内核大小=2,步幅=2,膨胀=1) 上面链接中的代码 VGG类(nn.Module): def_uuuinit_uuu(self,features,num_classes=1000,init_weights=True): 超级(VGG,self)。\uuuuu init\uuuuuuu() self.f

我不明白为什么VGG模型采用512*7*7输入大小的全连接层。 最后一层是卷积层

  • Conv2d(512,512,内核大小=3,填充=1)
  • nn.ReLU(正确)
  • nn.MaxPool2d(内核大小=2,步幅=2,膨胀=1)
上面链接中的代码

VGG类(nn.Module):
def_uuuinit_uuu(self,features,num_classes=1000,init_weights=True):
超级(VGG,self)。\uuuuu init\uuuuuuu()
self.features=特征
self.classifier=nn.Sequential(
nn.线性(512*7*74096),
nn.ReLU(正确),
nn.Dropout(),
nn.线性(40964096),
nn.ReLU(正确),
nn.Dropout(),
nn.线性(4096,数量级),
)

要理解这一点,您必须了解卷积运算符如何适用于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)
其中,
height
width
是原始大小,
padW
padH
是高度和宽度(水平和垂直)填充,
kW
kH
是内核大小,
dW
dH
是内核移动的宽度和高度(水平和垂直)像素(即,如果它是
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,内核大小=25,填充=0,跨步=5)
使用
kernel_size=25
,输入图像中没有填充,使用
stride=5
dW=dH=5
,这意味着内核每次移动5个像素,如果我们在(0,0)位置,那么它将移动到(5,0),直到我们到达图像在x轴上的末端,然后它将移动到(0,5)->(5,15),直到它再次到达末端)结果输出图像的大小为47x47xD

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

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

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