ResNet网络结构入门

news2024/11/16 12:50:52

ResNet网络结构入门

  • 一、传统卷积神经存在的问题
  • 二、Residual 结构(残差结构)
    • ResNet 中的残差结构
    • ResNet 中的 short cut
  • 三、Batch Normalization

Resnet 网络创新点

  • 提出 Residual 结构(残差结构),可搭建超深的网络结构(可突破1000层)
  • 使用 Batch Normalization 加速训练(丢弃dropout)

下图是 ResNet34 层模型的结构简图:
在这里插入图片描述

一、传统卷积神经存在的问题

在ResNet网络提出之前,传统的卷积神经网络都是通过将一系列卷积层与池化层进行堆叠得到的。
这时容易出现错误认知,觉得网络越深,特征信息越丰富,模型效果应该越好。实验证明,当网络堆叠到一定深度时,会出现两个问题:

  1. 退化问题(degradation problem):存在深层网络的效果可能比浅层网络差的现象
  2. 梯度消失或梯度爆炸
    梯度消失指每一层的误差梯度小于 1 时,反向传播时网络越深,梯度越趋近于0
    反之,梯度爆炸指每一层的误差梯度大于 1 时,反向传播时网路越深,梯度越来越大

如下图所示,20层网络 反而比 56层网络 的误差更小:
在这里插入图片描述
总结:当网络堆叠到一定深度时,深层网络的效果可能比浅层网络效果差

二、Residual 结构(残差结构)

对于退化问题,ResNet提出了 residual结构(残差结构)来减轻退化问题,下图是使用residual结构的卷积网络,可以看到随着网络的不断加深,效果并没有变差,而是变的更好了。(虚线是train error,实线是test error)
在这里插入图片描述
人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为 残差网络 (ResNets)。

残差网络由许多隔层相连的神经元子模块组成,我们称之为 残差块 Residual block。单个残差块的结构如下图所示:
在这里插入图片描述
上图中红色部分称为 short cut 或者 skip connection(捷径分支),直接建立 a[ l] 与 a[l+2] 之间的隔层联系。a[l] 直接隔层与下一层的线性输出相连,与 z[l+2] 共同通过激活函数(ReLU)输出 a[l+2]。

由多个 残差块 组成的神经网络就是 残差网络 。其结构如下图所示:
在这里插入图片描述
实验表明,这种模型结构对于训练非常深的神经网络效果很好。

ResNet 中的残差结构

实际应用中,残差结构的 short cut 不一定是隔一层连接,也可以中间隔多层,ResNet所提出的残差网络中就是隔多层。
跟 Vgg 网络类似,ResNet也有多个不同层的版本,而残差结构也有两种对应浅层和深层网络:

ResNet残差结构
浅层网络ResNet18/34BasicBlock
深层网络ResNet50/101/152Bottleneck

下图中左侧残差结构称为 BasicBlock,右侧残差结构称为 Bottleneck
在这里插入图片描述
对于深层的 Bottleneck,1×1的卷积核起到降维和升维(特征矩阵深度)的作用,同时可以大大减少网络参数。
如下所示,假设两个残差结构的输入特征和输出特征矩阵的深度都是 256
在这里插入图片描述
那么两个残差结构所需的参数为

  • 左侧:3 × 3 × 256 × 256 + 3 × 3 × 256 × 256 = 1 , 179 , 648
  • 右侧:1 × 1 × 256 × 64 + 3 × 3 × 64 × 64 + 1 × 1 × 64 × 256 = 69 , 632

:CNN参数个数 = 卷积核尺寸×卷积核深度 × 卷积核组数 = 卷积核尺寸 × 输入特征矩阵深度 × 输出特征矩阵深度
所以搭建深层网络时,使用右侧的残差结构更合适

ResNet 中的 short cut

观察下图的 ResNet18层网络,可以发现有些残差块的 short cut 是实线的,而有些则是虚线的。

虚线的 short cut 上通过1×1的卷积核进行了维度处理(特征矩阵在长宽方向降采样,深度方向调整成下一层残差结构所需要的channel)。
在这里插入图片描述
下图是原论文给出的不同深度的ResNet网络结构配置,表中 残差块×N 表示将该残差结构重复N次。
在这里插入图片描述


