【深入探讨 ResNet:解决深度神经网络训练问题的革命性架构】

深入探讨 ResNet:解决深度神经网络训练问题的革命性架构

随着深度学习的快速发展,卷积神经网络(CNN)已经成为图像识别、目标检测等计算机视觉任务的主力军。然而,随着网络层数的增加,训练深层网络变得愈加困难,主要问题是“梯度消失”和“梯度爆炸”问题。幸运的是,ResNet(Residual Networks)通过引入“残差学习”概念,成功地解决了这些问题,极大地推动了深度学习的发展。

本文将详细介绍ResNet的架构原理、优势,并通过一个小例子帮助大家更好地理解如何使用ResNet进行图像分类。


什么是ResNet?

ResNet(Residual Networks)是由微软研究院的何凯明等人于2015年提出的神经网络架构。在深度神经网络中,随着层数的增加,网络的表现反而开始退化,这种现象被称为“退化问题”。为了缓解这个问题,ResNet引入了“残差块”(Residual Block)的概念。通过在网络中加入跳跃连接(skip connections),ResNet使得信息可以绕过一些层,直接传递到更深层,从而避免了梯度消失和梯度爆炸的问题。

在传统的神经网络中,每一层的输出是当前输入的变换。而在ResNet中,跳跃连接使得每一层的输出是输入和变换的加和(即残差)。这使得训练深层网络变得更加容易,同时也提升了网络的表现。

ResNet的核心思想:残差学习

ResNet的核心思想是通过引入残差学习来解决深度神经网络的训练困难。在ResNet中,每个基本单元(即残差块)都由两部分组成:

  1. 标准卷积层:将输入进行特征提取。
  2. 跳跃连接:将输入直接加到输出上,这样即使某一层的学习变得困难,网络仍然能通过残差连接传递信息。

公式上,传统的网络输出为:
y = F ( x , { W i } ) y = F(x, \{W_i\}) y=F(x,{Wi})
其中,(x)是输入,(F(x, {W_i}))是网络的变换,({W_i})是权重。ResNet的输出变为:
y = F ( x , { W i } ) + x y = F(x, \{W_i\}) + x y=F(x,{Wi})+x
也就是说,ResNet通过将输入(x)直接加到变换(F(x, {W_i}))中,形成了一个残差。这使得网络能更容易地训练,并且在更深的层数上表现得更好。

ResNet架构

ResNet的架构通常由多个残差块(Residual Block)堆叠而成,每个残差块内部包括两个卷积层和一个跳跃连接。在ResNet中,最常用的网络有:

  • ResNet-18:18层的ResNet网络。
  • ResNet-34:34层的ResNet网络。
  • ResNet-50:50层的ResNet网络。
  • ResNet-101:101层的ResNet网络。
  • ResNet-152:152层的ResNet网络。

较深的网络如ResNet-50、ResNet-101和ResNet-152主要使用了“瓶颈结构”(Bottleneck Structure),它通过1x1卷积来减少计算量,同时保持模型的深度。

ResNet的优势

  1. 解决了退化问题:随着网络层数的增加,传统CNN容易出现退化问题,导致训练误差上升。ResNet通过引入跳跃连接和残差块有效解决了这一问题,使得网络能够训练得更深。

  2. 易于训练:ResNet的跳跃连接帮助梯度流动更为顺畅,减少了梯度消失和梯度爆炸的问题。因此,即使是非常深的网络也能通过梯度下降法顺利训练。

  3. 提高了性能:ResNet不仅在分类任务上表现出色,还在目标检测、语义分割等多种计算机视觉任务中取得了令人瞩目的成绩。


ResNet架构图

为了更好地理解ResNet的结构,以下是ResNet的残差块和整体架构图:

残差块(Residual Block)

组件描述
残差块基本结构由两个3x3卷积层、批归一化(Batch Normalization)和ReLU激活函数组成。
跳跃连接(Skip Connection)输入直接跳跃到输出端,然后与卷积层的输出相加。这样可以避免梯度消失问题,并加速网络的训练过程。
残差学习网络不直接学习输入到输出的映射,而是学习输入和输出之间的“残差”,即两者的差异。这样可以简化优化过程并提高训练效果。
解决梯度消失问题通过跳跃连接,允许梯度在反向传播时流动更加顺畅,避免在深层网络中出现梯度消失现象。
扩展性残差块的设计使得网络可以很容易扩展到更深的层次,而不会导致性能下降或训练困难。

