当前位置: 首页 > article >正文

【深度学习】(10)--ResNet残差网络

文章目录

  • ResNet残差网络
    • 1. 传统卷积神经网络的问题
      • 1.1 梯度消失和梯度爆炸
      • 1.2 退化问题
    • 2. 解决问题
      • 2.1 梯度消失与爆炸
      • 2.2 退化问题
    • 3. 残差结构
      • 结构归纳
    • 4. BN(Batch Normalization)
  • 总结

ResNet残差网络

ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得COCO数据集中目标检测第一名,图像分割第一名。

ResNet残差网络有两个核心特征:1. 残差结构;2. BN(Batch Normalization)

1. 传统卷积神经网络的问题

神经网络都是通过卷积层和池化层的叠加组成的。在实际的试验中发现,随着卷积层和池化层的叠加,学习效果不会逐渐变好,反而出现2个问题:

1.1 梯度消失和梯度爆炸

梯度消失:若每一层的误差梯度小于1,反向传播时,网络越深,梯度越趋近于0。

梯度爆炸:若每一层的误差梯度大于1,反向传播时,网络越深,梯度越来越大。

1.2 退化问题

由下图发现,训练的层数20层的错误率竟然比56层的错误率还要低。训练层数越多准确率反而下降了,这就是所谓的退化问题。

在这里插入图片描述

2. 解决问题

那么,我们该如何解决上述出现的问题呢?

2.1 梯度消失与爆炸

我们知道,对于解决梯度消失与爆炸问题,我们可以通过更换激活函数,比如ReLU函数。但是我们更改完激活函数之后,还是发生了梯度消失与爆炸问题,,该怎么解决呢?

为了解决梯度消失或梯度爆炸问题,论文提出通过数据的预处理以及在网络中使用 **BN(Batch Normalization)**层来解决。

2.2 退化问题

为了解决深层网络中的退化问题,可以人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为残差网络 (ResNets)

使用后结果如下图所示,随着卷积层和池化层的叠加,学习效果逐渐变好:

在这里插入图片描述

3. 残差结构

残差网络的结构有5种,分别为:

在这里插入图片描述

我们以18层结构为例,来介绍残差网络中的残差结构
在这里插入图片描述

在整个18层结构中,我们发现了残差网络由很多的小残差结构组成:

在这里插入图片描述

对于残差结构的运作:当有图片传进卷积层后,将图片复制成两份,一份直接通过“捷径”抵达卷积后出口,另一份要经过卷积层计算,最后两者进行“整合”。

所谓“整合”,即两个图片对应矩阵位置相加。那这样,图片的值不会变的很大嘛?不会发生梯度爆炸的问题吗?

由于调整权重参数时是反向传播的,使得参数在调整时,会将两个图片整合调整在一个很好的位置,不是盲目相加,能够保留下有效信息,无效信息给剔除掉。当然,相加后值肯定会变大一点点,我们就是要让他增大一点点,防止退化呀!

结构归纳

残差结构:residual结构使用了一种shortcut的连接方式,也可理解为捷径。让特征矩阵隔层相加,注意F(X)和X形状要相同,所谓相加是特征矩阵相同位置上的数字进行相加。

在这里插入图片描述

4. BN(Batch Normalization)

Batch Normalization(批量归一化)目的:使所有的feature map满足均值为0,方差为1的分布规律。

在这里插入图片描述

我们一般在构建传统卷积神经网络模型中,在传入数据图片时,都对数据进行了归一化处理:

transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225]

在整个卷积神经网络中,每次卷积都会得到一批特征图,既然归一化能够使所有的特征都分布在相同大小的区域内,那为什么不对特征图也归一化呢?

所以,Batch Normalization(批量归一化)就是将每批次得到的特征图都进行归一化,减少大量对模型参数微调的时间。

总结

本篇介绍了:

  1. ResNet残差网络的好处:解决梯度消失和梯度爆炸以及退化问题。
  2. ResNet残差网络有两个核心特征:1. 残差结构;2. BN(Batch Normalization)。
    1. 残差结构:防止退化。
    2. BN:减少梯度消失和梯度爆炸问题。

http://www.kler.cn/a/324039.html

相关文章:

  • Python毕业设计选题:基于django+vue的二手物品交易系统
  • 以太坊系地址衍生算法分层确定性生成逻辑
  • 2024强化学习的结构化剪枝模型RL-Pruner原理及实践
  • STM32 学习笔记-----STM32 的启动过程
  • Rust学习(五):泛型、trait
  • windows@多系统引导名字修改@默认引导系统修改@bcdedit配置
  • linux如何配置静态IP
  • 【d53】【Java】【力扣】24.两两交换链表中的节点
  • 元组(tuple)和列表(list)的区别及应用场合
  • 记录linux环境下搭建本地MQTT服务器实现mqtt的ssl加密通讯
  • 在AI时代,程序员如何提升核心竞争力?
  • Unix-like 系统中的文件所有权管理:使用 sudo chown -R 命令的详解与实践应用
  • React 启动时webpack版本冲突报错
  • PHP爬虫:获取商品SKU详细信息的艺术
  • 【分布式微服务云原生】探索微服务架构下的服务治理
  • 【RocketMQ】RocketMQ安装
  • 560. 和为 K 的子数组
  • 【Linux】修改用户名用户家目录
  • 切换笔记本键盘的启用与禁用状态
  • windows C++-创建使用特定计划程序策略的代理
  • Redis缓存双写一致性笔记(上)
  • 机器学习西瓜书笔记(十一) 第十一章特征选择与稀疏学习+代码
  • JAVA-内部类和匿名内部类
  • Pandas空值识别,空值填充,空值过滤方法超详细解读
  • 如何手动安装libcrypto.so.10和libssl.so.10这两个库?
  • C语言 | Leetcode C语言题解之第440题字典序的第K小数字