代码实现 ResNet 详解

news2024/11/28 21:32:46

零、ResNet的介绍 

ResNet代码(含详细的使用说明):

https://github.com/GarsonWw/resnet-garson.git 

        当谈到深度学习中的卷积神经网络时,ResNet(Residual Network)是一个备受赞誉且引人注目的架构。ResNet的出现在2015年引发了巨大的影响,并在图像分类、目标检测和语义分割等领域取得了令人瞩目的成果。

        ResNet之所以引人注目,是因为它提出了一个独特的解决方案来应对深度卷积神经网络面临的问题,即梯度消失和模型难以优化的问题。在传统的卷积神经网络中,随着网络层数的增加,梯度往往会逐渐减小并消失,导致网络的收敛变得困难。而ResNet通过引入残差连接(residual connection),成功地解决了这一问题。由于梯度可以在残差连接中直接传播,ResNet可以轻松地训练非常深的网络,在原论文的介绍中甚至超过100层。

一、ResNet的网络结构

        在ResNet的学习过程中,我们必须了解其网络结构。ResNet特殊的残差网络结构正是其解决梯度消失和模型难以优化的关键。

源于:ResNet原论文截取 
图1.1 ResNet网络结构
源于:ResNet原论文截取 

        我们通过这张图可以发现:无论是18、34、50、101、152层的网络, 他们的网络框架都是基本一样的。

        首先通过一个7x7的卷积层,再通过一个3x3的最大池化下采样。而后通过各自对应的conv2_x、conv3_x、conv4_x、conv5_x 残差结构。最后再跟上一个平均池化下采样,以及全连接输出层。

        需要注意的是,下图的意思是需要2个3x3的卷积层,其卷积核的个数为64。

二、代码实现详解

        在我们了解ResNet的网络结构后,我们就可以通过代码将其结构呈现出来。

1、介绍残差结构

        ResNet为了实现特征的降维和尺寸的匹配,分为两种残差结构 1.实线残差结构 2.虚线残差结构。需要注意的是ResNet18/34使用的两种残差结构与ResNet50及往上所使用的不同。如下图所示:

图2.1 ResNet18/34实线残差结构
图2.2 ResNet18/34虚线残差结构

         

图2.3 ResNet50+实线残差结构
图2.4 ResNet50+虚线残差结构

2、搭建ResNet18/34残差结构

        那首先让我们搭建ResNet18、ResNet34对应的残差结构。 

        下方为对应的Python实现代码,不要着急,我们将其慢慢讲解。

实线残差网络源代码

         1、expension指的是卷积核的个数不发生变化,我们可以从ResNet的网络结构图种发现,ResNet18、34,其第一层和第二层的卷积核是不发生变化的,所以此时的expansion为1

卷积核数量不改变
卷积核数量不改变

         2、根据图2.1可知,我们需要先经过stride步距为1、3x3卷积核、输入矩阵大小为56x56x64的卷积处理,所以我们需要定义一个conv1作为第一个卷积层。

         3、而后我们跟随了一个批归一化处理(Batch Normalization,简称bn),归一化处理的好处有很多,可以加速网络训练,适应高学习率等,再次不过多赘述。其输入的参数是输出矩阵的深度。

        4、 根据图2.1可知,经过conv1之后,我们需要经过一个ReLU函数。

        5、 根据图2.1可知,ReLU函数之后,我们需要再经过一个卷积层,其步骤和第二点一致。但需要注意的是,无论是 图2.1 的实线残差结构,还是 图2.2 的虚线残差结构,他们第二步卷积的步距都为1,所以stride设为1。

        6、 再经过一个批归一化处理(Batch Normalization,简称bn)层和一个下采样层。注意此时下采样层默认为None。下采样层通常位于残差块的第一个卷积层之前,用于将输入特征图的尺寸减小,以便与残差块的输出进行相加操作。

        7、接下来的forward函数是一个正向传播的过程。我们输入特征矩阵的值为x,如果下采样函数为None时,对应的是我们的实线残差结构,那我们可以不进行下采样,此时x直接为identity(捷径分支的输出)。但如果不为None时,输入特征矩阵就需要经过下采样层函数得到identity(捷径分支的输出)。

        8、接下来我们根据 图2.1 来使用前几步定义好的函数,来拼装成我们的残差结构。每一层的输出矩阵是下一层的输入矩阵。

 

 🎈至此resnet18/34残差结构讲解完毕!

 3、搭建虚线残差结构

        使用ResNet50以及更大层数时,我们使用的残差结构是虚线残差结构。我们了解过实线残差结构是如何搭建之后,虚线残差结构就不难理解了。

