VGG-19(Visual Geometry Group)模型
VGG-19 是由牛津大学视觉几何组和 Google DeepMind 的研究人员在 2014 年提出的一个非常经典的深度卷积神经网络模型。
一 核心结构
(1)深度: 模型名称中的 "19" 指的是模型拥有 19 层带有权重的层(通常指:16 个卷积层 + 3 个全连接层 = 19。如果严格数带参数的层,输入层和 ReLU 激活层不计入深度统计)。
(2)简单范式: VGG 系列模型(包括 VGG-11, VGG-13, VGG-16, VGG-19)的核心思想非常简单:只使用非常小的 3x3
卷积核,并通过连续堆叠多个这样的卷积层来构建一个很深的网络。这种设计在保持相同感受野的同时,大大减少了参数量(相比大卷积核),并增加了网络的深度和非线性。
(3)结构图:
输入图像 (224x224x3 RGB)
-> 2 x [卷积 (3x3, 64)] -> 最大池化 (2x2) // Block 1
-> 2 x [卷积 (3x3, 128)] -> 最大池化 (2x2) // Block 2
-> 4 x [卷积 (3x3, 256)] -> 最大池化 (2x2) // Block 3
-> 4 x [卷积 (3x3, 512)] -> 最大池化 (2x2) // Block 4
-> 4 x [卷积 (3x3, 512)] -> 最大池化 (2x2) // Block 5
-> 3 x [全连接 (4096, 4096, 1000)] // FC Layers
-> Softmax -> 1000 类输出概率
(4)激活函数: 所有卷积层和全连接层后都使用 ReLU (Rectified Linear Unit) 激活函数,这是深度学习中常见的非线性激活函数。
(5)池化层: 使用 2x2
的最大池化层(Max Pooling),步长为 2,在每组卷积块之后将特征图的空间尺寸减半。总共有 5 次空间下采样(池化)。
(6)全连接层: 在卷积部分之后,通常有两个 4096
单元的全连接层,最后是一个 1000
单元(对应 ImageNet 的 1000 个类别)的输出层。
二 模型特点
(1)深度有效: 通过堆叠多个小的 3x3
卷积核,VGG-19 证明了增加网络深度(层数)能显著提升模型理解复杂视觉特征的能力。
(2)结构统一: 所有卷积层都使用相同的 3x3
核大小(步幅为 1,填充为 1 以保持空间分辨率直到池化),设计非常一致且易于理解。
(3)参数量大: VGG-19 是一个非常大的模型,拥有约 1.38 亿个参数,主要集中在最后几个全连接层。这使得它训练和推理都非常耗费计算资源和内存。
(4)高精度 (At the time): 在 2014 年的 ImageNet 竞赛中,VGG-19 展现出了当时最顶尖的识别精度。(虽然当年冠军是 GoogLeNet/Inception-v1,但 VGG 因其结构简单、效果显著而极具影响力)
三 与之前版本的区别
以VGG-16(13 个卷积层 + 3 个全连接层)举例:
VGG-16 和 VGG-19 的结构非常相似,主要区别在于 Block 3、4、5 中卷积层的数量:
Block 3, VGG-16 有 3 层卷积,VGG-19 有 4 层。
Block 4, VGG-16 有 3 层卷积,VGG-19 有 4 层。
Block 5, VGG-16 有 3 层卷积,VGG-19 有 4 层。
VGG-19 比 VGG-16 更深(多 3 个卷积层),参数量也略多(但量级都在 1.38 亿附近)。精度通常略高于 VGG-16,但提升边际效应递减。
输入图像 (224x224x3 RGB)
-> 2 x [卷积 (3x3, 64)] -> 最大池化 (2x2) // Block 1
-> 2 x [卷积 (3x3, 128)] -> 最大池化 (2x2) // Block 2
-> 3 x [卷积 (3x3, 256)] -> 最大池化 (2x2) // Block 3
-> 3 x [卷积 (3x3, 512)] -> 最大池化 (2x2) // Block 4
-> 3 x [卷积 (3x3, 512)] -> 最大池化 (2x2) // Block 5
-> 3 x [全连接 (4096, 4096, 1000)] // FC Layers
-> Softmax -> 1000 类输出概率
# VGG-16模型定义
class VGG16(nn.Module):def __init__(self, num_classes=10):super(VGG16, self).__init__()self.features = nn.Sequential(# Block 1nn.Conv2d(3, 64, kernel_size=3, padding=1),nn.BatchNorm2d(64),nn.ReLU(inplace=True),nn.Conv2d(64, 64, kernel_size=3, padding=1),nn.BatchNorm2d(64),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),# Block 2nn.Conv2d(64, 128, kernel_size=3, padding=1),nn.BatchNorm2d(128),nn.ReLU(inplace=True),nn.Conv2d(128, 128, kernel_size=3, padding=1),nn.BatchNorm2d(128),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),# Block 3nn.Conv2d(128, 256, kernel_size=3, padding=1),nn.BatchNorm2d(256),nn.ReLU(inplace=True),nn.Conv2d(256, 256, kernel_size=3, padding=1),nn.BatchNorm2d(256),nn.ReLU(inplace=True),nn.Conv2d(256, 256, kernel_size=3, padding=1),nn.BatchNorm2d(256),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),# Block 4nn.Conv2d(256, 512, kernel_size=3, padding=1),nn.BatchNorm2d(512),nn.ReLU(inplace=True),nn.Conv2d(512, 512, kernel_size=3, padding=1),nn.BatchNorm2d(512),nn.ReLU(inplace=True),nn.Conv2d(512, 512, kernel_size=3, padding=1),nn.BatchNorm2d(512),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),# Block 5nn.Conv2d(512, 512, kernel_size=3, padding=1),nn.BatchNorm2d(512),nn.ReLU(inplace=True),nn.Conv2d(512, 512, kernel_size=3, padding=1),nn.BatchNorm2d(512),nn.ReLU(inplace=True),nn.Conv2d(512, 512, kernel_size=3, padding=1),nn.BatchNorm2d(512),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),)
四 VGG优缺点
优点 | 缺点 |
---|---|
历史贡献:深度验证 - 首创使用连续小卷积堆叠深度网络 - 证明了网络深度对性能的关键作用 | 参数量过大(主要缺陷) - 全连接层(FC)参数量爆炸: - FC1: 25088×4096 ≈ 1.03亿参数 - 总参数量高达 1.38亿 |
结构统一性 - 仅用 3×3小卷积核 + 2×2最大池化 - 模块化堆叠(64→128→256→512通道) | 计算资源消耗大 - 大量卷积+全连接导致: - 训练/推理速度慢 - 显存占用高(移动端难以部署) |
特征表达能力强大 - 深层网络捕获多尺度特征 - 特征通用性极优(适用于迁移学习) | 梯度问题 - 原始版本未用BN层(Batch Normalization) - 训练易出现梯度消失/爆炸(需配合Dropout) |
广泛迁移应用 - 预训练特征成为早期CV任务标准骨干 - 如目标检测、图像风格迁移等 | 全连接冗余严重 - FC层参数占整体 >90% - 后发模型(如ResNet)用全局池化替代FC |
简洁设计理念 - 架构规整透明,易于复现/改进 - 小卷积堆叠优于大核(更多非线性+更少参数) | 训练成本高昂 - 需大数据集(ImageNet级)防止过拟合 - 对超参数敏感 |
VGG-19 尽管它取得了显著的高精度,但因其庞大的参数量和计算开销,在新模型设计和效率敏感的部署场景中已被 ResNet 等更现代的网络结构所取代。但在图像表示学习、迁移学习和理解深度网络基础方面,VGG-19 仍然是一个非常重要和经典的基准模型。