【卷积神经网络】ResNet网络原理

卷积神经网络深度过深的弊端

梯度消失与梯度爆炸

网络层数不断加深的时候,梯度在反向传播的过程中会出现梯度消失和梯度爆炸

  • 原因分析
    • 因为深度网络中,梯度的计算需要经历多层的链式求导,从而就有可能导致梯度乘积逐渐趋近于0或者梯度爆炸
    • 如果在其中使用了激活函数,输入值远离0会导致梯度非常的小,从而就更加剧了梯度消失
  • 梯度消
    • 在反向传播时,梯度会随着网络层数的增加不断变小,导致靠近输入层的权重更新几乎停止,网络无法有效学习
    • 像是传递消息时,信息逐渐变得不清晰,导致靠近输入层的权重更新停止
  • 梯度爆炸
    • 如果权重初始化或激活函数选择不当,梯度会随着层数的增加呈指数级放大,导致训练过程不稳定,权重更新过大
    • 像是推台阶时,台阶越来越高,导致你失去控制,训练过程变得不稳定

网络退化

随着网络层数不断的增加,训练误差和测试误差会反而变大,模型的性能也就会对应下降

  • 特征丢失:网络加深的同时,每一层可能会丢失有效的特征信息
  • 难以优化:深层网络的训练变得更加困难,因为每层的非线性变换(如 ReLU 激活)会导致有效特征信息的损失
  • 权重学习困难:由于梯度问题,新增加的层学习不到有用的特征,导致整个网络的性能下降

参数冗余和过拟合

大量的参数会带来计算开销变大,同时也就容易导致模型无法有效利用这些参数,最终导致参数冗余的情况,就像拥有太多的工具,浪费了计算资源和时间,反而没有提高效率

深层网络可能在训练数据上表现良好,但是泛化能力降低了,最后在测试数据上变差。死记硬背固有知识点,当面对新的知识点就会表现差

概述

ResNet(Residual Network,残差网络) 是由 微软研究院Kaiming He 等人在 2015 年提出的一种深度卷积神经网络架构。ResNet 通过引入 残差学习(Residual Learning)跳跃连接(Skip Connection),有效解决了深度神经网络中的 梯度消失梯度爆炸网络退化问题,使得网络可以非常深而仍然保持较好的训练效果

主要优点

  • 解决退化问题:通过残差连接,有效解决了深层网络的退化现象,使得网络可以堆叠更多层而不会影响性能
  • 缓解梯度消失和爆炸:跳跃连接提供了更顺畅的梯度传递路径,缓解了梯度消失或爆炸问题
  • 简化优化问题:学习残差映射比学习完整映射更简单,有助于加速收敛
  • 提高网络性能:ResNet 在 ImageNet 等数据集上取得了显著的性能提升,证明了其有效性

影响

  • 推动了超深网络的发展,后续网络如 DenseNetResNeXt 等都借鉴了残差学习的思想
  • ResNet 成为计算机视觉任务中常用的基础网络,如目标检测、图像分割等

ResNet核心思想

残差学习

残差块

残差块(Residual Block) 是 ResNet 的核心结构,它解决了深度网络训练时容易出现的梯度消失梯度爆炸问题

残差学习的数学表达式

  • 输入x,目标输出H(x),那么残差块学习残差函数  F(x)=H(x)−x
  • 最红输出通过跳跃连接变为   H(x)=F(x)+x

引入残差学习的原因

因为在深度网络中,直接学习H(x)也就是输入到输出的直接映射会十分困难(参考卷积神经网络深度过深的三个弊端分析,也就是梯度爆炸与梯度消失、优化困难、网络逐渐退化)

残差块通过学习残差函数F (x),而不直接学习H(x),从而使得网络学习更加容器,也简化了训练的过程

残差学习可以理解成通过将网络的每一层视为对输入信号的修正,而不是直接学习输出的映射,从而简化了训练过程。具体来说,残差块将直接映射H(x) 表示为 H(x)=F(x)+x,其中F(x) 是残差函数,x 是输入。通过这种方式,网络实际上只需要学习输入与输出之间的“差异”,而不是直接学习复杂的映射关系

