经典CNN模型之VGG与ResNet
1. VGG网络
1.1 核心思想
- 统一卷积核设计:全部使用3×3小卷积核堆叠,替代大尺寸卷积核(如5×5、7×7)
- 深度增加:通过多层小卷积核组合实现与大卷积核相同的感受野,同时减少参数量
- 架构标准化:提出从VGG11到VGG19的多种深度配置(以卷积层数命名)
1.2 网络结构
# 典型VGG16结构示例
Conv3-64 → Conv3-64 → MaxPool →
Conv3-128 → Conv3-128 → MaxPool →
Conv3-256 → Conv3-256 → Conv3-256 → MaxPool →
Conv3-512 → Conv3-512 → Conv3-512 → MaxPool →
Conv3-512 → Conv3-512 → Conv3-512 → MaxPool →
Flatten → FC-4096 → FC-4096 → FC-1000(Softmax)
1.3 关键贡献
- 证明网络深度对性能的重要性
- 小卷积核的堆叠策略成为后续模型设计范式
- 在2014年ImageNet竞赛中达到7.3% top-5错误率
2. ResNet(残差网络)
2.1 核心创新
- 残差学习:提出"恒等快捷连接"(Identity Shortcut)解决梯度消失问题
- 基本单元公式:
其中为残差函数
2.2 网络变体
| 模型 | 层数 | 主要改进 |
|---|---|---|
| ResNet-18 | 18 | 基础残差块结构 |
| ResNet-34 | 34 | 增加深度 |
| ResNet-50 | 50 | 引入瓶颈设计(Bottleneck) |
| ResNet-101 | 101 | 超深度网络 |
| ResNet-152 | 152 | 当前常用最大配置 |
2.3 关键技术
- 瓶颈结构:1×1卷积降维→3×3卷积→1×1卷积升维
- 批量归一化:每个卷积层后接BN层
- 全局平均池化:替代全连接层减少参数量
3. 对比分析
| 特性 | VGG | ResNet |
|---|---|---|
| 最大深度 | 19层 | 152层+(理论上无限延伸) |
| 参数量 | ~138M(VGG16) | ~25.5M(ResNet50) |
| 核心创新 | 小卷积核堆叠 | 残差连接 |
| 训练难度 | 较易梯度消失 | 可训练极深层网络 |
| ImageNet Top-5 | 7.3% | 3.57%(ResNet152) |
4. 实际应用建议
VGG适用场景:
- 需要高精度中等深度模型
- 迁移学习中的特征提取器
- 计算资源充足的场景
ResNet适用场景:
- 超深度网络需求
- 需要解决梯度消失问题
- 资源受限时可用带瓶颈结构的版本
5. 代码实现示例
# ResNet残差块实现(PyTorch)
class ResidualBlock(nn.Module):
def __init__(self, in_channels, out_channels, stride=1):
super().__init__()
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1)
self.bn1 = nn.BatchNorm2d(out_channels)
self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)
self.bn2 = nn.BatchNorm2d(out_channels)
self.shortcut = nn.Sequential()
if stride != 1 or in_channels != out_channels:
self.shortcut = nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride),
nn.BatchNorm2d(out_channels))
def forward(self, x):
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out += self.shortcut(x)
return F.relu(out)
里程碑意义:VGG和ResNet分别代表了CNN发展过程中"深度化"和"可训练性"两个关键阶段的突破,其设计思想持续影响当前最先进的模型架构。
