VGG 是由英国牛津大学的 Visual Geometry Group 提出的经典卷积神经网络模型。它在 2014 年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)中表现优异,尤其是 VGG16 和 VGG19,分别包含 16 层和 19 层参数化层。
VGG 的关键特点
-
深度网络结构
VGG 网络的主要特点在于其深度。相比于早期的 AlexNet 等网络,VGG 通过增加网络的深度来提高模型的性能。VGG16 和 VGG19 分别包含 16 和 19 层(不包括池化层和全连接层)。 -
小卷积核
VGG 网络的另一个特点是使用了非常小的卷积核,所有卷积层的卷积核大小均为 3x3,而池化层的步长为 2x2。这种设计不仅保持了网络结构的简单性,还能够提取更细粒度的特征信息。 -
堆叠卷积层
VGG 使用了多个 3x3 的卷积核层堆叠,这种方式能够在保持相对较小参数量的同时,增加网络的非线性能力。每堆叠几层卷积后,会使用池化层进行下采样,从而降低特征图的空间尺寸。 -
全连接层与 Softmax 输出
在 VGG 网络的末端,会连接多个全连接层,最终使用 Softmax 激活函数进行分类。VGG16 和 VGG19 通常用于 1000 类分类任务,因此最终输出 1000 个类别。
网络结构
以下是 VGG16 的简化网络结构:
- 输入层:输入图像的大小为 224x224x3(ImageNet 图片大小)。
- 卷积层:多个 3x3 卷积层叠加,每经过几层卷积后使用 2x2 最大池化进行下采样。
- 全连接层:3 层全连接层,最后通过 Softmax 输出类别。
VGG 网络的详细结构以其深度和简单性闻名,主要有两个常见版本:VGG16 和 VGG19,它们分别包含 16 层和 19 层参数化层。以下是这两个版本的详细结构。
VGG16 网络结构
VGG16 由 13 个卷积层、5 个最大池化层和 3 个全连接层组成,总共有 16 个可训练的层(参数层)。卷积层的卷积核大小为 3x3,步幅为 1,所有池化层使用 2x2 的最大池化。
VGG16 结构具体如下:
层类型 | 输出尺寸 | 详细配置 | 参数数量 |
---|---|---|---|
输入层 | 224x224x3 | - | 0 |
卷积层1-1 | 224x224x64 | 3x3 卷积, 64 个卷积核, 步长 1, Same 填充 | 1,792 |
卷积层1-2 | 224x224x64 | 3x3 卷积, 64 个卷积核, 步长 1, Same 填充 | 36,928 |
最大池化层1 | 112x112x64 | 2x2 最大池化, 步长 2 | 0 |
卷积层2-1 | 112x112x128 | 3x3 卷积, 128 个卷积核, 步长 1, Same 填充 | 73,856 |
卷积层2-2 | 112x112x128 | 3x3 卷积, 128 个卷积核, 步长 1, Same 填充 | 147,584 |
最大池化层2 | 56x56x128 | 2x2 最大池化, 步长 2 | 0 |
卷积层3-1 | 56x56x256 | 3x3 卷积, 256 个卷积核, 步长 1, Same 填充 | 295,168 |
卷积层3-2 | 56x56x256 | 3x3 卷积, 256 个卷积核, 步长 1, Same 填充 | 590,080 |
卷积层3-3 | 56x56x256 | 3x3 卷积, 256 个卷积核, 步长 1, Same 填充 | 590,080 |
最大池化层3 | 28x28x256 | 2x2 最大池化, 步长 2 | 0 |
卷积层4-1 | 28x28x512 | 3x3 卷积, 512 个卷积核, 步长 1, Same 填充 | 1,180,160 |
卷积层4-2 | 28x28x512 | 3x3 卷积, 512 个卷积核, 步长 1, Same 填充 | 2,359,808 |
卷积层4-3 | 28x28x512 | 3x3 卷积, 512 个卷积核, 步长 1, Same 填充 | 2,359,808 |
最大池化层4 | 14x14x512 | 2x2 最大池化, 步长 2 | 0 |
卷积层5-1 | 14x14x512 | 3x3 卷积, 512 个卷积核, 步长 1, Same 填充 | 2,359,808 |
卷积层5-2 | 14x14x512 | 3x3 卷积, 512 个卷积核, 步长 1, Same 填充 | 2,359,808 |
卷积层5-3 | 14x14x512 | 3x3 卷积, 512 个卷积核, 步长 1, Same 填充 | 2,359,808 |
最大池化层5 | 7x7x512 | 2x2 最大池化, 步长 2 | 0 |
全连接层1 | 4096 | 输入 7x7x512, 输出 4096 个节点 | 102,764,544 |
全连接层2 | 4096 | 输入 4096, 输出 4096 个节点 | 16,781,312 |
全连接层3 | 1000 | 输入 4096, 输出 1000 个分类 | 4,097,000 |
总参数量 | - | 约 138 百万参数 | - |
VGG19 网络结构
VGG19 和 VGG16 的主要区别是 VGG19 在每个卷积层块中多增加了几层卷积层,导致网络的深度增加到 19 层参数化层。它有 16 个卷积层,5 个最大池化层,以及 3 个全连接层,总共 19 层。
VGG19 结构具体如下:
层类型 | 输出尺寸 | 详细配置 | 参数数量 |
---|---|---|---|
输入层 | 224x224x3 | - | 0 |
卷积层1-1 | 224x224x64 | 3x3 卷积, 64 个卷积核, 步长 1, Same 填充 | 1,792 |
卷积层1-2 | 224x224x64 | 3x3 卷积, 64 个卷积核, 步长 1, Same 填充 | 36,928 |
最大池化层1 | 112x112x64 | 2x2 最大池化, 步长 2 | 0 |
卷积层2-1 | 112x112x128 | 3x3 卷积, 128 个卷积核, 步长 1, Same 填充 | 73,856 |
卷积层2-2 | 112x112x128 | 3x3 卷积, 128 个卷积核, 步长 1, Same 填充 | 147,584 |
最大池化层2 | 56x56x128 | 2x2 最大池化, 步长 2 | 0 |
卷积层3-1 | 56x56x256 | 3x3 卷积, 256 个卷积核, 步长 1, Same 填充 | 295,168 |
卷积层3-2 | 56x56x256 | 3x3 卷积, 256 个卷积核, 步长 1, Same 填充 | 590,080 |
卷积层3-3 | 56x56x256 | 3x3 卷积, 256 个卷积核, 步长 1, Same 填充 | 590,080 |
卷积层3-4 | 56x56x256 | 3x3 卷积, 256 个卷积核, 步长 1, Same 填充 | 590,080 |
最大池化层3 | 28x28x256 | 2x2 最大池化, 步长 2 | 0 |
卷积层4-1 | 28x28x512 | 3x3 卷积, 512 个卷积核, 步长 1, Same 填充 | 1,180,160 |
卷积层4-2 | 28x28x512 | 3x3 卷积, 512 个卷积核, 步长 1, Same 填充 | 2,359,808 |
卷积层4-3 | 28x28x512 | 3x3 卷积, 512 个卷积核, 步长 1, Same 填充 | 2,359,808 |
卷积层4-4 | 28x28x512 | 3x3 卷积, 512 个卷积核, 步长 1, Same 填充 | 2,359,808 |
最大池化层4 | 14x14x512 | 2x2 最大池化 |
VGG 的实现示例(使用 TensorFlow/Keras)
import tensorflow as tf
from tensorflow.keras import layers, models
# VGG Block,包含多个 3x3 卷积层 + 最大池化层
def vgg_block(x, num_convs, num_filters):
for _ in range(num_convs):
x = layers.Conv2D(num_filters, (3, 3), padding='same', activation='relu')(x)
x = layers.MaxPooling2D((2, 2), strides=(2, 2))(x)
return x
# 创建 VGG 模型(VGG16)
input_layer = layers.Input(shape=(224, 224, 3))
# 构建 VGG 网络
x = vgg_block(input_layer, 2, 64) # 第一个 VGG Block,包含 2 个 3x3 卷积层,64 个滤波器
x = vgg_block(x, 2, 128) # 第二个 VGG Block,包含 2 个 3x3 卷积层,128 个滤波器
x = vgg_block(x, 3, 256) # 第三个 VGG Block,包含 3 个 3x3 卷积层,256 个滤波器
x = vgg_block(x, 3, 512) # 第四个 VGG Block,包含 3 个 3x3 卷积层,512 个滤波器
x = vgg_block(x, 3, 512) # 第五个 VGG Block,包含 3 个 3x3 卷积层,512 个滤波器
# 全连接层
x = layers.Flatten()(x)
x = layers.Dense(4096, activation='relu')(x)
x = layers.Dense(4096, activation='relu')(x)
output_layer = layers.Dense(1000, activation='softmax')(x) # 假设有 1000 个分类
# 创建和编译模型
model = models.Model(inputs=input_layer, outputs=output_layer)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 打印模型概况
model.summary()
总结
VGG 网络以其简单且深度较大的架构闻名,尽管它的计算和参数量较大,但其性能仍然出色,尤其是在图像分类任务中。然而,随着更为复杂的网络如 ResNet 的出现,VGG 网络逐渐被取代,但其设计理念依然对现代深度学习网络产生了重要影响。