这个就像盖楼房中的加建,例如正在建设一个高楼建筑,传统的方法是从地面到顶部设置一个完整的结构,每一次盖楼的时候都按照图纸从最底层开始建造,这样无论设计还是施工难度都是非常大。

相反通过引入残差学习思想,可以先建造一个低楼层(打下基础),然后对楼层逐渐的加高,每一层只需要对前一层的结构微调(加建,月就是通过残差学习),而不需要重新设计这个建筑,这样就实现了降低复杂性和建设难度。

残差块结构

主要结构分析

  • 跳跃连接
    • 跳跃连接是一条直通的路径,它将输入 xxx 直接传递到输出层,绕过中间的卷积层
    • 类似于项目中修改代码,开始的原始代码(输入的x)进行保存。后面不断的改善方案(残差函数F(x)),但是仍然保留了最初的设计,并在最终阶段将初始方案和改善方案结合在一起。这样就实现了原始信息不丢失,同时改进的信息也可以添加进去。
  • 残差映射
    • 残差函数F (x) 通过卷积层、批量归一化层和ReLu激活函数来学习输入和输出的差异
    • 学习残差函数就是不断的修正计划,但不是重新制定新的计划
  • F(x)+x 的相加操作
    • 将残差映射F(x)与输入x相加,从而最终得到输出的H(x)
    • 在草稿基础上做修改,最终的文章是初稿加上你的改进内容

两种残差块结构了解

  • 两个3×3 卷积层,输出通道数和输入一致
  • 直接通过跳跃连接相加

  • 通过1X1卷积改变通道和维数,从而确保相加时输入和输出的维度匹配

归一化

基本了解

归一化 是一种有效的数据处理方法,能够改善神经网络的训练过程,加速收敛并提高模型的稳定性。
Batch Normalization 是目前最流行的归一化技术之一,通过对每个批量数据进行归一化,并引入可学习参数 γ 和 β,成功解决了深度网络训练中的 梯度问题优化难题

自我理解

归一化本质上就是将不同范围的数据调整在一个相同的评判标准,从而使得模型更加的公平、高效处理输出,从而提高训练效果

例如两个学校的评分标准不同,学校A的满分是100,学校B的满分是150。此时如果直接比较两个学生的成绩肯定是难以判定的,例如A学校学生平均考了90分,B学校的学生考了120分

归一化则将成绩调整在一个统一的范围之内,例如可以通过下面的公式,就可以将A学校 = 0.9,B学校学生 = 0.8;那么我就可以得出A学校比B学校的学生成绩好的结论

BN核心思想与数学定义了解

BN的核心思想就是对网络中的每一层输入,BN对一个小批量数据进行标准化处理

计算批量数据的均值

计算批量数据的方差

对数据进行标准化

尺度变换与偏移

最终返回γ 和 β

BN的特点

  • 训练阶段:BN 在每个小批量上独立计算均值和方差,并基于这些统计量进行归一化
  • 测试阶段:BN 使用训练阶段累积的均值和方差进行归一化,保证数据的稳定性
  • 学习参数:通过引入可学习的缩放参数  γ 和偏移参数 β,BN 保留了网络的表达能力,避免过度归一化影响性能

归一化存在原因

数据分布变化

在深度神经网络中,网络的参数会随着训练的进行而不断更新,这也导致每一层输入数据的分布发生变化。这种输入数据分布的变化就称为内部协变量偏移

例如网络中第二层的输入总是依赖于第一层的输出,而第一层的参数会在训练中的不断更新,那么第二层的输入的分布也会不断的变化

上述的分布变化就会导致网络难以训练,因为后续层需要不断适应输入数据的变化,收敛速度变慢

梯度问题

数据分布范围过大或不均匀时,网络参数更新的梯度可能会变得非常小(梯度消失)或非常大(梯度爆炸)

归一化可以将数据调整到一个合理的范围内,缓解梯度问题,使得训练过程更加稳定

收敛速度

归一化能够使数据分布更加均匀,接近标准正态分布(均值为 0,方差为 1),这样的分布更有利于网络训练时的参数更新,有助于加速梯度下降过

