张芷铭的个人博客

ResNet 通过残差连接解决深度网络的梯度消失问题,使网络深度突破 1000 层。

定义

残差网络(Residual Network, ResNet)的核心创新是残差学习机制:

$$y = F(x, {W_i}) + x$$

跳跃连接(Skip Connection)让梯度直接流向前面的层。

发展历史

时间里程碑
2012AlexNet 开启 CNN 时代
2014VGGNet 证明深度提升性能,但出现梯度问题
2015何恺明团队提出 ResNet
2016ResNet-152 错误率 3.57%,超越人类水平

核心原理

残差块

1
2
3
x ──Conv──ReLU──Conv──(+ x)──ReLU──> y
│                                   │
└───────────────────────────────────┘

$$y = \text{ReLU}(F(x) + x)$$

网络架构

版本深度关键改进
ResNet-1818基础残差块
ResNet-5050瓶颈结构(Bottleneck)
ResNet-152152常用最大版本

瓶颈结构:$1\times1$ 降维 → $3\times3$ 卷积 → $1\times1$ 升维

适用场景

任务应用
图像分类ImageNet 基准测试
目标检测Faster R-CNN 骨干网络
语义分割FCN + ResNet
姿态估计HRNet 基础架构

实际应用:医学影像、自动驾驶、工业质检。

训练技巧

  • 学习率:初始 0.1,每 30 epoch 除以 10
  • Batch Size:256(多 GPU 并行)
  • 优化器:SGD with momentum=0.9
  • 权重衰减:1e-4
  • 数据增强:随机裁剪、水平翻转、颜色抖动

PyTorch 实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class BasicBlock(nn.Module):
    expansion = 1

    def __init__(self, in_planes, planes, stride=1):
        super().__init__()
        self.conv1 = nn.Conv2d(in_planes, planes, 3, stride, 1, bias=False)
        self.bn1 = nn.BatchNorm2d(planes)
        self.conv2 = nn.Conv2d(planes, planes, 3, 1, 1, bias=False)
        self.bn2 = nn.BatchNorm2d(planes)

        self.shortcut = nn.Sequential()
        if stride != 1 or in_planes != planes:
            self.shortcut = nn.Sequential(
                nn.Conv2d(in_planes, planes, 1, stride, bias=False),
                nn.BatchNorm2d(planes)
            )

    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)

变体架构

变体改进
ResNeXt分组卷积增强特征多样性
Wide ResNet增加通道数替代加深
Res2Net多尺度特征融合
ConvNeXt受 Swin Transformer 启发

Comments