ResNet

摘要

训练很深的网络很难,我们提出了一个残差连接来降低深层网络的复杂度,使得其更容易训练。

1.介绍

问题:学习更好的网络像堆叠更多的层一样简单吗?

解决:存在梯度消失和梯度爆炸问题,这个问题,可以通过好的标准初始化和BN来解决,这就使得网络可以通过SGD来进行收敛

问题:随着网络开始收敛时候,会出现退化现象,也即深层的网络的训练误差和测试误差都会比浅层网络的要高。

解决:理论上来说,深层的网络一定会比浅层的网络误差要小。理论分析为:深层网络增加的层是恒等映射,而其他层是从已经训练好的浅层模型复制来的。按照这样的思路来说,深层网络的再差也能达到和浅层网络一样的误差,但是结果反而不是。

提出残差连接

假设我们期望的连接映射为H(x),原来的基础映射为x,现在增加一个残差块来学习H(x)比x多学习到的那一部分g(x)。故H(x)=g(x)+x,通过显示的增加恒等映射,来降低模型的复杂度,使得网络更容易训练出来。在极端情况下,如果一个恒等映射是最优的,那么将残差置零比用一堆非线性层来拟合一个恒等映射更容易。
Residual Connection
GBM之前也使用过类似的残差块,这给我们提示:可以用之前的idea来解决当下现存的问题。

2.相关工作

介绍前人其实也有在研究过类似的东西,比如:残差表示和快捷连接

3.深度残差学习

3.1残差学习

3.2恒等映射快捷

快捷连接既不引入额外的参数,也不增加计算复杂度。

3.3网络架构

当网络的维不匹配时,有两种解决策略
A: 捷径仍然执行恒等映射,增加维数时填充额外的零项。这个选项不引入额外的参数;
B: 投影快捷方式用于匹配尺寸(由1×1卷积完成)。

4.实验

network

架构分析

18层和34层,中间可以分为4层,不同层之间使用投影来匹配维度。
18层和34层,中间4层增加了个数。
深层网络的中间层,一般都是先降维,然后卷积,最后升维。远比直接升维做两次卷积的复杂度要低

解决输出和输入不匹配的问题(常用2)

  1. 加0来填充
  2. 维度不同时,用投影来增加维度。相同时,不用投影
  3. 维度同与不同,都用投影

SGD精髓:只要梯度够大,就能train

原来的梯度小,现在加法会加上一个较大的梯度,所以能train的动
gradident

### ResNet 的定义与核心特性 ResNet(残差网络)是一种深度卷积神经网络架构,因其在 ImageNet 大规模图像识别竞赛中的卓越表现而广受关注[^1]。该模型的核心创新在于引入了“shortcut connection”(残差连接),这种机制允许输入信号绕过若干层直接传递到后续层,从而有效缓解了深层神经网络训练过程中常见的梯度消失和梯度爆炸问题。 #### 残差连接的工作原理 传统的前馈神经网络通常逐层传播信息,随着网络加深,可能会遇到优化困难的问题。ResNet 利用残差模块设计了一种新的学习单元形式 \( F(x) + x \),其中 \( F(x) \) 表示经过几层变换后的输出,\( x \) 是输入数据本身。通过这种方式,网络实际上是在学习输入与输出之间的差异(即残差)。这种方法仅简化了优化过程,还帮助保留了原始特征并加速了网络的收敛速度。 #### 同层数版本的具体实现方式 ResNet 提供了多种变体来适应同的应用场景需求,比如 ResNet-18、ResNet-34、ResNet-50 和 ResNet-152 等。这些名称中的数字代表网络总层数。对于较浅的 ResNet 版本(如 ResNet-18 和 ResNet-34),主要采用简单的全卷积结构;而对于更深的版本(如 ResNet-50 及以上),则加入了瓶颈层(bottleneck layers),进一步提升计算效率的同时保持性能优势。 以下是 ResNet 中典型的残差块代码实现: ```python import torch.nn as nn class BasicBlock(nn.Module): expansion = 1 def __init__(self, in_channels, out_channels, stride=1, downsample=None): super(BasicBlock, self).__init__() self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU(inplace=True) self.conv2 = nn.Conv2d(out_channels, out_channels * self.expansion, kernel_size=3, stride=1, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(out_channels * self.expansion) self.downsample = downsample def forward(self, x): identity = x if self.downsample is not None: identity = self.downsample(x) out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) out += identity out = self.relu(out) return out ``` 上述代码展示了如何构建一个基础的残差块 `BasicBlock`,它包含了两个连续的卷积操作以及批量归一化和激活函数处理步骤。如果存在下采样情况,则会调整 shortcut path 上的数据维度匹配主路径输出大小。 ### 应用领域 由于其出色的泛化能力和可扩展性,ResNet 已被广泛应用于各类计算机视觉任务中,包括但限于物体检测、语义分割、姿态估计等领域。此外,在迁移学习场景下,预训练好的 ResNet 模型也常作为强大的特征提取器用于解决新问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值