虚线残差结构源代码

         1、因为是虚线残差结构,根据 图1.1 可知,ResNet50以上,第三层卷积层其卷积核的个数是等于前两层的4倍的(如图256是64的四倍,512是128的四倍...),所以此时expansion设为4。

         2、卷积层的初始化与ResNet18/34基本一致,需要注意的是,其第二层卷积层的stride需要根据输入的stride进行调整。

        3、最需要注意的是,我们的第三层卷积核的个数是第一层和第二层的4倍,所以在这里我们的outchannel输入矩阵就需要*4倍。同样的,输出改变了,那我们的bn的输出矩阵深度也需要改变。

        4、根据图2.3,拼装残差结构。每一层的输出矩阵是下一层的输入矩阵。

  🎈至此resnet50+残差结构讲解完毕!

4、定义ResNet网络模型

        本节代码需要参考图1.1搭建。

        1、初始化模型,其中:

                block:网络模块(Bottleneck/BasicBlcok)

                blocks_num:模块的数量(残差结构个数列表)

                num_classes:训练集分类个数

                include_top:用于基于resnet搭建更加复杂的网络

        2、 输入矩阵的值,从 图1.1 发现所有第一个输入矩阵的值都为64。

        3、搭建第一层卷积层。padding设为3可以让图像原来的高和宽缩减为原来的一半。

        4、经过bn、ReLU、maxpool层。注意,为了让图像原来的高和宽缩减为原来的一半,padding为1。

         5、每一层layer对应的下图中的每一层残差结构。

         6、block对应卷积模块,channel对应输入卷积核的个数,block_num包含了多少个残差结构。

        判断是否使用下采样函数,如果步距不为1或者有expansion时则需要使用。需要注意的是,ResNet50+层的layer1种对应的虚线残差结构只需要改变特征矩阵的深度,所以判断语句种的stride是等于传入的stride的。而对于其他的虚线残差结构,我们既要改变特征矩阵的深度也要改变特征矩阵的高度和宽度。

        layers.apend先将第一层残差结构添加,再循环将每一个层残差结构都添加进去。

         7、再进行整个残差网络结构的正向传播。

  🎈至此定义ResNet网络模型讲解完毕!

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

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

相关文章

最全的mysql编码集问题排查

用navicate导入一个json文件数据的时候,发现中文有一些是乱码的,查了很多资料,发现mysql、navicate编码集都没问题,包括导入流程,那是什么原因呢?想着难道是电脑的编码集影响了?于是调整以后&am…

【C语言】结构体——我就是秩序的创建者!(结构体数组、结构体指针、嵌套、匿名、字面量、伸缩型数组、链式结构)

一、结构体基础1.1 声明和定义1.1 初始化和赋值1.3 访问结构体成员 二、结构体数组2.1 定义和初始化2.2 访问 三、结构体的嵌套五、指向结构体的指针六、向函数传递结构体6.1 只传递结构体成员6.2 传递结构体指针6.3 传递结构体 七、结构体的其他特性——不容小觑7.1 结构体的大…

硬盘数据丢失怎么办?一招轻松恢复硬盘数据!

硬盘应该是最为常用的数据存储设备了,它为电脑等设备提供巨大的存储空间。我们在平时的工作和学习中也经常会使用硬盘来存储数据,很多用户会将多年搜集到的资料存到电脑硬盘里。 硬盘上的文件,不论是工作文档还是照片、视频,对用…

(四)ArcGIS空间数据的转换与处理——数据结构转换

ArcGIS空间数据的转换与处理——数据转换 空间数据的来源很多,如地图、工程图、规划图、航空与遥感影像等,因此空间数据也有多种格式。根据应用需要,需对数据进行格式转换,不同数据结构间的转换主要包括矢量数据到栅格数据的转换…

Guava的骚操作,大大提升了我摸鱼的时间

以面向对象思想处理字符串对基本类型进行支持总结 概述 1、Guava是google公司开发的一款Java类库扩展工具包,包括新的集合类型(如 multimap 和 multiset)、不可变集合、图形库,以及用于缓存、并发、I/O等实用程序。使用这些API一…

内存溢出导致的Full GC异常

背景 线上服务GC耗时过长,普遍10s,此外GC后,内存回收不多 问题一 通过查询gc日志可以发现,CMS进行垃圾回收的时候报concurrent mode failure错误,该错误是因为CMS进行垃圾回收的时候,新生代进行GC产生的对象…

JupyterLab(Jupyter Notebook)安装与使用

