深度学习:ResNet 残差神经网络详解

一、ResNet 残差神经网络的起源与核心地位

ResNet(Residual Neural Network,残差神经网络)是 2015 年由微软亚洲研究院的何凯明、张祥雨等研究者提出的深度神经网络架构。在当年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)中,ResNet 凭借革命性的设计一举斩获分类任务、目标检测任务双料冠军;同时在 COCO 数据集(Common Objects in Context)的评测中,也包揽了目标检测与图像分割任务的第一名,成为计算机视觉领域的里程碑模型。

与传统卷积神经网络(如 AlexNet、VGGNet)相比,ResNet 的核心突破在于两点:独创的残差结构内置的批次归一化机制。这两个设计不仅让网络能够突破 “深度瓶颈”,实现数百层的有效训练,更奠定了后续深度学习架构(如 DenseNet、EfficientNet)的设计基础,至今仍是图像分类、目标检测、图像分割等任务的基础骨干网络之一。

二、残差结构的原理与实现细节

残差结构(Residual Block)是 ResNet 的 “灵魂”,其核心目标是解决深层网络训练中的 “退化问题”,让网络在增加深度的同时,性能不下降甚至提升。

1. 核心思想:从 “直接映射” 到 “残差学习”

传统神经网络的每一层都试图学习 “输入到输出的直接映射”(即学习函数 ),而残差结构则将目标改为学习 “输入与输出的差异”(即学习残差函数 )。最终网络的输出则变为:) 其中,x 是残差块的输入,是经过若干卷积层、激活函数后的特征(残差部分),“+” 代表元素级加法(即特征矩阵相同位置的数值相加)。

这种设计的优势在于:当网络需要学习 “恒等映射”(即输入等于输出,)时,只需让残差部分 ) 即可,无需让卷积层费力学习复杂的直接映射 —— 这大大降低了深层网络的训练难度。

2. 实现关键:保证输入与残差的 “形状匹配”

元素级加法要求输入 x 和残差  的特征矩阵形状(高度、宽度、通道数)完全一致,否则无法直接相加。为满足这一要求,ResNet 设计了两种残差块:

(1)恒等映射残差块(Identity Block)

适用于 “输入与输出特征形状一致” 的场景(通常是同一组残差块内部的连接)。结构如下:

  1. 输入 x 先经过 1 个卷积层(卷积核大小 3×3,步长 1,填充 1),激活函数为 ReLU;
  2. 再经过 1 个卷积层(同样 3×3,步长 1,填充 1),此时得到残差 
  3. 将  与原始输入 x 直接相加(元素级加法);
  4. 最后经过 ReLU 激活函数,得到残差块的输出。
  5. 由于卷积层使用 “步长 1 + 填充 1”,残差 的高度、宽度与输入 x 完全一致;若通道数需调整,会在卷积层中通过调整卷积核数量来匹配输入通道数。

                           

(2)1×1 卷积调整残差块(Conv Block)

适用于 “输入与输出特征形状不一致” 的场景(通常是不同组残差块之间的连接,需要降维或调整通道数)。结构与恒等映射块类似,但增加了 “1×1 卷积调整输入” 的步骤:

  1. 输入 x 先经过 1 个 1×1 卷积层(步长 2,无填充),目的是将输入的高度、宽度减半(降维),同时调整通道数;
  2. 后续卷积层操作与恒等映射块一致,得到残差 \(F(x)\);
  3. 跳跃连接(Skip Connection)部分的输入 x 也需经过 1 个 1×1 卷积层(步长 2),确保其形状与 \(F(x)\) 匹配;
  4. 两者相加后经过 ReLU 激活,得到输出。

1×1 卷积的引入是 ResNet 的巧妙设计 —— 它既能高效调整特征通道数,又能控制计算量,避免因形状匹配导致的复杂度飙升。

三、ResNet 经典变体:从 18 层到 152 层的架构解析

ResNet 并非单一架构,而是一系列不同深度的变体集合。通常所说的 “层数” 指的是卷积层与全连接层的总数量(不含池化层、激活层)。常见变体包括 ResNet-18、ResNet-34、ResNet-50、ResNet-101、ResNet-152,其核心差异在于 “残差块的类型” 和 “每组残差块的数量”。

1. 架构分类:基础块与瓶颈块

  • 基础块(Basic Block):用于 ResNet-18 和 ResNet-34,由 2 个 3×3 卷积层组成(即上述恒等映射 / Conv Block 结构),适合层数较少的网络。
  • 瓶颈块(Bottleneck Block):用于 ResNet-50、ResNet-101 和 ResNet-152,由 “1×1 卷积(降维)→3×3 卷积(特征提取)→1×1 卷积(升维)” 组成。这种结构在保证特征提取能力的同时,大幅减少了计算量(FLOPs),让数百层网络的训练成为可能。

