活动介绍

常见残差架构及相关技术解析

立即解锁
发布时间: 2025-08-31 00:05:15 阅读量: 10 订阅数: 16 AIGC
# 常见残差架构及相关技术解析 ## 1. 常见残差架构概述 残差连接如今已成为深度学习流程中的标准组成部分。下面介绍一些融入了残差连接的知名架构。 ### 1.1 ResNet 残差块最初用于图像分类的卷积网络,由此产生的网络被称为残差网络,简称 ResNet。在 ResNet 中,每个残差块包含批量归一化操作、ReLU 激活函数和卷积层。该序列会重复一次,然后再将结果加回到输入中。这种操作顺序在图像分类任务中表现良好。 对于非常深的网络,参数数量可能会变得过大。瓶颈残差块通过三个卷积操作更有效地利用参数。第一个卷积使用 1×1 内核来减少通道数,第二个是常规的 3×3 内核,第三个 1×1 内核将通道数增加回原始数量。这样可以使用更少的参数整合 3×3 像素区域的信息。 ResNet - 200 模型包含 200 层,用于 ImageNet 数据库的图像分类。其架构类似于 AlexNet 和 VGG,但使用瓶颈残差块而非普通卷积层。和 AlexNet 与 VGG 一样,在网络中会周期性地降低空间分辨率并同时增加通道数。相邻的 ResNet 块之间通过步长为 2 的卷积降低分辨率,通过追加零或应用额外的 1×1 卷积来增加通道数。网络开始是一个 7×7 卷积层,接着是下采样操作。最后,全连接层将块映射到长度为 1000 的向量,再通过 softmax 层生成类别概率。 ResNet - 200 模型在正确类别位于前 5 名的错误率为 4.8%,正确识别类别为 20.1%,优于 AlexNet(16.4%,38.1%)和 VGG(6.8%,23.7%),是最早超越人类表现(前 5 名猜测错误率为 5.1%)的网络之一。不过,该模型于 2016 年提出,目前已非最先进水平。 ### 1.2 DenseNet 残差块接收前一层的输出,经过一些网络层处理后再加回到原始输入。另一种方法是将处理后的信号与原始信号拼接,这会增加表示大小,但后续可通过可选的线性变换(如卷积网络中的 1×1 卷积)将其映射回原始大小。 DenseNet 架构使用拼接方式,使得一层的输入由所有前一层的输出拼接而成。这些输入经过处理生成新的表示,再与之前的表示拼接后传递到下一层。这种拼接方式意味着早期层对输出有直接贡献,使损失表面表现更合理。 但在实际中,由于通道数(以及处理它们所需的参数数量)会迅速增加,这种方式只能维持几层。可以在应用下一个 3×3 卷积之前应用 1×1 卷积来减少通道数。在卷积网络中,输入会周期性地下采样,此时拼接操作会因表示的空间大小不同而中断,可应用另一个瓶颈 1×1 卷积来控制表示大小。 DenseNet 在图像分类任务中与 ResNet 模型表现相当,在参数数量相近的情况下甚至可能表现更好,可能是因为它能更灵活地重用早期层的处理结果。 ### 1.3 U - Nets 和沙漏网络 语义分割网络具有编码器 - 解码器或沙漏结构。编码器反复下采样图像,直到感受野变大并整合图像信息,然后解码器将其重新上采样回原始图像大小,最终输出每个像素属于可能对象类别的概率。 U - Net 是一种编码器 - 解码器架构,将早期表示与后期表示拼接。原始实现使用“有效”卷积,每次应用 3×3 卷积层时空间大小会减少,因此上采样后的版本比编码器中的对应部分小,需要裁剪后再拼接。后续实现使用零填充,无需裁剪。U - Net 是完全卷积的,训练后可处理任意大小的图像。 U - Net 最初用于医学图像分割,在计算机图形和视觉领域也有很多其他用途。沙漏网络类似,但在跳跃连接中应用更多卷积层,并将结果加回到解码器而非拼接。一系列这样的模型形成堆叠沙漏网络,用于姿态估计,系统会为每个关节预测一个“热图”,估计位置为每个热图的最大值。 ## 2. 残差连接网络表现出色的原因 残差网络允许训练更深的网络,例如可以将 ResNet 架构扩展到 1000 层并有效训练。最初人们认为图像分类性能的提升归因于网络深度的增加,但有两个证据反驳了这一观点。 首先,较浅、较宽的残差网络有时在参数数量相近的情况下优于较深、较窄的网络。其次,有证据表明训练期间的梯度在展开网络的长路径中无法有效传播,深度网络可能更像浅层网络的组合。 目前的观点是,残差连接本身有其价值,同时允许训练更深的网络。残差网络在最小值附近的损失表面往往比去除跳跃连接的相同网络更平滑、更可预测,这可能使学习到的解决方案更容易泛化。 ## 3. 总结 无限增加网络深度会导致图像分类的训练和测试性能下降,可能是因为网络早期参数的损失梯度相对于更新步长变化迅速且不可预测。残差连接将处理后的表示加回到自身输入,使每层直接和间接对输出有贡献,无需通过多层传播梯度,损失表面更平滑。 残差网络不会遭受梯度消失问题,但在正向传播过程中会导致激活方差呈指数增加,以及相应的梯度爆炸问题。通常通过添加批量归一化来解决,它可以补偿批次的经验均值和方差,然后使用学习参数进行偏移和缩放。如果这些参数初始化得当,可以训练非常深的网络。有证据表明残差连接和批量归一化都使损失表面更平滑,允许使用更大的学习率,并且批量统计的可变性增加了正则化来源。 残差块已融入卷积网络,允许训练更深的网络并提高图像分类性能。残差网络的变体包括 DenseNet 架构(将所有前一层的输出拼接以输入当前层)和 U - Net(将残差连接融入编码器 - 解码器模型)。 ### 3.1 残差连接相关架构对比 | 架构名称 | 特点 | 应用场景 | | ---- | ---- | ---- | | ResNet | 使用残差块,可处理深度网络参数过多问题,有标准和瓶颈残差块 | 图像分类 | | DenseNet | 拼接所有前一层输出作为当前层输入,可灵活重用早期层处理结果 | 图像分类 | | U - Net | 编码器 - 解码器架构,使用残差连接,可处理任意大小图像 | 医学图像分割、姿态估计等 | ### 3.2 残差网络工作流程 mermaid 图 ```mermaid graph LR A[输入图像] --> B[卷积层] B --> C[批量归一化] C --> D[ReLU 激活] D --> E[卷积层] E --> F[批量归一化] F --> G[ReLU 激活] G --> H[与输入相加] H --> I[后续处理] ``` ## 4. 残差网络的其他相关内容 ### 4.1 相关架构 - **高速公路网络**:残差连接是高速公路网络的特殊情况,高速公路网络也将计算分为两个分支并相加组合,但使用门控函数根据数据本身对两个分支的输入进行加权,而残差网络则直接将数据传递到两个分支。 - **ResNeXt 架构**:在多个并行卷积分支周围放置残差连接。 ### 4.2 残差网络作为集成模型 Veit 等人将残差网络描述为较短网络的集成,并提出“展开网络”的解释。他们通过删除训练网络中的层(即部分路径),发现对性能影响不大,而在纯顺序网络(如 VGG)中删除一层则是灾难性的。他们还观察到不同长度路径上的梯度大小,发现较长路径上的梯度会消失。在由 54 个块组成的残差网络中,训练期间几乎所有的梯度更新都来自长度为 5 到 17 个块的路径,尽管这些路径仅占总路径的 0.45%。这表明添加更多块实际上是增加了更多并行的较短路径,而不是创建真正更深的网络。 ### 4.3 残差网络的正则化方法 - **L2 正则化**:在普通网络和无批量归一化的残差网络中,L2 正则化对权重的影响不同。在普通网络中,它鼓励层的输出是由偏置决定的常数函数;在残差网络中,它鼓励残差块计算恒等函数加上由偏置决定的常数。 - **随机丢弃方法**:ResDrop、随机深度(stochastic depth)和 RandomDrop 都通过在训练过程中随机丢弃残差块来正则化残差网络。在 RandomDrop 中,丢弃块的倾向由伯努利变量决定,其参数在训练过程中线性减小。测试时,残差块以预期概率恢复。这些方
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

