昇思25天学习打卡营第13天|ResNet50图像分类

news2024/11/17 7:19:15

1. 学习内容复盘

图像分类是最基础的计算机视觉应用,属于有监督学习类别,如给定一张图像(猫、狗、飞机、汽车等等),判断图像所属的类别。本章将介绍使用ResNet50网络对CIFAR-10数据集进行分类。

ResNet网络介绍

ResNet50网络是2015年由微软实验室的何恺明提出,获得ILSVRC2015图像分类竞赛第一名。在ResNet网络提出之前,传统的卷积神经网络都是将一系列的卷积层和池化层堆叠得到的,但当网络堆叠到一定深度时,就会出现退化问题。下图是在CIFAR-10数据集上使用56层网络与20层网络训练误差和测试误差图,由图中数据可以看出,56层网络比20层网络训练误差和测试误差更大,随着网络的加深,其误差并没有如预想的一样减小。

ResNet网络提出了残差网络结构(Residual Network)来减轻退化问题,使用ResNet网络可以实现搭建较深的网络结构(突破1000层)。论文中使用ResNet网络在CIFAR-10数据集上的训练误差与测试误差图如下图所示,图中虚线表示训练误差,实线表示测试误差。由图中数据可以看出,ResNet网络层数越深,其训练误差和测试误差越小。

了解ResNet网络更多详细内容,参见ResNet论文

数据集准备与加载

CIFAR-10数据集共有6000032*32的彩色图像,分为10个类别,每类有6000张图,数据集一共有50000张训练图片和10000张评估图片。首先,如下示例使用download接口下载并解压,目前仅支持解析二进制版本的CIFAR-10文件(CIFAR-10 binary version)。

构建网络

残差网络结构(Residual Network)ResNet网络的主要亮点,ResNet使用残差网络结构后可有效地减轻退化问题,实现更深的网络结构设计,提高网络的训练精度。本节首先讲述如何构建残差网络结构,然后通过堆叠残差网络来构建ResNet50网络。

构建残差网络结构

残差网络结构图如下图所示,残差网络由两个分支构成:一个主分支,一个shortcuts(图中弧线表示)。主分支通过堆叠一系列的卷积操作得到,shotcuts从输入直接到输出,主分支输出的特征矩阵F(x)加上shortcuts输出的特征矩阵x得到F(x)+x,通过Relu激活函数后即为残差网络最后的输出。

残差网络结构主要由两种,一种是Building Block,适用于较浅的ResNet网络,如ResNet18ResNet34;另一种是Bottleneck,适用于层数较深的ResNet网络,如ResNet50ResNet101ResNet152

Building Block

Building Block结构图如下图所示,主分支有两层卷积网络结构:

  • 主分支第一层网络以输入channel64为例,首先通过一个3×33×3的卷积层,然后通过Batch Normalization层,最后通过Relu激活函数层,输出channel64
  • 主分支第二层网络的输入channel64,首先通过一个3×33×3的卷积层,然后通过Batch Normalization层,输出channel64

最后将主分支输出的特征矩阵与shortcuts输出的特征矩阵相加,通过Relu激活函数即为Building Block最后的输出。

主分支与shortcuts输出的特征矩阵相加时,需要保证主分支与shortcuts输出的特征矩阵shape相同。如果主分支与shortcuts输出的特征矩阵shape不相同,如输出channel是输入channel的一倍时,shortcuts上需要使用数量与输出channel相等,大小为1×11×1的卷积核进行卷积操作;若输出的图像较输入图像缩小一倍,则要设置shortcuts中卷积操作中的stride2,主分支第一层卷积操作的stride也需设置为2

Bottleneck