文章目录 前言安装JupyterLab切换中文语言JupyterLab desktop 使用演示其它补充后记 前言 目前在看《程序员数学:用Python学透线性代数和微积分》这个书,它里面的代码是在Jupyter中编写的,所以也安装下用用。 JupyterLab是一个可以同时编写…

[PyTorch][chapter 37][经典卷积神经网络-2 ]

1: VGG 2: GoogleNet 一 VGG 1.1 简介 VGGNet 是牛津大学计算机视觉组(Visual Geometry Group)和谷歌 DeepMind 一起研究出来的深度卷积神经网络,因而冠名为 VGG。VGG是一种被广泛使用的卷积神经网络结构,其在在20…

生成式模型的质量评估标准

Sample Quality Matrix 如何评价生成式模型的效果?ISFIDsFIDPrecision & RecallPrecisonRecall计算precision和recall 如何评价生成式模型的效果? Quality: 真实性(逼真,狗咬有四条腿) Diversity: 多样性&#x…

全网为数不多清晰可行的在VUE中使用sortable.js实现动态拖拽排序的教程!

目录 0 写在前面的 1 依赖安装 2 手写简单标签演示 3 要点 4 效果 0 写在前面的 首先批评以下文章 (10条消息) sortable.js 实现拖拽_sortablejs_花铛的博客-CSDN博客 (10条消息) sortablejs拖拽排序功能(vue)_C_fashionCat的博客-CSDN博客 他们…

Spring6入门 + Log4j2

1、环境要求 JDK:Java17(Spring6要求JDK最低版本是Java17) Maven:3.6 Spring:6.0.2 2、构建模块 (1)构建父模块spring6 在idea中,依次单击 File -> New -> Project ->…

什么是内部网络分段渗透测试?

网络攻击的规模、范围和复杂性与日俱增。随着黑客及其攻击方法变得越来越复杂,您的企业必须做出相应的响应,否则您的安全边界就会不堪重负。 如今,内部网络分段是将攻击成功风险降至最低、改善数据流和隔离关键支付数据的主要方法之一。 但是…

【U-Boot 之七】fastboot原理分析及uboot fastboot功能实践

本文首先介绍了fastboot的基本原理,然后分析了uboot中fastboot的实现,最后,从实践的角度测试了fastboot协议及各种fastboot命令的使用方式等 。本文的仅按照我本人的实际测试过程进行了简单的描述。若有不当之处,欢迎各位大神不吝…

专家警告AI可能会导致人类灭绝?

人工智能可能导致人类灭绝,包括 OpenAI 和 Google Deepmind 负责人在内的专家警告说 数十人支持在人工智能安全中心 的网页上发表的声明。 它写道:“减轻人工智能灭绝的风险应该与其他社会规模的风险(如流行病和核战争)一起成为全…

Linux系统安装RabbitMQ

rabbitmq安装 说明:本次使用centos7.9 安装虚拟机. 1. 安装依赖环境 在线安装依赖环境: yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xz2. 安装Erlang 根据课…

[原创]集权设施保护之LDAP协议

LDAP是一种目录访问协议,它规定了以树状结构的方式来存储和访问数据。然而协议是抽象的,要产生具体的功效,必须在应用中实现,比如AD域服务就实现了LDAP协议。 LDAP最明显的优势就是读取速度快,拥有极高的搜索效率。 可…

Drools规则引擎

Drools规则引擎 Drools规则引擎1、Drools简介2、Drools入门案例2.1、业务场景2.2、maven坐标2.3、编写xml配置文件(多方法)2.4、创建drl规则文件2.5、单元测试 3、Drools基础语法3.1、规则文件的构成3.2、规则体语法结构3.2.1、条件部分3.2.1.1、约束连接…

day4,day5 -java集合框架

List、Set、Map等常用集合类的特点和用法。 常用集合类(List、Set、Map 等)是 Java 中提供的数据结构,用于存储和操作一组数据。以下是它们的特点和用法: List(列表): 特点:有序集合&#xff0…

多元办公场景下,企业如何保障工作效率与数据安全流通?

为适应数字化转型需求,提升办公效率,很多企业对工作模式进行革新,并将更多协同办公工具引入工作流程。然而,这也扩大了企业内网对外的安全暴露面,企业亟需进一步加强底层基础设施的网络安全建设,严防勒索病…

分布式监控平台——Zabbix6.0

市场上常用的监控软件: 传统运维:zabbix、 Nagios云原生环境: Prometheus (go语言开发的) 一、zabbix概述 作为一个运维,需要会使用监控系统查看服务器状态以及网站流量指标,利用监控系统的数…