张_伟_杰

人工智能专家
人工智能和大数据领域有超过10年的工作经验,拥有深厚的技术功底,曾先后就职于多家知名科技公司。职业生涯中,曾担任人工智能工程师和数据科学家,负责开发和优化各种人工智能和大数据应用。在人工智能算法和技术,包括机器学习、深度学习、自然语言处理等领域有一定的研究
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

Rust应用中的日志记录与调试

### Rust 应用中的日志记录与调试 在 Rust 应用开发中,日志记录和调试是非常重要的环节。日志记录可以帮助我们了解应用的运行状态,而调试则能帮助我们找出代码中的问题。本文将介绍如何使用 `tracing` 库进行日志记录,以及如何使用调试器调试 Rust 应用。 #### 1. 引入 tracing 库 在 Rust 应用中,`tracing` 库引入了三个主要概念来解决在大型异步应用中进行日志记录时面临的挑战: - **Spans**:表示一个时间段,有开始和结束。通常是请求的开始和 HTTP 响应的发送。可以手动创建跨度,也可以使用 `warp` 中的默认内置行为。还可以嵌套

Rust模块系统与JSON解析:提升代码组织与性能

### Rust 模块系统与 JSON 解析:提升代码组织与性能 #### 1. Rust 模块系统基础 在 Rust 编程中,模块系统是组织代码的重要工具。使用 `mod` 关键字可以将代码分隔成具有特定用途的逻辑模块。有两种方式来定义模块: - `mod your_mod_name { contents; }`:将模块内容写在同一个文件中。 - `mod your_mod_name;`:将模块内容写在 `your_mod_name.rs` 文件里。 若要在模块间使用某些项,必须使用 `pub` 关键字将其设为公共项。模块可以无限嵌套,访问模块内的项可使用相对路径和绝对路径。相对路径相对

Rust开发实战:从命令行到Web应用

