Naz*_*zzz 2 neural-network pytorch vgg-net
根据https://github.com/pytorch/vision/blob/master/torchvision/models/vgg.py
我不明白为什么 VGG 模型采用 512 * 7 * 7 全连接层的 input_size 。最后一个卷积层是
代码在上面的链接中。
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),
)
Run Code Online (Sandbox Code Playgroud)
要理解这一点,您必须了解卷积运算符如何在 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)
Run Code Online (Sandbox Code Playgroud)
其中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, 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
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 个张量。这是“分类器”层的输入。
归档时间: |
|
查看次数: |
6404 次 |
最近记录: |