ResNet 模型原理

news2024/12/23 18:24:26

ResNet与Vgg的主要区别:

1.ResNet相较于Vgg具有更加深的网络结构

2.ResNet相较于Vgg引入了残差连接的结构

3.ResNet引入了BatchNorm层,使得ResNet能够训练更加深的网络结构

4.ResNet使用stride=2的卷积层代替了Vgg中池化层进行下采样

5.ResNet相较于Vgg设计的很大的不同点在于ResNet当feature map尺寸下降一半时,卷积层通道数增加一倍

VGG

 

ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得COCO数据集中目标检测第一名,图像分割第一名。

ResNet是在VGG的基础上进行改造。引入了skip connect跳层连接避免了梯度消失,梯度爆炸等现象。

一、Skip Connection是什么?

Skip Connection(跳跃连接),是一种在深度神经网络中连接不同层次之间节点的方法。在传统的神经网络中,信号从输入层传输到输出层,每个隐藏层的输出都需要经过激活函数处理后再传输到下一层,而Skip Connection会将当前层的信号同时向后传输到更深层次的下一层,也就是“跳过”了中间的层次。而这种跨层的连接方式,可以加速信息传输、避免梯度消失,并且保留更多的信息。

二、Skip Connection的优点

对于深度神经网络而言,Skip Connection的优点如下:

1、解决梯度消失问题
随着神经网络层数的增加,梯度消失的问题更加严重,导致深层次的节点很难得到有效的更新,甚至训练过程会完全停滞。而Skip Connection可以保留更多的信息,使得梯度可以通过跨层连接在不同的层次之间传播,从而有效地解决梯度消失问题。

2、加速模型训练
由于Skip Connection允许信号直接传输到更深层次的下一层,而不必经过中间的层次,从而可以缩短神经网络的传输路径,加速信息的传输速度以及整个神经网络的训练速度

3、提高模型的泛化能力
在一些深度神经网络的训练中,由于训练集与测试集的差异,造成了过拟合的现象。通过加入Skip Connection,可以让更多的信息有机会被保留下来,从而增强模型的泛化能力,降低过拟合的风险。

残差网络建立在BN之上,用多项式拟合差值。优点是在解附近权重的反应更加灵敏,能够更容易学习到最优解

ResNet

网络的深度为什么重要?

因为CNN能够提取low/mid/high-level的特征,网络的层数越多,意味着能够提取到不同level的特征越丰富。并且,越深的网络提取的特征越抽象,越具有语义信息。

为什么不能简单地增加网络层数?

对于原来的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸。

对于该问题的解决方法是正则化初始化和中间的正则化层(Batch Normalization),这样的话可以训练几十层的网络。

虽然通过上述方法能够训练了,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。这个不能解释为overfitting,因为overfit应该表现为在训练集上表现更好才对。
退化问题说明了深度网络不能很简单地被很好地优化。
作者通过实验:通过浅层网络+ y=x 等同映射构造深层模型,结果深层模型并没有比浅层网络有等同或更低的错误率,推断退化问题可能是因为深层的网络并不是那么好训练,也就是求解器很难去利用多层网络拟合同等函数。

怎么解决退化问题?

深度残差网络。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。 但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,拟合残差肯定更加容易。

ResNet 模型原理

VGG 网络在特征表示上有极大的优势,但深度网络训练起来非常困难。为了解决这个问题,研究者提出了一系列的训练技巧,如 Dropout、归一化(批量正则化,Batch Normalization)。

2015年,何凯明为了降低网络训练难度,解决梯度消失的问题,提出了残差网络(Residual Network,ResNet)。

图片

图1 梯度消失

ResNet 通过引入跳跃结构(skip connection),让 CNN学习残差映射。残差结构(Bottleneck)如图 2 所示。

图片

图2  残差结构

图2 的残差结构中,输入 x  ,先是 1 x 1 卷积核,64 卷积层,最后是 1 x 1  卷积核,256 卷积层,维度先变小再变大。网络的输出为 H(x),如果没有引入跳跃结构分支, H(x) = F(x),根据链式法则对 x 求导,梯度变得越来越小。引入分支之后,H(x) = F(x) + x,对 x 求导,得到的局部梯度为 1,且当梯度进行反向传播时,梯度也不会消失。

图 3 是 ResNet 的结构,图中展示了 18 层、34 层、50 层、101 层、152 层框架细节,图中 “ x 2” 和 “ x 23 ” 表示该卷积层重复 2 次或 23 次。我们可以发现所有的网络都分成 5 部分,分别是 conv1、conv2_x、conv3_x、conv4_x、conv5_x。

图片

图3  ResNet的结构

图 3 中 conv1 使用的是 7 7 的卷积核。当通道数一致时,卷积参数的计算量是 7 x 7 的卷积核 大于 3 x 3 的卷积核 ;当通道数不一致时,若通道数小,则可以采用大的卷积核。