2. ResNet 各变体架构对比表

下表清晰展示了不同 ResNet 变体的层数分布、残差块类型及计算复杂度(以 ImageNet 数据集为基准):

3. ResNet-18 架构示例(以 ImageNet 分类任务为例)

ResNet-18 是最基础的变体,其架构流程可分为 5 个阶段,清晰体现了 ResNet 的设计逻辑:

  1. 输入层与初始卷积:输入 224×224×3 的 RGB 图像,经过 1 个 7×7 卷积层(步长 2,填充 3)和 1 个最大池化层(3×3,步长 2),得到 56×56×64 的特征图;
  2. 第一组残差块:包含 2 个基础块(恒等映射块),输入输出均为 56×56×64,无降维;
  3. 第二组残差块:包含 2 个基础块,第一个块为 Conv Block(步长 2),将特征图降为 28×28×128,第二个块为恒等映射块;
  4. 第三组残差块:包含 2 个基础块,第一个块为 Conv Block(步长 2),将特征图降为 14×14×256,第二个块为恒等映射块;
  5. 第四组残差块:包含 2 个基础块,第一个块为 Conv Block(步长 2),将特征图降为 7×7×512,第二个块为恒等映射块;
  6. 全局平均池化与全连接:对 7×7×512 的特征图进行全局平均池化,得到 1×1×512 的向量,再经过 1 个全连接层输出 1000 个类别(对应 ImageNet 的 1000 类分类任务)。

实际应用中,若需适配自定义分类任务(如 10 类分类),只需将最后全连接层的输出维度修改为 10 即可。

4.表格示例

  • 18层,34层,50层,101层,152层,及其结构
  • FLOPs行是每个网络的计算性能和模型复杂度

四、批次归一化(Batch Normalization)与 ResNet 的协同作用

批次归一化(Batch Normalization,简称 BN)并非 ResNet 首创(2015 年由 Ioffe 和 Szegedy 提出),但 ResNet 将其与残差结构深度结合,成为解决深层网络训练问题的 “双核心” 之一。

1.工作过程

  • 对输入图像进行预处理
  • 对每一个特征图进行归一化处理之后再输入下一个卷积层

2.主要作用


减轻内部协变量偏移:通过标准化每一层的输入,使得其均值接近0,方差接近1,从而减少了层间输入的变化,帮助模型更快地收敛。
提高训练速度:批次归一化能够使得更大的学习率得以使用,从而加速训练。
缓解梯度消失:通过规范化输入,有助于保持激活值的稳定性,从而在一定程度上减轻了梯度消失现象。
具有正则化效果:批次归一化可以在某种程度上减少对其他正则化技术(如Dropout)的依赖,因为它引入了一定的噪声。
提高模型泛化能力:通过使训练过程更加稳定,批次归一化有助于提高模型在未见数据上的表现。

五、ResNet 对传统神经网络痛点的突破性解决

在 ResNet 出现之前,传统深层卷积神经网络(如 VGGNet-19、GoogleNet)面临两大核心痛点:梯度消失 / 爆炸退化问题。ResNet 通过残差结构和 BN 的组合,从根本上解决了这些问题。

1. 解决梯度消失与梯度爆炸问题

梯度消失和梯度爆炸是深层网络反向传播过程中的经典问题,其本质是 “梯度在多层传递中被不断放大或缩小”。

(1)梯度消失
  • 问题表现:反向传播时,梯度通过链式法则逐层传递,若每一层的梯度绝对值小于 1(如激活函数为 Sigmoid 时,导数最大值仅 0.25),经过数十层传递后,梯度会趋近于 0,导致浅层权重几乎无法更新,模型训练停滞。
  • ResNet 的解决方案
    • 残差结构的跳跃连接:残差块的输出为 ,反向传播时,梯度其中 “1” 直接来自跳跃连接,确保梯度至少为,不会因趋近于 0 而消失。
    • BN 的稳定作用:BN 通过标准化输入,避免激活函数进入梯度趋近于 0 的区域(如 ReLU 的死亡区、Sigmoid 的饱和区),进一步保证梯度的有效传递。