对于ResNet50/101/152,conv2_x所对应的一系列残差结构的第一层是虚线残差结构,因为它需要调整输入特征矩阵的channel,将shape从[56, 56, 64] --> [56, 56, 256]。
根据表格可知通过3x3的max pool之后输出的特征矩阵shape应该是[56, 56, 64],但conv2_x中的实线残差结构期望的输入特征矩阵shape是[56, 56, 256](因为输入输出特征矩阵shape相同才能将捷径分支输出与主分支输出相加)。

另外需要注意,上面只调整channel维度,高和宽不变,而conv3_x, conv4_x, conv5_x所对应的一系列残差结构的第一层虚线残差结构不仅要调整channel还要将高和宽缩减为原来的一半。

三、Batch Normalization

对于梯度消失或梯度爆炸问题,ResNet论文提出通过数据的预处理以及在网络中使用 BN(Batch Normalization)层来解决。

Batch Normalization,简称BatchNorm或BN,翻译为“批归一化”,是神经网络中一种特殊的层,如今已是各种流行网络的标配。BN被建议插入在(每个)ReLU激活层前面。

如下图所示,对于 Conv1 来说输入满足某一分布,但对于 Conv2 而言输入的feature map就不一定满足某一分布规律了。而我们Batch Normalization的目的就是使我们的feature map满足均值为0,方差为1的分布规律。

在这里插入图片描述

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

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

相关文章