对于第一个卷积层的通道数为 3 时,3个 3 x 3 卷积核与 1 个 7 x 7 卷积核的感受野效果一样,但 1 个  7 x 7 却比 3 个 3 x 3 的参数多。在 VGG 19 层和 ResNet 34 层里,参数的计算量如图 4 所示,ResNet 34 层采用 1 个 7 x 7 的卷积核的计算量远小于 VGG 19 层采用 3 个 3 x 3 的卷积核。

图片

图4 参数的计算量

图 3 中卷积层 conv2_x 和 conv3_x 的输出(output size)的大小分别为56 x 56 和28 x 28,如果卷积层 conv2_x 采用跳跃结构到 conv3_x,由于特征图的维度不一致,不能直接相加,此时的跳跃结构可采用卷积,以保证特征图的维度一致,特征图可以进行相加操作。

图 3 中最后一行的 FLOPs (floating-point operations) 指的是浮点运算次数,可以衡量框架的复杂度。框架的复杂度与权重和偏差(bias)有关。输入图像的高、宽、通道数分别用 H_in、 W_in、D_in 表示;输出的特征图的高、宽、通道数分别用 H_out、 W_out、D_out 表示;卷积核的宽和高分别用 F_w、F_h表示;N_p表示特征图一个点的计算量,其计算公式如下:

图片

一次卷积的 FLOPs 的计算公式如下:

图片

对于全连接层,输入的特征图会拉伸为1 x N_in 的向量,输出的向量维度为 1 x N_out,则一次全连接层的 FLOPs 计算公式如下:

图片

可以使用工具包 Flops 在 PyTorch 中计算网络的复杂度。

图片

图5 ResNet 34 与 VGG 16 网络的 FLOPs

ResNet 代码复现

ResNet 网络参考了 VGG 19 网络,在其基础上进行了修改,变化主要体现在 ResNet直接使用 stride=2 的卷积做下采样,并且用 Global Average Pool 层替换了全连接层。

ResNet 使用两种残差结构,如下图 5 所示。左图对应的是浅层网络,当输入和输出维度一致时,可以直接将输入加到输出上。右图对应的是深层网络。对于维度不一致时(对应的是维度增加一倍),采用 1 x 1 的卷积,先降维再升维。

图片

图5 残差结构

两种残差结构的代码实现如下,class BasicBlock(nn.Module) 指的是浅层网络 ResNet 18/34 的残差单元:

图片

class BottleNeck(nn.Module)指的是深层网络 ResNet 50/101/152 的残差单元:

图片

ResNet 的整体结构如下:

图片

在 ResNet 类中的 forward( )函数规定了网络数据的流向:

(1)数据进入网络后先经过卷积(conv1),再进行下采样pool(f1);

(2)然后进入中间卷积部分(conv2_x, conv3_x, conv4_x, conv5_x);

(3)最后数据经过一个平均池化(avgpool)和全连接层(fc)输出得到结果;

中间卷积部分主要是下图中的蓝框部分,红框部分中的 [2, 2, 2, 2] 和 [3, 4, 6, 3] 等则代表了 bolck 的重复次数。

图片

ResNet18和其他Res系列网络的差异主要在于 conv2_x ~conv5_x,其他的部件都是相似的。

图片

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

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

相关文章

【在Windows下搭建Tomcat HTTP服务】

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器,不仅名字很有趣&#xff0…

报错:1 字节的 UTF-8 序列的字节 1 无效。

这里我的问题出现在BookMapper.xml中 java.lang.IllegalStateException: Failed to load ApplicationContextat org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)at org.spring…

情人节特别篇:用c++弹奏音乐“海阔天空”与“孤勇者”

W...Y的主页 💕 代码库分享 😊 目录 孤勇者 海阔天空 今天是2023年8月22日七夕情人节,但是对我来说就是再普通不过的日子。我相信有很多人期待这一天的到来,和自己的对象出去享受快乐时光。但是我只有一个人独孤的度过短暂的时…

1.7 【MySQL】常用存储引擎

MySQL 支持非常多种存储引擎,我这先列举一些: 存储引擎 描述 ARCHIVE 用于数据存档(行被插入后不能再修改) BLACKHOLE 丢弃写操作,读操作会返回空内容 CSV 在存储数据时,以逗号分隔各个数据项 FEDE…

自动控制原理笔记-采样控制系统

目录 采样控制系统的基本概念: 采样过程及采样定理: 一、采样过程 二、采样定理(香农采样定理、奈奎斯特采样定律) 三、信号复现 四、零阶保持器 z变换与z反变换: z变换的定义 z变换基本定理 z反变换 采样系…

Oracle 如何给大表添加带有默认值的字段

一、讲故事 你是否遇到过开发人员添加字段,导致数据库锁表问题? 但是令开发疑惑的事,他们添加字段,有的时候很快,有的时候很慢? 为什么呢? 询问得知,**加的慢时候是带上了default默…