(2)梯度爆炸
  • 问题表现:若每一层的梯度绝对值大于 1,经过多层传递后,梯度会呈指数级增长,导致权重更新过大,模型损失函数发散,甚至出现数值溢出(如权重变为 NaN)。
  • ResNet 的解决方案
    • BN 的梯度缩放:BN 的标准化操作会将输入特征的方差控制在 1 附近,间接限制了梯度的量级,避免梯度在传递过程中过度放大。
    • 残差结构的梯度分流:残差块中的卷积层多采用 3×3 小卷积核,且瓶颈块通过 1×1 卷积降维,减少了参数数量和计算量,间接降低了梯度的波动范围,避免梯度爆炸

2. 解决深层网络的退化问题

退化问题是 ResNet 要解决的核心痛点,也是区别于 “梯度问题” 的全新挑战。

(1)退化问题的定义

当网络深度增加到一定程度后,模型在训练集上的误差会随着深度增加而上升(而非下降),同时测试集误差也随之上升 —— 这并非过拟合(过拟合是训练集误差下降、测试集误差上升),而是模型 “能力退化”,无法有效利用深层结构提取特征。

例如,在 ImageNet 数据集上,传统 56 层网络的训练误差(约 10%)反而高于 20 层网络(约 8%),说明深层网络不仅没有带来性能提升,反而出现了 “越学越差” 的情况。

(2)ResNet 的解决方案:残差结构

退化问题的本质是 “深层网络难以学习恒等映射”—— 当浅层网络已能提取足够特征时,深层网络需要学习 “输入等于输出” 的恒等映射,但传统网络的直接映射学习难度极高,导致权重更新方向偏离最优解,性能退化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95586.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python面试题及详细答案150道(116-125) -- 性能优化与调试篇

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 116. 如何查找Python程序的…

C++11 智能指针的使⽤及其原理

目录 1. 智能指针的使⽤场景分析 2. RAII和智能指针的设计思路 3. C标准库智能指针的使⽤ 4. 智能指针的原理 5. shared_ptr和weak_ptr 5.1 shared_ptr循环引⽤问题 5.2 weak_ptr 6. shared_ptr的线程安全问题 7. C11和boost中智能指针的关系 8. 内存泄漏 8.1 什么是…

【Linux】Linux进程状态和僵尸进程:一篇看懂“进程在忙啥”

前言:欢迎各位光临本博客,这里小编带你直接手撕Make/Makefile (自动化构建),文章并不复杂,愿诸君耐其心性,忘却杂尘,道有所长!!!! **🔥个人主页&a…

开源视频剪辑工具推荐