# Rust开发实战:从命令行到Web应用 ## 1. Rust在Android开发中的应用 ### 1.1 Fuzz配置与示例 Fuzz配置可用于在模糊测试基础设施上运行目标,其属性与cc_fuzz的fuzz_config相同。以下是一个简单的fuzzer示例: ```rust fuzz_config: { fuzz_on_haiku_device: true, fuzz_on_haiku_host: false, } fuzz_target!(|data: &[u8]| { if data.len() == 4 { panic!("panic s

Rust项目构建与部署全解析

### Rust 项目构建与部署全解析 #### 1. 使用环境变量中的 API 密钥 在代码中,我们可以从 `.env` 文件里读取 API 密钥并运用到函数里。以下是 `check_profanity` 函数的代码示例: ```rust use std::env; … #[instrument] pub async fn check_profanity(content: String) -> Result<String, handle_errors::Error> { // We are already checking if the ENV VARIABLE is set

Rust编程:模块与路径的使用指南

### Rust编程:模块与路径的使用指南 #### 1. Rust代码中的特殊元素 在Rust编程里,有一些特殊的工具和概念。比如Bindgen,它能为C和C++代码生成Rust绑定。构建脚本则允许开发者编写在编译时运行的Rust代码。`include!` 能在编译时将文本文件插入到Rust源代码文件中,并将其解释为Rust代码。 同时,并非所有的 `extern "C"` 函数都需要 `#[no_mangle]`。重新借用可以让我们把原始指针当作标准的Rust引用。`.offset_from` 可以获取两个指针之间的字节差。`std::slice::from_raw_parts` 能从

React应用性能优化与测试指南

### React 应用性能优化与测试指南 #### 应用性能优化 在开发 React 应用时,优化性能是提升用户体验的关键。以下是一些有效的性能优化方法: ##### Webpack 配置优化 通过合理的 Webpack 配置,可以得到优化后的打包文件。示例配置如下: ```javascript { // 其他配置... plugins: [ new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify('production') } }) ],

iOS开发中的面部识别与机器学习应用

### iOS开发中的面部识别与机器学习应用 #### 1. 面部识别技术概述 随着科技的发展,如今许多专业摄影师甚至会使用iPhone的相机进行拍摄,而iPad的所有当前型号也都配备了相机。在这样的背景下,了解如何在iOS设备中使用相机以及相关的图像处理技术变得尤为重要,其中面部识别技术就是一个很有价值的应用。 苹果提供了许多框架,Vision框架就是其中之一,它可以识别图片中的物体,如人脸。面部识别技术不仅可以识别图片中人脸的数量,还能在人脸周围绘制矩形,精确显示人脸在图片中的位置。虽然面部识别并非完美,但它足以让应用增加额外的功能,且开发者无需编写大量额外的代码。 #### 2.

Rust数据处理:HashMaps、迭代器与高阶函数的高效运用

### Rust 数据处理:HashMaps、迭代器与高阶函数的高效运用 在 Rust 编程中,文本数据管理、键值存储、迭代器以及高阶函数的使用是构建高效、安全和可维护程序的关键部分。下面将详细介绍 Rust 中这些重要概念的使用方法和优势。 #### 1. Rust 文本数据管理 Rust 的 `String` 和 `&str` 类型在管理文本数据时,紧密围绕语言对安全性、性能和潜在错误显式处理的强调。转换、切片、迭代和格式化等机制,使开发者能高效处理文本,同时充分考虑操作的内存和计算特性。这种方式强化了核心编程原则,为开发者提供了准确且可预测地处理文本数据的工具。 #### 2. 使

并发编程中的锁与条件变量优化

# 并发编程中的锁与条件变量优化 ## 1. 条件变量优化 ### 1.1 避免虚假唤醒 在使用条件变量时,虚假唤醒是一个可能影响性能的问题。每次线程被唤醒时,它会尝试锁定互斥锁,这可能与其他线程竞争,对性能产生较大影响。虽然底层的 `wait()` 操作很少会虚假唤醒,但我们实现的条件变量中,`notify_one()` 可能会导致多个线程停止等待。 例如,当一个线程即将进入睡眠状态,刚加载了计数器值但还未入睡时,调用 `notify_one()` 会阻止该线程入睡,同时还会唤醒另一个线程,这两个线程会竞争锁定互斥锁,浪费处理器时间。 解决这个问题的一种相对简单的方法是跟踪允许唤醒的线

AWS无服务器服务深度解析与实操指南

### AWS 无服务器服务深度解析与实操指南 在当今的云计算领域,AWS(Amazon Web Services)提供了一系列强大的无服务器服务,如 AWS Lambda、AWS Step Functions 和 AWS Elastic Load Balancer,这些服务极大地简化了应用程序的开发和部署过程。下面将详细介绍这些服务的特点、优缺点以及实际操作步骤。 #### 1. AWS Lambda 函数 ##### 1.1 无状态执行特性 AWS Lambda 函数设计为无状态的,每次调用都是独立的。这种架构从一个全新的状态开始执行每个函数,有助于提高可扩展性和可靠性。 #####