Bottleneck结构图如下图所示,在输入相同的情况下Bottleneck结构相对Building Block结构的参数数量更少,更适合层数较深的网络,ResNet50使用的残差结构就是Bottleneck。该结构的主分支有三层卷积结构,分别为1×11×1的卷积层、3×33×3卷积层和1×11×1的卷积层,其中1×11×1的卷积层分别起降维和升维的作用。

  • 主分支第一层网络以输入channel256为例,首先通过数量为64,大小为1×11×1的卷积核进行降维,然后通过Batch Normalization层,最后通过Relu激活函数层,其输出channel64
  • 主分支第二层网络通过数量为64,大小为3×33×3的卷积核提取特征,然后通过Batch Normalization层,最后通过Relu激活函数层,其输出channel64
  • 主分支第三层通过数量为256,大小1×11×1的卷积核进行升维,然后通过Batch Normalization层,其输出channel256

最后将主分支输出的特征矩阵与shortcuts输出的特征矩阵相加,通过Relu激活函数即为Bottleneck最后的输出。

主分支与shortcuts输出的特征矩阵相加时,需要保证主分支与shortcuts输出的特征矩阵shape相同。如果主分支与shortcuts输出的特征矩阵shape不相同,如输出channel是输入channel的一倍时,shortcuts上需要使用数量与输出channel相等,大小为1×11×1的卷积核进行卷积操作;若输出的图像较输入图像缩小一倍,则要设置shortcuts中卷积操作中的stride2,主分支第二层卷积操作的stride也需设置为2

构建ResNet50网络

ResNet网络层结构如下图所示,以输入彩色图像224×224224×224为例,首先通过数量64,卷积核大小为7×77×7stride2的卷积层conv1,该层输出图片大小为112×112112×112,输出channel64;然后通过一个3×33×3的最大下采样池化层,该层输出图片大小为56×5656×56,输出channel64;再堆叠4个残差网络块(conv2_xconv3_xconv4_xconv5_x),此时输出图片大小为7×77×7,输出channel2048;最后通过一个平均池化层、全连接层和softmax,得到分类概率。

对于每个残差网络块,以ResNet50网络中的conv2_x为例,其由3Bottleneck结构堆叠而成,每个Bottleneck输入的channel64,输出channel256

如下示例定义make_layer实现残差块的构建,其参数如下所示:

  • last_out_channel:上一个残差网络输出的通道数。
  • block:残差网络的类别,分别为ResidualBlockBaseResidualBlock
  • channel:残差网络输入的通道数。
  • block_nums:残差网络块堆叠的个数。
  • stride:卷积移动的步幅。

ResNet50网络共有5个卷积结构,一个平均池化层,一个全连接层,以CIFAR-10数据集为例:

  • conv1:输入图片大小为32×3232×32,输入channel3。首先经过一个卷积核数量为64,卷积核大小为7×77×7stride2的卷积层;然后通过一个Batch Normalization层;最后通过Reul激活函数。该层输出feature map大小为16×1616×16,输出channel64
  • conv2_x:输入feature map大小为16×1616×16,输入channel64。首先经过一个卷积核大小为3×33×3stride2的最大下采样池化操作;然后堆叠3[1×1643×3641×1256][1×1643×3641×1256]结构的Bottleneck。该层输出feature map大小为8×88×8,输出channel256
  • conv3_x:输入feature map大小为8×88×8,输入channel256。该层堆叠4[1×11283×31281×1512]结构的Bottleneck。该层输出feature map大小为4×44×4,输出channel512
  • conv4_x:输入feature map大小为4×44×4,输入channel512。该层堆叠6[1×12563×32561×11024]结构的Bottleneck。该层输出feature map大小为2×22×2,输出channel1024
  • conv5_x:输入feature map大小为2×22×2,输入channel1024。该层堆叠3[1×15123×35121×12048]结构的Bottleneck。该层输出feature map大小为1×11×1,输出channel2048
  • average pool & fc:输入channel2048,输出channel为分类的类别数。

如下示例代码实现ResNet50模型的构建,通过用调函数resnet50即可构建ResNet50模型,函数resnet50参数如下:

  • num_classes:分类的类别数,默认类别数为1000
  • pretrained:下载对应的训练模型,并加载预训练模型中的参数到网络中。

模型训练与评估