每个残差块包括两个卷积层,以及一个直接连接输入和输出的跳跃连接。

ResNet-50架构图

层类型输出大小卷积/操作特点
输入层224x224x3-输入图像大小为224x224,3通道(RGB)。
卷积层1112x112x647x7卷积,步幅为2用于初步提取特征,步幅为2,降低图像大小。
最大池化层56x56x643x3最大池化,步幅为2降低空间维度,减少计算量。
残差块1(瓶颈)56x56x2561x1卷积, 3x3卷积, 1x1卷积包含三个卷积层(1x1, 3x3, 1x1),采用瓶颈结构。
残差块2(瓶颈)28x28x5121x1卷积, 3x3卷积, 1x1卷积结构与残差块1相同,但输出通道数更高。
残差块3(瓶颈)14x14x10241x1卷积, 3x3卷积, 1x1卷积输出通道数更高,增加模型的复杂度。
残差块4(瓶颈)7x7x20481x1卷积, 3x3卷积, 1x1卷积最后一个瓶颈残差块,输出通道数最大。
全局平均池化层1x1x2048全局平均池化降维至1x1,减少模型参数。
全连接层1x1x10001000维全连接层输出1000类的分类结果(ImageNet)。
Softmax激活1x1x1000Softmax用于多类别分类。

ResNet-50由多个残差块堆叠而成,形成深度为50的网络结构。

一个小例子:使用ResNet进行图像分类

为了展示ResNet在实际中的应用,下面是一个简单的例子,说明如何使用ResNet进行图像分类任务。

假设我们有一个包含猫和狗的图像数据集,我们希望使用ResNet-50来分类这些图像。

代码示例:

import tensorflow as tf
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import layers, models# 加载ResNet50预训练模型(包括ImageNet权重)
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))# 冻结ResNet50的卷积层
for layer in base_model.layers:layer.trainable = False# 定义模型架构
model = models.Sequential([base_model,layers.GlobalAveragePooling2D(),layers.Dense(256, activation='relu'),layers.Dense(1, activation='sigmoid')  # 使用sigmoid激活函数进行二分类
])# 编译模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])# 加载训练数据
train_datagen = ImageDataGenerator(rescale=1./255, horizontal_flip=True, rotation_range=40)
train_generator = train_datagen.flow_from_directory('path_to_train_data', target_size=(224, 224), batch_size=32, class_mode='binary')# 训练模型
model.fit(train_generator, epochs=10, steps_per_epoch=100)

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

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

相关文章

【前端】 react项目使用bootstrap、useRef和useState之间的区别和应用

一、场景描述 我想写一个轮播图的程序,只是把bootstrap里面的轮播图拉过来就用上感觉不是很合适,然后我就想自己写自动轮播,因此,这篇文章里面只是自动轮播的部分,没有按键跟自动轮播的衔接部分。 Ps: 本文用的是函数…

CentOS 7操作系统部署KVM软件和创建虚拟机

CentOS 7.9操作系统部署KVM软件和配置指南,包括如何创建一个虚拟机。 步骤 1: 检查硬件支持 首先,确认您的CPU支持虚拟化技术,并且已在BIOS中启用: egrep -c (vmx|svm) /proc/cpuinfo 如果输出大于0,则表示支持虚拟…

RocketMQ与kafka如何解决消息丢失问题?

0 前言 消息丢失基本是分布式MQ中需要解决问题,消息丢失时保证数据可靠性的范畴。如何保证消息不丢失程序员面试中几乎不可避免的问题。本文主要说明RocketMQ和Kafka在解决消息丢失问题时,在生产者、Broker和消费者之间如何解决消息丢失问题。 1.Rocket…

APP端网络测试与弱网模拟!

当前APP网络环境比较复杂,网络制式有2G、3G、4G网络,还有越来越多的公共Wi-Fi。不同的网络环境和网络制式的差异,都会对用户使用app造成一定影响。另外,当前app使用场景多变,如进地铁、上公交、进电梯等,使…

deepseek-r1 训练流程

deepseek-r1 训练流程 技术创新deepseek-v3 && deepseek-r1deepseek-r1-zero训练过程aha moment准确度提升思考时间增加 deepseek-r1冷启动推理场景强化学习数据采样&&SFT全场景强化学习结果 参考文献 技术创新 极致的成本控制,媲美openAI的性能&a…

