热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【深度学习】ResNet模型

DeepResidualLearningforImageRecognitionResNet在2015年被提出,在ImageNet比赛classification任务上获得第一名(V

Deep Residual Learning for Image Recognition

ResNet在2015年被提出,在ImageNet比赛classification任务上获得第一名(VGG是ImageNet2014年)在之前的VGG介绍中说过网络的深度对模型识别的准确度有很大的影响,但是在实际训练过程中,如果网络深度过深的话会引起在训练过程中发生退化的问题。为此我们的ResNet克服了这个困难
【深度学习】ResNet模型

深度影响

随着网络的深度增加学习能力增强,但是如果单纯的增加网络的深度就发生梯度消失或者梯度爆炸。在另一方面退化问题上,更深的模型不应当产生比它更浅的模型更高的错误率。而这个“退化”是因为在模型变复杂时,随机梯度下降的优化变得更加困难,导致了模型达不到好的学习效果。为此论文中提出了Block结构

Block结构

【深度学习】ResNet模型
上图就是block结构,在深层网络添加了一个恒等映射,将原始所需要学的函数H(x)转换成F(x)+x,那么模型就退化为一个浅层网络。可以明显的看出直接拟合一个潜在的H(x) = x,比较困难,这可能就是深层网络难以训练的原因。为此使用H(x) = F(x) + x就可以将其转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x,所以优化F(x)肯定要比H(x)要容易。

对于block中的shortcut需要注意
A. 使用恒等映射,如果residual block的输入输出维度不一致,对增加的维度用0来填充;
B. 在block输入输出维度一致时使用恒等映射,不一致时使用线性投影以保证维度一致;
C. 对于所有的block均使用线性投影。

这个Residual block通过shortcut将这个block的输入和输出进行加叠,这个简单的加法并不会给网络增加额外的参数和计算量,同时却可以大大增加模型的训练速度、提高训练效果。这样就保证了我在增加网络深度的时候模型的效果起码不会变差

实验

论文中先建立了一个18层和一个34层的普通罗列的CNN,随后又分别建立了同样大小的残差网络,在原来的plain长加入了shortcut,在这两个网络参数完全相同的情况下与之前的vgg19 模型比计算量要少了许多。
【深度学习】ResNet模型
在观察实验结果后发现在不使用残差结构的时候观测到模型曾深层次明显出现的退化,反观ResNet没有出现退化而且效果比18层的更好,同时收敛速也更快。
【深度学习】ResNet模型

总结

1、plain-18和plain-34的实验证明了退化问题不是因为梯度弥散,因为加入了BN。而且单纯的增加迭代次数要同样会导致模型退化。

2、实验了ResNet-18和ResNet-34,ResNet-34效果远远优于ResNet-18和plain-34,证明了残差结构解决了退化的问题。 而且同等深度的plain-18和ResNet-18,残差网络收敛更快。

3、对于同等映射维度不匹配时有两种匹配维度的方法
零填充和线性投影。作者比较了这两种方法的优劣。实验证明,投影法会比zero padding表现稍好一些。因为zero padding的部分没有参与残差学习。实验表明,将维度匹配或不匹配的同等映射全用投影法会取得更稍好的结果。

4、更深的瓶颈结构:
将原来的block(残差学习结构)改为瓶颈结构。首端和末端的1x1卷积用来削减和恢复维度,只剩下中间3x3作为瓶颈部分。这两种结构的时间复杂度相似。但是此时投影法的参数出现了输入维度增加,所以要使用zero padding的同等映射。为此网络深度可以继续增加,性能不断提升,最后在1202层的时候,发现网络过深,出现了过拟合


推荐阅读
  • 从2019年AI顶级会议最佳论文,探索深度学习的理论根基与前沿进展 ... [详细]
  • 非计算机专业的朋友如何拿下多个Offer
    大家好,我是归辰。秋招结束后,我已顺利入职,并应公子龙的邀请,分享一些秋招面试的心得体会,希望能帮助到学弟学妹们,让他们在未来的面试中更加顺利。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • Spring 切面配置中的切点表达式详解
    本文介绍了如何在Spring框架中使用AspectJ风格的切面配置,详细解释了切点表达式的语法和常见示例,帮助开发者更好地理解和应用Spring AOP。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 双指针法在链表问题中应用广泛,能够高效解决多种经典问题,如合并两个有序链表、合并多个有序链表、查找倒数第k个节点等。本文将详细介绍这些应用场景及其解决方案。 ... [详细]
  • 本文介绍如何通过 Python 的 `unittest` 和 `functools` 模块封装一个依赖方法,用于管理测试用例之间的依赖关系。该方法能够确保在某个测试用例失败时,依赖于它的其他测试用例将被跳过。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • Panabit应用层流量管理解决方案
    Panabit是一款国内领先的应用层流量管理解决方案,提供高度开放且免费的专业服务,尤其擅长P2P应用的精准识别与高效控制。截至2009年3月25日,该系统已实现对多种网络应用的全面支持,有效提升了网络资源的利用效率和安全性。 ... [详细]
author-avatar
lucifer
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有