BN的主要功能

结合归一化存在原因理解

  • 规范化输入数据:将输入数据调整为均值接近 0,方差接近 1
  • 降低内部协变量偏移:通过稳定数据分布,减少分布的变化对训练的影响
  • 提高训练速度和稳定性:加速收敛过程,并使训练更加稳定

ResNet网络参数

基本逻辑

  • 通过大卷积核和池化层进行特征提取和降维
  • 通过跳跃连接实现残差学习,确保网络加深时不会出现梯度消失和退化问题
  • 通过全局平均池化和全连接层完成最终的输出预测

模型分析

  • 输入层
    • 224*224的三通道彩色图像
  • 卷积层
    • 输入:224*224*3
    • 卷积核:64
    • 卷积核大小:7*7*3(通道)
    • 步幅:2
    • 填充:3
    • 输出:112*112*64
      • 因为经过7*7的卷积操作,输出的特征图尺寸变为112*112,通道数增加到64
  • 最大池化层
    • 输入:112*112*64
    • 池化核:3*3
    • 步幅:2
    • 填充:1
    • 输出:56*56*64

  • 第一个残差块
    • 输入:56*56*64
    • 卷积核:64
    • 卷积核大小:3*3
    • 步幅:1
    • 填充:1
    • 输出:56*56*64
  • Batch Normalization 和激活函数
    • 激活函数:ReLu
    • 输出:56*56*64
  • 第二个卷积层
    • 卷积核:64
    • 卷积核大小:3*3
    • 步幅:1
    • 填充:1
    • 输出:56*56*64
  • Batch Normalization
    • 经过BN处理,输出56*56*64
  • 跳跃连接和输出
    • 输出的x与经过两层卷积核的BN的输出F(x)进行相加
    • 最后输出的尺寸仍然为 56*56*64

  • 全局平均池化
    • 输入:7*7*512
    • 输出:1*1*512
  • Flatten层
    • 输入:1*1*512
    • 输出:1*512
  • 线性全连接层
    • 输入:1*512
    • 神经元10个,输出10个分类

部分课件图片引用自“炮哥带你学”

### 卷积神经网络ResNet模型实现与使用 #### 背景介绍 卷积神经网络CNNs)架构高度依赖于输入数据的性质以及预期输出大小。对于图像或音频序列等不同类型的输入,存在多种常见的卷积神经网络结构,其中包括ResNet[^1]。 #### ResNet简介 ResNet(残差网络),由微软研究院的研究人员提出,在ImageNet竞赛中取得了优异的成绩。该模型通过引入跳跃连接解决了深层网络训练中的梯度消失问题,使得可以构建更深更复杂的网络而不会导致性能下降。 #### 实现ResNet模型 下面是一个简单的基于PyTorch框架下的ResNet模型实现: ```python import torch from torchvision import models class SimpleResNet(torch.nn.Module): def __init__(self, num_classes=1000): super(SimpleResNet, self).__init__() # 使用预定义好的resnet50作为基础特征提取器 resnet = models.resnet50(pretrained=True) # 替换最后一层全连接层以适应新的分类任务 fc_in_features = resnet.fc.in_features resnet.fc = torch.nn.Linear(fc_in_features, num_classes) self.model = resnet def forward(self, x): return self.model(x) if __name__ == "__main__": device = 'cuda' if torch.cuda.is_available() else 'cpu' net = SimpleResNet(num_classes=10).to(device) dummy_input = torch.randn((1, 3, 224, 224)).to(device) output = net(dummy_input) print(output.shape) # 应打印torch.Size([1, 10]) ``` 这段代码展示了如何利用`torchvision.models`库快速搭建一个用于特定类别预测的任务上的简化版ResNet模型,并进行了基本测试。 #### 数据准备 为了能够有效地应用上述创建的ResNet模型来进行时间序列预测或其他视觉识别任务,需要准备好合适的数据集并对其进行适当处理。这通常涉及到将原始图片转换成适合喂入网络的形式——即标准化后的张量形式。此外还需要考虑批量加载机制来提高效率[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值