
3.2 VGG介绍
接下来讨论的架构是视觉几何组(Visual Geometry Group,VGG)(来自牛津的Visual Geometry Group,“Very Deep Convolutional Networks for Large-Scale Image Recognition”,https://arxiv.org/abs/1409.1556)。VGG网络家族现今仍然很流行,经常被用作比较新架构的基准。在VGG之前(例如LeNet-5:http://yann.lecun.com/exdb/lenet/和AlexNet),网络的初始卷积层使用感受野较大的过滤器,如11×11。此外,网络通常有交替的单卷积层和池化层。论文的作者观察到,一个具有大过滤器大小的卷积层可以被两个或更多带有较小过滤器的卷积层(分解卷积)的堆叠所取代。例如,可以将一个5×5的层替换为两个3×3的层的堆叠,或将一个7×7的层替换为三个3×3的层的堆叠。
这种结构有以下几个优点:
- 最后一个堆叠层的神经元具有与带有大过滤器的单层相同的感受野大小。
- 与具有大过滤器大小的单层相比,堆叠层的权重数和运算次数更小。假设用两个3×3的层替换一个5×5的层,并假设所有的层都有相同数量的输入和输出通道(切片),M。5×5层的总权重数(不含偏差)为5*5*M*M = 25*M2。单个3×3层的总权重数为3*3*M*M = 9*M2,两层的总权重数为2*(3*3*M*M) = 18*M2,这让效率提高28%(18/25 = 0.72)。过滤器越大,效率会越高。
- 堆叠多层使得决策函数更具鉴别性。
VGG网络是由两个、三个或四个层叠的卷积层,并结合一个最大池化层组成的多个块构成的。下表中可以看到两个最流行的变体VGG16和VGG19。
随着VGG网络的深度增加,卷积层中的宽度(过滤器的数量)也在增加。有多对volume深度为128/256/512的跨通道卷积,它们与相同深度的其他层相连。此外,还有两个4096单元的全连接层,一个1000单元的全连接层和一个softmax(每个ImageNet类有一个)。因此,VGG网络有大量的参数(权重),这使得它们的内存效率低,计算成本高。尽管如此,这仍然是一种流行而简单的网络架构,通过添加批标准化,该架构得到了进一步的改进。

VGG16和VGG19网络的架构,以每个网络的权重层数命名
下一节使用VGG作为示例,说明如何使用TensorFlow和PyTorch加载预先训练好的网络模型。
使用PyTorch和TensorFlow的VGG
PyTorch和TensorFlow都有预先训练过的VGG模型。接下来讨论如何使用它们。Keras是TensorFlow 2的正式组成部分,因此,使用其加载模型:

通过设置weights='imagenet'
参数,网络将加载预先训练好的ImageNet权重(它们将自动下载)。可以将include_top
设置为False
,这将排除迁移学习场景的全连接层。在本例中,还可以通过将元组值设置为input_shape
(卷积层将自动放缩以匹配所需的输入形状)来使用任意的输入大小。这是可能的,因为卷积过滤器是沿着整个特征图共享的。因此,可以对不同大小的特征图使用相同的过滤器。
继续讨论使用PyTorch的情况,这时可以选择是否使用预训练模型(它也是自动下载的):

可以使用我们描述的过程,尝试其他预训练模型。为了避免重复,不再在本节中提供其他架构的相同代码示例。
下一节讨论最流行的CNN架构之一,它是在VGG之后发布的。