卷积神经网络|VGG

650 阅读3分钟

VGG名字来源于论文作者所在的实验室Visual GeoMetry Group。VGG提出了可以通过重复使用简单的基础块来构建深度模型的思路。

VGG块

VGG块的组成规律是:连续使用数个填充为1、窗口形状为3×3的卷积层后接上一个步幅为2、窗口形状为2×2的最大池化层。卷积层保持输入的高和宽不变,而池化层对其减半。

每经过一个VGG块,样本的高和宽减半,输出通道翻倍。设输出通道数是co,输入通道数是ci,样本的高和宽是hw,卷积核的高和宽是khkw,填充是padding,步长是1。可得出卷积核的形状是co*ci*kh*kw,互运算的次数是co*ci*(h-kh+3)*(w-kw+3)

由此可看出,互运算的次数和h*w*ci*co成正比。VGG的这种高和宽减半通道翻倍的设计使得多数卷积层具有相同的模型参数尺寸和计算复杂度。

VGG网络

VGG网络由卷积层模块后连接全连接层模块构成。VGG网络先以卷积层构成的模块充分抽取空间特征,再以由全连接层构成的模块来输出分类结果。下面这个网络使用了8个卷积层和3个全连接层,被称为VGG-11。

Sequential(
  (vgg_block1): Sequential(
    (0): Conv2d(1, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU()
    (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (vgg_block2): Sequential(
    (0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU()
    (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (vgg_block3): Sequential(
    (0): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU()
    (2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (3): ReLU()
    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (vgg_block4): Sequential(
    (0): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU()
    (2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (3): ReLU()
    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (vgg_block5): Sequential(
    (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU()
    (2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (3): ReLU()
    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (fc): Sequential(
    (0): FlattenLayer()
    (1): Linear(in_features=25088, out_features=4096, bias=True)
    (2): ReLU()
    (3): Dropout(p=0.5, inplace=False)
    (4): Linear(in_features=4096, out_features=4096, bias=True)
    (5): ReLU()
    (6): Dropout(p=0.5, inplace=False)
    (7): Linear(in_features=4096, out_features=10, bias=True)
  )
)

设计原则

二维卷积层中,与输出数组中元素x有关的输入区域叫做x的「感受野」(receptive field)。图1中,输入中阴影部分的四个元素是输出中阴影部分元素的感受野。我们把图1中2×2的输出记为Y,并考虑一个更深的卷积网络:将Y与另一个形状为2×2的卷积核做互相关运算,输出单个元素z。那么,zY上的感受野包括Y的全部四个元素,在输入上的感受野包括其中全部9个元素。可见,我们可以通过更深的卷积网络使特征图中单个元素的感受野变得更加广阔,从而捕捉输入上更大尺寸的特征

image.png

VGG网络整个输出的感受野是整个输入,但是随着网络深度的增加,单个元素的感受野越来越大。在设计网络时采用堆积的小卷积核优于采用大的卷积核,因为可以增加网络深度来保证学习更复杂的模式。