提高软件缺陷探测率的5个重点

缺陷对软件项目的影响不言而喻,如果不重视缺陷的探测率和移除率,往往会对软件产品产生不可估量的破坏性影响,直接影响项目进度甚至项目交付。 因此我们需要高效提高软件缺陷探测率,一般来说有以下5个方面需要重点关注:…

Linux--线程地址空间

1.程序地址空间 先来就看这张图 这是一张程序地址分布的图,通过一段代码来证明地址空间的分布情况 编译结果: 可以看出的是,父子进程中对于同一个变量打印的地址是一样的,这是因为子进程以父进程为模板,因为都没有对数…

深度丨Serverless + AIGC,一场围绕加速创新的升维布局

作者:褚杏娟 上图来源于基于函数计算部署 SD实现光影效果 前言: Serverless 在中国发展这些年,经历了高潮、低谷、现在重新回到大众视野。很多企业都非常感兴趣,部分企业开始大规模应用;也有一些企业对在生产环境真正…

VGG的结构:视觉几何组(Visual Geometry Group)

目录 1. VGG 的结构 2. VGG 的网络细节 3. VGG 的代码实现 1. VGG 的结构 牛津大学的视觉几何组(Visual Geometry Group)设计了 VGGNet(也称为 VGG),一种经典的卷积神经网络 (CNN) 架构。在 2014 年 ILSVRC 分类任务中,VGG 取…

回归分析扫盲:为什么非线性模型不能直接用最优子集选择法

最近有人给我发了篇文章: 一个问题有一堆变量,我们要选取哪些变量来建模呢?我们来看看这篇文章是怎么做的: 这个方法简单来说就是:对于这一堆变量,我们每次尝试剔除其中一个变量,然后用剩下的变…

字节流概述,及字节流写数据的三种方式

1.IO流概述和分类 如果数据通过记事本打开,我们还可以读懂里面的内容就使用字符流,否则使用字节流。如果不知道使用哪种类型的流,就使用字节流。 2.字节流写数据 创建字节输出流的时候,一共做了三件事情。 调用系统功能创建了文…

Goland 配置go modules 环境变量

我的配置,仅供参考: GOPROXYhttps://goproxy.cn,direct;GO111MODULEon;GOSUMDBoff;GONOSUMDB*

spring整合mybatis教程(详细易懂)

一、引言 1、Spring整合MyBatis的目的是? 将两个框架结合起来,以实现更好的开发体验和效果。Spring提供了一种轻量级的容器和依赖注入的机制,可以简化应用程序的配置和管理。而MyBatis是一个优秀的持久层框架,可以方便地进行数据…

Mysql join加多条件与where的区别

最近在项目中遇到一个问题,感觉有点意思,在解决问题及查阅了相关资料后,打算写篇文章给朋友们分享一下。 问题现象: 问题是很常见的空指针问题,后端查询数据库数据,遍历进行相关业务处理时报空指针。通过…

stm32单片机实现电机的PID控制

PID控制应该算是非常古老而且应用非常广泛的控制算法了,小到热水壶温度控制,大到控制无人机的飞行姿态和飞行速度等等。在电机控制中,PID算法用得尤为常见。 一、位置式PID 1.计算公式 在电机控制中,我们给电机输出的是一个PWM占…

分布式计算框架:Spark、Dask、Ray

目录 什么是分布式计算 分布式计算哪家强:Spark、Dask、Ray 2 选择正确的框架 2.1 Spark 2.2 Dask 2.3 Ray 什么是分布式计算 分布式计算是一种计算方法,和集中式计算是相对的。 随着计算技术的发展,有些应用需要非常巨大的计算能力才…

Boost电路实战详解!(高效率同步整流,PID闭环追踪)

文章目录 寄语什么是BOOST电路BOOST同步升压电路设计要求设计方案驱动电路电压采样电路 总体电路代码实物图总结 寄语 提示:若想实战演练,请先熟悉文章操作流程哦,不然会有危险!! 我建了一个群,分享我个人…

【业务功能篇82】微服务SpringCloud-ElasticSearch-Kibanan-docke安装-进阶实战

四、ElasticSearch进阶 https://www.elastic.co/guide/en/elasticsearch/reference/7.4/getting-started-search.html 1.ES中的检索方式 在ElasticSearch中支持两种检索方式 通过使用REST request URL 发送检索参数(uri检索参数)通过使用 REST request body 来发送检索参数…

人力资源小程序的设计与开发步骤

在当前信息化时代,小程序成为了各行各业提升用户体验和服务效率的重要渠道。人力资源部门也可以通过定制开发人力资源小程序来提升招聘、培训、员工福利等方面的工作效率。接下来,我们将介绍人力资源小程序定制系统开发的具体流程。 首先,我们…