网络工程师 (35)以太网通道

一、概念与原理 以太网通道,也称为以太端口捆绑、端口聚集或以太链路聚集,是一种将多个物理以太网端口组合成一个逻辑通道的技术。这一技术使得多个端口能够并行工作,共同承担数据传输任务,从而提高了网络的传输能力和可靠性。 二…

win11电脑其他WiFi可以连,只有一个WiFi连不上

这个问题卡了一小会,查了一些资料 后面发现 点击“诊断网络问题” 显示没有响应 第一步 重启wlan网络适配器 解决!!! 重新连接那个有问题的wifi,丝滑连接!

【网络通信】传输层之UDP协议

【网络通信】传输层之UDP协议 传输层端对端通信实现端到端通信的关键技术 UDP协议再谈端口号端口号划分关于端口号的两个问题 UDP协议基本格式UDP通信的特点UDP的缓冲区UDP数据报的最大长度基于UDP的应用层协议如何封装UDP报文以及如何交付UDP报文进一步理解封装和解包 传输层 …

时间盲注、boolen盲注

获取当前数据库名 获取数据库表 获取表的列

2025_2_13 二叉搜索树(一)

1.完全二叉树和满二叉树的概念 满二叉树:每一层都达到最大值 完全二叉树:只能右下角空,其他位置满,即最后一排从左到右的中间不能由缺 2.二叉搜索树 左子树中所有结点的 key 值都比根结点的 key 值小,并且左子树也…

DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?

随着人工智能技术的飞速发展,大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世,为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲!!! 目录 一、…

高速差分总线比较--RS422, LVDS,PECL

1. RS422A, 如RS422 & RS485总先, 0/5V的差分电平,匹配电阻120ohm. S2D, Transmitter D2S, Receiver LVDS 如SN65LVDS1,驱动器:DS90LV031(支持预加重),接收器&…

idea 错误: 找不到或无法加载主类 @C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448

idea 错误: 找不到或无法加载主类 C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448 该错误往往和左下角爱弹出的如下提示是一个意思 Error running ‘PayV3Test1.testTransferBatchesBatchId’ Error running PayV3Test1.testTransferBatchesBatchId. Command lin…

Java中如何高效地合并多个对象的List数据:方法与案例解析!

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互…

23、深度学习-自学之路-激活函数relu、tanh、sigmoid、softmax函数的正向传播和反向梯度。

在使用这个非线性激活函数的时候,其实我们重点还是学习的是他们的正向怎么传播,以及反向怎么传递的。 如下图所示: 第一:relu函数的正向传播函数是:当输入值(隐藏层)值大于了,就输出…

React源码揭秘 | scheduler 并发更新原理

React 18增加了并发更新特性,开发者可以通过useTransition等hooks延迟执行优先级较低的更新任务,以达到页面平滑切换,不阻塞用户时间的目的。其实现正是依靠scheduler库。 scheduler是一个依赖时间片分片的任务调度器,React团队将…

腿足机器人之二- 运动控制概览

腿足机器人之二运动控制概览 高层运动规划MPCRL 中层逆运动学和逆动力学底层执行器控制传感器校正 上一篇博客是腿足机器人的骨架和关节的机械和电气组件,关节不仅需要通过机械设计实现复杂的运动能力,还必须通过电子组件和控制系统来精确控制这些运动。…

企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略

一、前言 在企业生产环境,k8s高可用是一个必不可少的特性,其中最通用的场景就是如何在 k8s 集群宕机一个节点的情况下保障服务依旧可用。部署高可用k8s集群对于企业级云平台来说是一个根本性的原则,容错、服务可用和数据安全是高可用基础设施的关键。本文是在青云上利用青云…

软件项目估算偏差的5 大源头及解决方案

软件项目成本估算偏差往往导致资金紧张,资源投入受限,进度延误无法按时交付,为控制成本还可能牺牲质量,引发团队士气低落、客户不满,严重时项目直接失败 。 因此,及时解决或降低项目偏差就非常重要&#xf…

树莓派学习

树莓派4B 基础操作 开机 开机要主要先接好线再通电 关机 先在系统里面关机再断电 可以在界面里面点击关机,或者使用命令行 使用网线连接到树莓派 用笔记本的以太网口接线到树莓派 在网络连接里面打开WLAN的网络共享,共享选择以太网口 在cmd里面输…