1、VGG简介:
VGG网络是由牛津大学的视觉几何组(visual geometry group)首次提出来的。
VGG 网络,也称为Visual Geometry Group网络,是计算机视觉领域的一个深度卷积神经网络架构。它于2014年由牛津大学的研究团队开发,这个团队在ImageNet图像分类竞赛中取得了显著的成功。VGG 网络之所以受欢迎,部分原因是它的网络结构非常简单和规范,易于理解和实现。
以下是关于 VGG 网络的一些关键特点:
-
深度网络:VGG 网络采用了相对较深的网络结构,有16或19层的卷积层,使其成为当时非常深的卷积神经网络之一。这种深度有助于提高网络对图像特征的抽取能力。
-
卷积层:VGG 网络主要由卷积层和池化层组成,这两种层交替堆叠。卷积层用于检测图像中的特征,如边缘、纹理和形状,而池化层则用于减小特征图的空间分辨率,降低计算复杂性。
-
小卷积核:VGG 网络使用较小的3x3卷积核,但是在卷积层之间增加了大量的卷积层。这种设计决策有助于提高网络的表示能力。
-
全连接层:VGG 网络在卷积和池化层之后有几层全连接层,用于最终的分类。这些全连接层在网络的顶部,负责将高层次特征映射到不同类别的概率分布。
-
多个版本:VGG 网络有不同版本,最著名的是VGG16和VGG19,它们分别包括16层和19层的卷积层和全连接层。这些版本的主要区别在于网络的深度。
-
预训练权重:由于VGG 网络在ImageNet数据集上的出色表现,它的预训练权重在许多计算机视觉任务中都被广泛使用,作为迁移学习的基础。
尽管VGG 网络在其发布时是一种非常有力的图像分类模型,但由于其深度和参数数量较大,后来的网络架构如ResNet和Inception在一些任务上取得了更好的性能,并且具有更高的计算效率。然而,VGG 仍然是深度学习的重要历史里程碑,对于理解卷积神经网络的基本概念和设计原则仍然具有重要价值。
2、VGG网络成功的原因
VGG 网络之所以取得成功,有以下几个重要原因:
-
深度网络的探索:VGG 网络采用了相对较深的网络结构,有16或19层的卷积层。在当时,这种深度的卷积神经网络相对较为罕见,VGG 团队的尝试鼓励了研究人员深入探索深度神经网络的潜力。
-
小卷积核的使用:VGG 网络使用了3x3的小卷积核,而且在卷积层之间增加了大量的卷积层。这种设计有助于增加网络的深度和表示能力。此外,它引入了重复性,使网络结构更加规范和易于理解。
-
预训练权重:VGG 网络在ImageNet图像分类竞赛中表现出色,这意味着它在大规模图像数据上学到了有用的特征表示。这些预训练权重成为了迁移学习的有力工具,研究人员可以在其基础上构建和微调用于各种计算机视觉任务的模型。
-
广泛应用:VGG 网络的成功不仅仅限于图像分类,它还在图像检测、图像分割和其他计算机视觉任务中表现出色。这使得它成为一个通用的图像处理工具,为各种应用提供了强大的特征提取功能。
-
简单的设计:VGG 网络的设计相对简单,易于理解和实现。这使得它成为了深度学习入门和教育的良好示例,有助于推动深度学习领域的发展。
尽管后来的网络架构如ResNet和Inception在某些任务上表现更好,但VGG 仍然具有重要的历史地位。它的成功激发了深度神经网络领域的创新,促使研究人员更深入地理解卷积神经网络的工作原理,并为迁移学习提供了重要的基础。VGG 的设计原则和深度网络的探索经验对于后来神经网络的发展产生了深远影响。
3、VGG网络的具体介绍
3.1 VGG块
经典卷积神经网络的基本组成部分是下面的这个序列:
-
带填充以保持分辨率的卷积层;
-
非线性激活函数,如ReLU;
-
汇聚层,如最大汇聚层。
而一个VGG块与之类似,由一系列卷积层组成,后面再加上用于空间下采样的最大汇聚层。在最初的VGG论文中 (Simonyan and Zisserman, 2014),作者使用了带有3×3卷积核、填充为1(保持高度和宽度)的卷积层,和带有2×2汇聚窗口、步幅为2(每个块后的分辨率减半)的最大汇聚层。在下面的代码中,我们定义了一个名为vgg_block
的函数来实现一个VGG块。
该函数有三个参数,分别对应于卷积层的数量num_convs
、输入通道的数量in_channels
和输出通道的数量out_channels
.
3.2 VGG网络
与AlexNet、LeNet一样,VGG网络可以分为两部分:第一部分主要由卷积层和汇聚层组成,第二部分由全连接层组成。如 图中所示。
VGG神经网络连接,图中的几个VGG块(在vgg_block
函数中定义)。其中有超参数变量conv_arch
。该变量指定了每个VGG块里卷积层个数和输出通道数。全连接模块则与AlexNet中的相同。
原始VGG网络有5个卷积块,其中前两个块各有一个卷积层,后三个块各包含两个卷积层。 第一个模块有64个输出通道,每个后续模块将输出通道数量翻倍,直到该数字达到512。由于该网络使用8个卷积层和3个全连接层,因此它通常被称为VGG-11。
3.3 代码实现
import torch
from torch import nn
from d2l import torch as d2ldef vgg_block(num_convs, in_channels, out_channels):layers = []for _ in range(num_convs):layers.append(nn.Conv2d(in_channels, out_channels,kernel_size=3, padding=1))layers.append(nn.ReLU())in_channels = out_channelslayers.append(nn.MaxPool2d(kernel_size=2,stride=2))return nn.Sequential(*layers)conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))def vgg(conv_arch):conv_blks = []in_channels = 1# 卷积层部分for (num_convs, out_channels) in conv_arch:conv_blks.append(vgg_block(num_convs, in_channels, out_channels))in_channels = out_channelsreturn nn.Sequential(*conv_blks, nn.Flatten(),# 全连接层部分nn.Linear(out_channels * 7 * 7, 4096), nn.ReLU(), nn.Dropout(0.5),nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(0.5),nn.Linear(4096, 10))net = vgg(conv_arch)X = torch.randn(size=(1, 1, 224, 224))
for blk in net:X = blk(X)print(blk.__class__.__name__,'output shape:\t',X.shape)ratio = 4
small_conv_arch = [(pair[0], pair[1] // ratio) for pair in conv_arch]
net = vgg(small_conv_arch)lr, num_epochs, batch_size = 0.05, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
3.4 运行结果
loss 0.181, train acc 0.932, test acc 0.919 3453.8 examples/sec on cuda:0
4 小结
-
VGG-11使用可复用的卷积块构造网络。不同的VGG模型可通过每个块中卷积层数量和输出通道数量的差异来定义。
-
块的使用导致网络定义的非常简洁。使用块可以有效地设计复杂的网络。
-
在VGG论文中,Simonyan和Ziserman尝试了各种架构。特别是他们发现深层且窄的卷积(即3×3)比较浅层且宽的卷积更有效。