残差网络

news/2024/12/26 20:40:40/文章来源:https://www.cnblogs.com/LuKemi3/p/18634150

1. 什么是残差网络?

残差网络(ResNet)是一种特别的神经网络结构,它解决了一个非常重要的问题:当我们把网络变得越来越深时,性能不升反降的问题

打个比方:
你让一个学生做很简单的数学题,他可能做得很好;但你让他做一百道题,他可能会累到答错很多,结果总分变低。这种情况在深度学习里就叫梯度消失或梯度爆炸,网络太深了,信息没法有效传递。

残差网络的设计目标就是:让深层网络“轻松”学会该学的东西,避免因为“网络太深”导致性能下降。


2. 核心概念:残差连接(Skip Connection)

残差网络最重要的点就是加入了残差连接。简单来说:

  • 它让网络直接跳过一些层,把输入直接加到输出上。
  • 这样网络的每一层只需要学习“输入和输出之间的差距”(差距用英文说就是 residual,也就是“残差”)。

我们用个简单的公式和例子解释:

假设有一个普通的深度学习层: y=F(x)
其中 F(x) 是网络这一层的计算结果,x 是输入。

而在残差网络里,它变成了: y=F(x)+x
也就是说,网络的输出是这一层的计算结果 F(x) 加上输入 x
这条直接把 x 加到输出上的路径就叫残差连接


3. 残差网络怎么帮助深度学习?

举个简单的例子来说明:

情况 1:普通的网络(没有残差连接)

假如你想教一个孩子认识数字“7”,你可能直接说:
“从空白纸上画一个7的样子。”
但对于网络来说,越复杂的任务,它“从零开始学习”的难度就越高。

情况 2:有残差连接的网络

换个思路,你对孩子说:
“先画一个‘7’的轮廓,然后把轮廓修得更精确一点。”
这样他只需要“微调”已有的东西,而不是从头开始。这种方法就像残差网络的思想。

因此,残差连接让网络的每一层只需要做很小的调整,而不需要重新学习所有的东西,这大大降低了深层网络训练的难度。


4. 一个简单的类比

想象你要爬一座很高的山:

  • 普通的网络:需要一步一步爬山,而且不能回头。爬到后面时,可能累得不行,还容易迷路(梯度消失)。
  • 残差网络:给你修了一条“索道”,如果你觉得这一步不好爬,你可以直接坐索道上去。这样,即使你不太会爬山,最起码能到山顶。

这个“索道”就是残差连接,网络会把前面的结果直接传到后面的层,帮助你顺利训练深层网络。


5. 残差网络长什么样?

一个最简单的残差块(Residual Block)的结构大概是这样:

  • 输入经过几层计算(比如卷积、归一化、激活函数),得到 F(x)。
  • 输入 x 直接跳过这些计算,加到 F(x) 上。
  • 输出就是 F(x)+x。

图形化来看,大致是这样的:

输入 (x) → [卷积 + 激活] → F(x) → ↘                   ↗→   残差连接    →

这种结构可以反复堆叠很多层,从而形成一个非常深的网络。


6. 为什么残差网络重要?

  • 解决梯度消失问题
    深度网络很难训练,但残差网络让深层网络也能正常训练,推动了更深更强模型的发展。

  • 性能好
    比如 ResNet 在图像分类任务(如 ImageNet 数据集)上取得了非常好的成绩,后来也被广泛应用到语音识别、自然语言处理等领域。

  • 模块化
    残差块设计简单,易于堆叠和扩展,可以灵活组合到不同类型的模型中。


7. 适合小白的代码示例

一个简单的 PyTorch 实现的残差块可以写成:

import torch
import torch.nn as nnclass ResBlock(nn.Module):def __init__(self, in_channels, out_channels):super().__init__()self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)self.relu = nn.ReLU()self.shortcut = nn.Conv2d(in_channels, out_channels, kernel_size=1) if in_channels != out_channels else nn.Identity()def forward(self, x):shortcut = self.shortcut(x)  # 残差连接x = self.conv1(x)x = self.relu(x)x = self.conv2(x)return self.relu(x + shortcut)  # 残差连接相加

使用这个残差块,你可以构建一个简单的网络:

res_block = ResBlock(64, 64)
x = torch.randn(1, 64, 32, 32)  # 输入 1张图片,64通道,32x32大小
output = res_block(x)
print(output.shape)  # 输出仍然是 (1, 64, 32, 32)

