深入理解 ResNet:深度残差网络

什么是 ResNet?

随着深度学习的发展,网络的层数变得越来越深。然而,研究发现,更深的网络并不总能带来更好的性能。在训练非常深的网络时,常会出现以下两个问题:
梯度消失或爆炸:随着网络加深,反向传播中的梯度可能会消失或爆炸,导致模型难以训练。**
退化问题:即使没有梯度问题,增加网络层数反而会导致训练误差增大,这意味着更深的网络并未有效学到更多的特征。
为了解决这些问题,ResNet 提出了 “残差学习” 的概念。

ResNet 的核心思想

ResNet 的核心是 残差模块(Residual Block),它通过引入 跳跃连接(Skip Connection),使得网络能够直接学习残差函数,而不是原始映射函数。

残差模块的公式为:

y=F(x,{Wi})+x

其中:
F(x,{Wi}) 表示残差,即网络需要学习的部分。
x 是输入,跳跃连接将其直接传递到输出。

这种设计的优点是:
如果额外的层对输出无贡献(即学习到的是恒等映射),网络可以轻松实现这一点,因为直接跳过了这部分计算。
避免了深层网络中梯度传递的困难。

残差模块结构
一个典型的残差模块包括:
两个或三个卷积层(通常后接 Batch Normalization 和 ReLU 激活函数)。
一个跳跃连接(可能需要使用 1x1 卷积调整维度)。

以下是一个标准的 2-layer 残差模块示意图:
在这里插入图片描述

ResNet 的网络架构

ResNet 的原始版本包括多种深度的网络结构,如 ResNet-18、ResNet-34、ResNet-50、ResNet-101 和 ResNet-152。以下是它们的主要区别:
ResNet-18 和 ResNet-34:

  • 使用基本的 2-layer 残差模块。
  • 适合计算资源有限的场景。

在这里插入图片描述

ResNet-50、ResNet-101 和 ResNet-152:

  • 使用瓶颈结构的 3-layer 残差模块(1x1 卷积用于降维和升维,中间是 3x3 卷积)。
  • 更深的网络可以提取更高级别的特征。

ResNet-50 的典型结构:

  • 输入:224x224 的图像
  • 卷积层 + 最大池化:特征图缩小到 112x112
  • 四个阶段(每个阶段包含多个残差块)
  • 全局平均池化 + 全连接层

ResNet的优势

  • 解决深度退化问题: 残差学习能够让网络更容易优化,随着层数加深也不会导致性能下降。
  • 强大的特征提取能力: ResNet能够在更深的网络中捕获多层次的特征信息。
  • 易于扩展和迁移: ResNet 的模块化设计使其可以很方便地应用到不同任务中(如目标检测、语义分割)。

ResNet 的实现(PyTorch 示例)

在现实任务中,往往需要根据数据选择网络的深度。在笔者现有的ResNet34和ResNet50足以满足任务需求,以下是使用 PyTorch 实现一个简单的 ResNet 模块的代码:

import torch
import torch.nn as nn
import torch.nn.functional as F
​
# 定义残差模块
class ResidualBlock(nn.Module):
def __init__(self, in_channels, out_channels, stride=1, downsample=None):
super(ResidualBlock, se
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值