开源视频剪辑和处理工具近年来发展非常迅速,许多工具的功能已经足以媲美甚至超越一些商业软件。以下是一些顶级的开源视频编辑和处理工具,涵盖了从简单易用到专业级别的不同需求。 一、 主要视频编辑软件(非线性编辑,NLE&#xf…

第十四届蓝桥杯青少组C++国赛[2023.5.28]第二部分编程题(4、 数独填数)

参考程序&#xff1a;#include <bits/stdc.h> using namespace std;char board[9][9];// 检查在 (r,c) 填 num 是否有效 bool isValid(int r, int c, char num) {for (int i 0; i < 9; i) {if (board[r][i] num) return false; // 同行if (board[i][c] num) r…

C语言中奇技淫巧08-使用alloca/__builtin_alloca从栈上分配空间

alloca是什么? alloca 是一个非标准但广泛支持的 C 语言函数&#xff0c;用于在当前函数的栈&#xff08;stack&#xff09;上动态分配内存。 与 malloc 的区别&#xff1a; malloc 在堆&#xff08;heap&#xff09; 上分配内存&#xff0c;需要手动调用 free 释放。alloca 在…

【Markdown转Word完整教程】从原理到实现

Markdown转Word完整教程&#xff1a;从原理到实现 前言 在技术文档编写和学术论文创作中&#xff0c;Markdown因其简洁的语法和良好的可读性而广受欢迎。然而&#xff0c;在实际工作中&#xff0c;我们经常需要将Markdown文档转换为Word格式&#xff0c;以便与同事协作、提交正…

IBM穿孔卡片:现代计算技术的奠基之作

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1 打孔卡概述 穿孔卡片&#xff08;Punch Card&#xff09;又称打孔卡…

亚马逊旺季来临如何用woot冲刺

在亚马逊旺季来临之际&#xff0c;使用Woot冲刺需结合新品推广、老品激活、库存清理等不同场景&#xff0c;通过精准选品、活动设置、广告配合及数据监控实现销量与排名的双重提升。以下是具体操作指南&#xff1a;一、精准选品&#xff1a;匹配提报条件新品期选品标准&#xf…

AlexNet:计算机视觉的革命性之作

AlexNet: Revolutionizing Deep Learning for Computer Vision (1)网络提出的背景 论文题目:ImageNet Classification with Deep Convolutional Neural Networks arXiv地址:https://arxiv.org/abs/1207.0575 在2012年ImageNet大规模视觉识别挑战赛(ILSVRC)中,AlexNet以15…

【高等数学】第十一章 曲线积分与曲面积分——第二节 对坐标的曲线积分

上一节&#xff1a;【高等数学】第十一章 曲线积分与曲面积分——第一节 对弧长的曲线积分 总目录&#xff1a;【高等数学】 目录 文章目录1. 对坐标的曲线积分的概念与性质1. 对坐标的曲线积分的概念与性质 变力沿曲线所作的功 先用曲线 LLL 上的点 M1(x1,y1),M2(x2,y2),…,M…

解析SQL Server核心服务与功能

SQL Server 安装后会在 Windows 系统中注册多个服务&#xff0c;每种服务负责不同的功能。主要服务类型包括&#xff1a; &#x1f4cc; 核心服务 (必须或常用)SQL Server Database Engine (数据库引擎服务) 服务名称格式&#xff1a; MSSQL$<InstanceName> (命名实例) 或…

专项智能练习(计算机动画基础)

1.小明在制作Flash作品时&#xff0c;舞台及库中素材如第下图所示&#xff0c;把“马”元件插入到“马”图层第1帧并放在舞台的草地位置&#xff0c;发现舞台中并无马图像显示&#xff0c;下列情形中最有可能的是&#xff08; &#xff09;。A.“马”图层已被锁定 B.“马”图层…

第三方库集成:结合 Express.js 构建本地服务器

引言&#xff1a;Express.js 在 Electron 第三方库集成中的本地服务器构建价值 在 Electron 框架的第三方库集成生态中&#xff0c;Express.js 作为 Node.js 的经典 Web 框架&#xff0c;扮演着构建本地服务器的关键角色。它不仅仅是一个路由和中间件工具&#xff0c;更是 Elec…

百度地图+vue+flask+爬虫 推荐算法旅游大数据可视化系统Echarts mysql数据库 带沙箱支付+图像识别技术

F012 百度地图vueflask爬虫 推荐算法旅游大数据可视化系统Echarts mysql数据库 带沙箱支付图像识别技术 &#x1f4da;编号&#xff1a; F012 文章结尾部分有CSDN官方提供的学长 联系方式名片 博主开发经验15年,全栈工程师&#xff0c;专业搞定大模型、知识图谱、算法和可视化…

# 开发中使用——鸿蒙CoreSpeechKit让文字发声后续

开发中使用——鸿蒙CoreSpeechKit让文字发声后续 设置音量大小 volume// 设置播报相关参数this.extraParam {"queueMode": 0, "speed": AppModel.speed, "volume": AppModel.volume, "pitch": 1, "languageContext": zh-CN,…

Java全栈开发面试实录:从基础到微服务的深度探索

Java全栈开发面试实录&#xff1a;从基础到微服务的深度探索 面试官与应聘者的初次见面 面试官&#xff1a;你好&#xff0c;很高兴见到你。请先做个自我介绍吧。 应聘者&#xff1a;您好&#xff0c;我叫李明&#xff0c;今年28岁&#xff0c;是南京大学计算机科学与技术专业的…

前端路由切换不再白屏:React/Vue 实战优化全攻略(含可运行 Demo)

摘要 在单页应用&#xff08;SPA&#xff09;开发中&#xff0c;React、Vue、Angular 这些主流框架都依赖前端路由来完成页面切换。好处是显而易见的&#xff1a;首屏资源一次加载&#xff0c;后续页面切换靠前端路由完成&#xff0c;体验比传统的多页应用要顺畅很多。 但是在实…

C#之LINQ

文章目录前言LINQ一、LINQ1一、LINQ2一、LINQ3Where方法&#xff1a;每一项数据都会进过predicate的测试&#xff0c;如果针对一个元素&#xff0c;predicate执行的返回值为true&#xff0c;那么这个元素就会放到返回值中。获取一条数据&#xff08;是否带参数的两种写法&#…

第 2 讲:Kafka Topic 与 Partition 基础

课程概述 在第一篇课程中&#xff0c;我们了解了 Kafka 的基本概念和简单的 Producer/Consumer 实现。 本篇课程将深入探讨 Kafka 的核心机制&#xff1a;Topic 和 Partition。 学习目标 通过本课程&#xff0c;您将掌握&#xff1a; Topic 和 Partition 的设计原理&#x…