本节使用ResNet50预训练模型进行微调。调用resnet50构造ResNet50模型,并设置pretrained参数为True,将会自动下载ResNet50预训练模型,并加载预训练模型中的参数到网络中。然后定义优化器和损失函数,逐个epoch打印训练的损失值和评估精度,并保存评估精度最高的ckpt文件(resnet50-best.ckpt)到当前路径的./BestCheckPoint下。

由于预训练模型全连接层(fc)的输出大小(对应参数num_classes)为1000 为了成功加载预训练权重,我们将模型的全连接输出大小设置为默认的1000CIFAR10数据集共有10个分类,在使用该数据集进行训练时,需要将加载好预训练权重的模型全连接层输出大小重置为10

此处我们展示了5epochs的训练过程,如果想要达到理想的训练效果,建议训练80epochs

可视化模型预测

定义visualize_model函数,使用上述验证精度最高的模型对CIFAR-10测试数据集进行预测,并将预测结果可视化。若预测字体颜色为蓝色表示为预测正确,预测字体颜色为红色则表示预测错误。

由上面的结果可知,5epochs下模型在验证数据集的预测准确率在70%左右,即一般情况下,6张图片中会有2张预测失败。如果想要达到理想的训练效果,建议训练80epochs

2.平台实验结果

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

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

相关文章

使用Git从Github上克隆仓库,修改并提交修改

前言 本次任务主要是进行github提交修改的操作练习实践,本文章是对实践过程以及遇到的问题进行的一个记录。 在此之前,我已经简单使用过github,Git之前已经下好了,所以就省略一些步骤。 步骤记录 注册github账号,gi…

PS系统教程31

调色之色阶 调色与通道最基本的关系通道是记录颜色最基本的信息有些图片可以用通道去改变颜色信息的说明这些图像是比较高级的PS是一款图像合成软件,在合成过程中需要处理大量素材,比如要用这些素材进行抠背景,就要用到图层蒙版以及Alpha通道…

Go语言--格式化输出输入、类型转换

格式说明 %T操作变量所属类型自动匹配格式的不一定很正确,尤其是字符类型,本应该是整型,实际上他会输出数字 输入 阻塞等待用户的输入 fmt.Scanf("%d", &a)fmt.Scan(&b)不需要写格式,自动匹配 类型转换 类…

深入学习 Kafka(1)- 核心组件

组件概述 1. Producer(消息生产者) 核心作用:生成数据源,将消息发送至指定Topic。关键特性:支持批量发送、分区策略选择,以及可配置的重试逻辑,提高了数据传输效率和可靠性。 2. Topic&#x…

iptable精讲

SNAT策略 SNAT策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet SNAT策略的原理 源地址转换,Source Network Address Translantion 修改数据包的源地址 部署SNAT策略 1.准备二台最小化虚拟机修改主机名 主机名:gw 主机名&#xff1…

SpringBoot 项目整合 MyBatisPlus 框架,附带测试示例

文章目录 一、创建 SpringBoot 项目二、添加 MyBatisPlus 依赖三、项目结构和数据库表结构四、项目代码1、application.yml2、TestController3、TbUser4、TbUserMapper5、TestServiceImpl6、TestService7、TestApplication8、TbUserMapper.xml9、MyBatisPlusTest 五、浏览器测试…

云服务出现故障这样处理

无法连接云服务器 服务器远程无法连接时,可通过7ECloud控制台进行连接。 常见故障现象 1、ping不通 2、ping丢包 3、部分端口telnet不通 4、全部端口telnet不通 5、广告、弹窗植入 6、域名无法访问IP访问正常 常见故障原因 1、云服务器过期、关机或者EIP被…

【技巧】ArcgisPro 字段计算器内置函数方法的调用

在arcgisPro中,内置了常用的几种函数方法,如顺序编号,重分类等;调用方法如下:

YOLOv3分析

参考链接:霹雳吧啦b站 主要参考了b站霹雳吧啦的视频《深度学习目标检测篇》。 目录 前言YOLOv3网络结构 YOLOv3 SPP 前言 YOLOv3的精度虽然已经过时,但思想仍旧值得学习,本帖记录所需所想的一些内容。 YOLOv3 网络结构 一共53层&#xff0…

