共计 2139 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
卷积神经网络(CNN)是计算机视觉领域的基石技术,而 VGGNet 和 GoogLeNet 作为 2014 年 ImageNet 竞赛的并列冠军,代表了 CNN 架构设计的两个重要方向。选择它们作为学习案例是因为:

- VGGNet 以极简的 3×3 卷积堆叠验证了网络深度的重要性
- GoogLeNet 提出 Inception 模块开创了多尺度特征融合的先河
- 两者在当今工业界仍有广泛应用(如 VGG 用于风格迁移,GoogLeNet 的变体用于移动端)
架构对比
VGGNet:深度的力量
- 统一卷积核 :全部使用 3×3 小卷积核堆叠,相当于大感受野但参数更少
- 结构规律 :每组卷积后接最大池化,每块深度倍增(64→128→256→512)
- 参数量 :VGG16 约 1.38 亿参数,全连接层占比 90%
GoogLeNet:宽度的艺术
- Inception 模块 :并行 1×1、3×3、5×5 卷积和池化,通过 1×1 卷积降维
- 辅助分类器 :中间层添加辅助输出防止梯度消失
- 参数优化 :仅 500 万参数,计算量却达 15 亿次乘加(FLOPs)
PyTorch 实现
VGG16 基础版
import torch.nn as nn
class VGG16(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
self.features = nn.Sequential(
# Block1: 2 层 Conv
nn.Conv2d(3, 64, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(64, 64, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
# 类似结构延续到 Block5...
)
self.classifier = nn.Sequential(nn.Linear(512*7*7, 4096), # 实际 CIFAR-10 需调整输入维度
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, num_classes),
)
关键说明:
inplace=True节省内存- 实际使用需根据输入尺寸调整全连接层(CIFAR-10 建议改为 512→512)
GoogLeNet 实现要点
class Inception(nn.Module):
def __init__(self, in_channels, ch1x1, ch3x3red, ch3x3, ch5x5red, ch5x5, pool_proj):
super().__init__()
# 1x1 分支
self.branch1 = nn.Sequential(nn.Conv2d(in_channels, ch1x1, kernel_size=1),
nn.BatchNorm2d(ch1x1),
nn.ReLU(inplace=True),
)
# 其他分支类似...
def forward(self, x):
return torch.cat([self.branch1(x),
self.branch2(x),
self.branch3(x),
self.branch4(x),
], 1)
训练实践(CIFAR-10)
-
数据准备 :
transform = transforms.Compose([transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) -
训练配置 :
- Batch Size: 128(11GB 显存建议值)
- 优化器: Adam(lr=0.001)
-
学习率调度: ReduceLROnPlateau(patience=3)
-
典型训练曲线 :
- VGG16 约 50epoch 收敛,验证集最高 87%
- GoogLeNet 约 30epoch 收敛,验证集最高 89%
性能对比
| 指标 | VGG16 | GoogLeNet |
|---|---|---|
| 参数量 | 138M | 5M |
| FLOPs | 15.5B | 1.5B |
| 推理时延 (CPU) | 120ms | 45ms |
| 显存占用 | 1.2GB | 0.8GB |
避坑指南
- 梯度问题 :
- VGG 深网络建议添加 BatchNorm
-
GoogLeNet 可利用辅助分类器梯度
-
过拟合 :
- VGG 应加大 Dropout 比率 (0.5)
-
数据增强优先于 L2 正则化
-
部署优化 :
- VGG 可转换为全卷积网络
- GoogLeNet 的 1×1 卷积适合量化
总结思考
- VGG 适用场景 :需要高精度且资源充足的场景(如服务器端)
- GoogLeNet 优势 :移动端 / 嵌入式设备首选
- 进阶建议 :
- 先掌握这两种基础架构
- 再学习 ResNet 的残差连接
- 最后研究 EfficientNet 的复合缩放
通过这次实践,我深刻体会到:
– 网络不是越深越好,要考虑计算代价
– 模型设计需要平衡深度、宽度和多尺度特征
– 实际项目中应根据硬件条件做架构选择
正文完
发表至: 未分类
四天前