总结

  • 残差网络通过引入残差连接,帮助深层网络更快、更容易地学到有效特征。
  • 它的关键就是把“学习差距”的思想用到深度学习中。
  • ResNet 是深度学习里非常重要的一个里程碑,有着广泛的应用。

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

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

相关文章

C# WPF PrintDialog 打印(3)

前面https://www.cnblogs.com/yinyu5/p/18634080使用PrintDocument方法打印了Canvas,这里打印下面的DataGrid列表内容:这里DataGrid的数据源是DataTable,后台代码:1 private void PrintDocument_DataTable_Method(string Title, DataTable dataTable)2 {3 …

【JAVA代码审计】记一次某java类的cms最最最详细的代码审计

前言 刚好遇到一个授权的渗透是通过该cms实现getshell,所以顺便审计一下java类的cms,这个管理系统是一个内容管理系统,下载地址 https://gitee.com/oufu/ofcms/tree/V1.1.3/tomcat下载地址 https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.78/bin/apache-tomcat-8.5.78-wind…

12.26日每日总结

昨天在调试51单片机的串口时,发现芯片手册上有一句话,在使用定时器1产生串口的波特率时,定时器1就不能使能了。不是不能用,是直接不让使能了,使能后会出错,导致发送的数据不稳定。 今天继续研究了触摸滑条,发现滑条输出的值为从小到大,如下图所示的样子,这就导致从最上…

Minio使用教程

Minio MinIO 是一个高性能的对象存储服务器,用于构建云存储解决方案。它使用Golang编写,专为私有云、公有云和混合云环境设计。它是兼容Amazon S3 API的,并可以作为一个独立的存储后端或与其他流行的开源解决方案(如Kubernetes)集成。 MinIO 允许你存储非结构化数据(如图…

人工智能基础导论

人工智能基础导论 绪论 人工智能的主要流派符号主义(逻辑主义) 连接主义(仿生学派) 行为主义(控制论)符号主义:数理逻辑→逻辑演绎系统→启发式算法→专家系统→知识工程理论与技术(主流)缺点:符号主义的核心是知识表示,那么对于像感知、形象思维、模式识别等问题,…

搭建 npm 私服

背景 准备搭建一个自己的网站,放些平时练手的 demo,如果是不同项目,想要保持风格一致,或是要用到一些工具方法,就要在每个项目复制一份,不是很好维护,于是就想要搭建一个自己的 npm 私服 安装 verdaccio 1 安装 verdaccio,这是一个开源的私有 npm 注册中心,要注意的是…

C# WPF PrintDialog 打印(2)

前面https://www.cnblogs.com/yinyu5/p/18633910使用PrintVisual方法只打印了可见部分的元素,所以这里改为使用PrintDocument方法来进行打印。 需要引用System.Printing.dll 界面代码:1 <Window x:Class="WpfApp123.MainWindow"2 xmlns="http://sc…

Redis可视化工具推荐:Another Redis Desktop Manager使用教程与下载

Redis是一种高性能的Key-Value数据库,被广泛应用于缓存、消息队列等场景。尽管Redis的命令行工具功能强大,但对于许多开发者而言,使用一款可视化工具可以大大提高操作效率和用户体验。今天为大家推荐一款功能强大的Redis可视化工具——Another Redis Desktop Manager,并提供…

RISC-V篇-VSCode+qemu+gdb可视化调试Linux Kernel

https://zhuanlan.zhihu.com/p/4185359719本文发布于微信公众号:Linux底层小工,欢迎关注,获取更多原创技术文章! “VSCode+qemu+gdb调试OpenSBI确实很爽,那怎能少了调试kernel呢~~” 01 VScode调试MMU开启之前的kernel 有了调试OpenSBI的基础,再调试kernel,那设置相当简…

中考阅读理解深入逻辑分析-006 A Streams Journey to the Sea 一条小溪通往大海的旅程

文章正文 A little stream ran down from a high mountain far, far away through many villages and forests, until it reached a desert. The stream then thought,“I’ve been through countless difficulties. I should have no problem crossing the desert!”But as sh…

2024-2025-1 20241322 《计算机基础与程序设计》第十四周学习总结

2024-2025-1 20241322 《计算机基础与程序设计》第十四周学习总结 作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标 自学教材《C语言程序设计》…

Chrome 或引入 Gemini AI 功能「Glic」,需访问麦克风;理想同学 App 即将上线支持语音交流、识物

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…