软件著作权申请:保障开发者权益,促进软件创新

一、引言 在数字化时代,软件作为信息技术的核心,已成为推动社会进步和经济发展的重要力量。然而,随着软件产业的蓬勃发展,软件侵权和抄袭现象也日益严重。为了保护软件开发者的合法权益,促进软件产业的健康发展&#…

一维信号短时傅里叶变换域邻域降噪方法(MATLAB)

噪声在人类日常生活中无处不在,其会降低语音信号的质量和可懂度。在低信噪比的恶劣环境中,这种负面影响愈发严重。为了解决这个问题,众多研究人员在过去的几十年里提出了许多降噪算法。 根据原理的不同,降噪算法可大致分为五类:谱减法、最优滤波法、基于统计模型的方法、子空间…

【Java EE】Spring IOCDI

Spring IOC & DI 文章目录 Spring IOC & DI一、Spring是什么?二、IOC(控制反转)2.1 通俗理解2.2 造汽车的例子理解IOC2.3 IOC详解1. 获取Bean2. 方法注解——Bean1. 应用场景:2. 应用方法:3. 注意要点: 特别注意: 四、DI4…

基于springboot+vue+uniapp的超市售货管理平台

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

工具网源码|计算某一天是当年的第几周,第几天,黄历工具

源码简介: 工具网源码|计算某一天是当年的第几周,第几天,黄历工具,无文章系统,全站同过算法实现,并在前台展示,页面多,很适合seo。 演示站: https://dijizhou.wengu8.com…

从项目中学习Bus-Off的快慢恢复

0 前言 说到Bus-Off,大家应该都不陌生,使用VH6501干扰仪进行测试的文章在网上数不胜数,但是一般大家都是教怎么去干扰,但是说如何去看快慢恢复以及对快慢恢复做出解释比较少,因此本文以实践的视角来讲解Bus-Off的快慢恢…

期末复习---程序填空

注意&#xff1a; 1.数组后移 *p *(p-1) //把前一个数赋值到后一个数的位置上来覆盖后一个数 2.指针找最大字符 max *p while( *p){ if( max< *p) { max*p; qp;/ 用新的指针指向这个已经找到的最大位置&#xff1b;!!!!!!!!! } p; //因为开始没有next &#xff…

网络爬虫(二) 哔哩哔哩热榜高频词按照图片形状排列

我们有时候需要爬取结果生成为自定义的词云图 生成自定义的词云图通常需要以下步骤&#xff1a; 1. 爬取数据&#xff1a;使用爬虫工具或库&#xff0c;如requests、BeautifulSoup等&#xff0c;可以爬取网页、论坛、社交媒体等平台上的文本数据。 2. 数据预处理&#xff1a…

走进开源企业 | 湖南大学OpenHarmony技术实训活动在开鸿智谷顺利举办!

6月24日-6月26日&#xff0c;2024开放原子校源行之湖南大学信息科学与工程学院师生走进开源企业实训交流活动顺利落下帷幕。湖南大学信息科学与工程学院的师生代表团一行90人参与了湖南开鸿智谷数字产业有限公司&#xff08;以下简称“开鸿智谷”&#xff09;与母公司拓维信息系…

计算机的错误计算(十八)

摘要 计算机的错误计算&#xff08;四&#xff09;指出一元二次方程的计算精度问题。本节给出其一种解决方案。 计算机的错误计算&#xff08;四&#xff09;与&#xff08;十七&#xff09;分别指出一元二次方程的求解是具有挑战性的难题&#xff0c;其出错原因是因为相减相消…

(超详细)数据结构——“队列”的深度解析

目录 前言&#xff1a; 1.队列的概念 2.队列的实现 3.代码实现队列 3.1 队列的初始化 3.2 插入 3.3 删除 3.4 队列的队头&#xff0c;队尾和大小 3.5 判空 3.6 销毁 3.7 测试 前言&#xff1a; 队列与栈都是线性表&#xff0c;它们的结构也非常类似&#…