第44节:cesium 大雾效果(cesium自带)(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><!

C#核心知识回顾——12.lambda表达式、List排序、协变和逆变

1.Lambda表达式 可以将lambad表达式理解为匿名函数的简写 它除了写法不同外&#xff0c;使用上和匿名函数一模一样 都是和委托或者事件配合使用的 //匿名函数 //delegate&#xff08;参数列表&#xff09; //{ //} //lambda表达式 //(参数列表) > //{ //函数体 //…

【Axure高保真原型】冻结固定中继器表格首尾两列

今天和大家分享冻结固定中继器表格首尾两列的原型模板&#xff0c;当我们遇到表格内容较多时&#xff0c;可以用这个模板固定第一列和最后一列操作列。这个模板是用中继器制作的&#xff0c;所以使用也很简单&#xff0c;只需要在中继器里填写对应数据即可&#xff0c;具体效果…

游戏渲染技术:前向渲染 vs 延迟渲染 vs Forward+渲染(二)

GTA5 2 前向渲染 前向渲染是三个光照技术中最简单的&#xff0c;也是游戏图形渲染中最常见的技术。出于这个原因&#xff0c;也是光照计算最昂贵的技术&#xff0c;它不允许在场景中出现大量的动态光源。 大部分使用前向渲染的图形引擎会采用一些技术来模拟场景中大量的光源的…

K8S应用流程安全(镜像安全 配置管理 访问安全)

应用流程安全 1 应用流程安全1.1 镜像安全1.1.1 构建原则1.1.2 Dockerfile实践1.1.3 构建进阶1.1.4 镜像检测1.1.5 仓库升级1.1.6 高可用仓库1.1.7 镜像策略 1.2 配置管理1.2.1 配置基础1.2.2 YAML安全1.2.3 kustomize1.2.4 基础实践1.2.5 功能复用1.2.6 配置定制1.2.7 补丁实践…

python接口自动化(二十七)--html 测试报告——上(详解)

简介 上一篇我们批量执行完用例后&#xff0c;生成的测试报告是文本形式的&#xff0c;不够直观&#xff0c;而且报告一般都是发给leader的&#xff0c;所以最好是直观一目了然&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成 HTML 格式的。unittest 里面是不能生成…

SpringBoot——加载测试专用的配置类

加载测试专用的配置类 之前我们介绍了如何在测试类中加载专用的测试属性&#xff0c;这次我们来看如何在测试类中加载专用的测试类。 创建配置类 首先创建一个配置类&#xff0c;并且创建一个第三方的Bean模拟这是一个要在测试用例中引用的第三方Bean 创建测试用例 创建一个…

第四十三章Java匿名对象

经过前面的学习&#xff0c;我们知道创建对象的标准格式如下&#xff1a; 类名称 对象名 new 类名称(); 每次 new 都相当于开辟了一个新的对象&#xff0c;并开辟了一个新的物理内存空间。如果一个对象只需要使用唯一的一次&#xff0c;就可以使用匿名对象&#xff0c;匿名对…

一起来了解一下Java中的String类吧!!!

简单认识Java中的String类 一、认识String类的重要性 在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可以使用标准库提 供的字符串系列函数完成大部分操作&#xff0c;但是这种将数据和操作数据方法分离开的方式…

vcruntime140_1.dll缺失了要怎么修复?多种方法助你解决丢失问题

我们在使用电脑的时候&#xff0c;其实最经常发生的事情就是蓝屏和dll文件缺失了吧&#xff0c;这也是很多网友最想解决的几个大问题。今天呢&#xff0c;就是有一个网友反映说他的vcruntime140_1.dll缺失了&#xff0c;不知道怎么解决&#xff0c;下面我们就来聊聊vcruntime14…

QT DAY4

做一个闹钟&#xff0c;并播报填写内容 widget.h 文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QDateTime> #include <QMessageBox> #include<QTextToSpeech> //文本转语音类namespace Ui…

你的流量虚了吗?分析手机流量卡不足量的套路

当今时代&#xff0c;手机流量的使用是每个人每天都在消耗的事情&#xff0c;在有WIFI的情况下还好&#xff0c;大家不需要担心流量用多了还是少了&#xff0c;但是在使用手机流量的时候&#xff0c;就需要注意了&#xff0c;看看是不是会用超什么的&#xff0c;但是现在有一个…

最新总结的软件测试宝典,花2天时间阅完,软件测试面试就过了......

1、测试人员需要何时参加需求分析&#xff1f; 如果条件循序 原则上来说 是越早介入需求分析越好 因为测试人员对需求理解越深刻 对测试工作的开展越有利 可以尽早的确定测试思路 减少与开发人员的交互 减少对需求理解上的偏差 2、软件测试与调试的关系 测试条件已知&#x…

uniapp Android平台各功能模块隐私合规协议

Android平台各功能模块隐私合规协议

STM32 Proteus仿真HCSR04超声波测距报警DS18B20温度采集 -0055

STM32 Proteus仿真HCSR04超声波测距报警DS18B20温度采集 -0055 Proteus仿真小实验&#xff1a; STM32 Proteus仿真HCSR04超声波测距报警DS18B20温度采集 -0055 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 LCD1602显示器HCSR04超声波测距传感器DS18B20温度传感器…

数学建模常用模型(六):时间序列预测

数学建模常用模型&#xff08;六&#xff09;&#xff1a;时间序列预测 时间序列预测是数学建模中的一个重要领域&#xff0c;用于预测时间序列数据中未来的趋势和模式。时间序列预测可以帮助我们了解数据的演变规律&#xff0c;做出合理的决策和规划。 这是我自己总结的一些代…

FCPX插件-16个手绘卡通素描涂鸦图形文字标题动画 Scribble Sketch Lower Thirds

Scribble Sketch Lower Thirds包含16个手绘卡通素描涂鸦图形文字标题动画模板&#xff0c;一个简约的卡通标题动画&#xff0c;由手绘的文本动画组成&#xff0c;可帮助您轻松改善您影片创意。 这个插件包提供了各种独特的手绘风格的标题动画模板&#xff0c;包括涂鸦笔画、草…

最新FLstudio21.0.3中文版本下载更新及内容介绍

在现在这个数字音乐时代&#xff0c;各种音乐中都或多或少有些电子音乐的影子&#xff0c;或是合成器音色、或是通过数字效果器制作出的变幻莫测的变化效果。而小马丁、Brooks、Eliminate等众多电子音乐巨头便是使用FL Studio来制作音乐的。今天小编就以FL Studio五年的资深用户…

你尚未连接--代理服务器可能有问题,或地址不正确。

这种情况可能是你装了梯子之后&#xff0c;自动开启了代理服务器 解决方法&#xff1a; 1、控制面板->网络和Internet 2、网络和共享中心->internet选项 3、连接->局域网设置 4、把代理服务器的沟沟取消 这样就解决了

多线程与并发编程【线程休眠、线程让步、线程联合、判断线程是否存活】(二)-全面详解(学习总结---从入门到深化)

目录 线程休眠 线程让步 线程联合 Thread类中的其他常用方法 判断线程是否存活 线程的优先级 线程休眠 sleep()方法&#xff1a;可以让正在运行的线程进入阻塞状态&#xff0c;直到休眠时间 满了&#xff0c;进入就绪状态。sleep方法的参数为休眠的毫秒数。 public class…