物体检测-系列教程27:YOLOV5 源码解析17(训练脚本解读:训练函数4)
😎😎😎物体检测-系列教程 总目录
有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传
点我下载源码
24、epoch循环训练------更新、评估、保存
这部分是训练过程的每个epoch结束之前执行的一系列操作,主要包括学习率调整、模型评估、日志记录、模型保存等
# Schedulerscheduler.step()# DDP process 0 or single-GPUif rank in [-1, 0]:# mAPif ema is not None:ema.update_attr(model, include=['yaml', 'nc', 'hyp', 'gr', 'names', 'stride'])final_epoch = epoch + 1 == epochsif not opt.notest or final_epoch: # Calculate mAPresults, maps, times = test.test(opt.data,batch_size=total_batch_size,imgsz=imgsz_test,model=ema.ema.module if hasattr(ema.ema, 'module') else ema.ema,single_cls=opt.single_cls,dataloader=testloader,save_dir=log_dir)# Writewith open(results_file, 'a') as f:f.write(s + '%10.4g' * 7 % results + '\n') # P, R, mAP, F1, test_losses=(GIoU, obj, cls)if len(opt.name) and opt.bucket:os.system('gsutil cp %s gs://%s/results/results%s.txt' % (results_file, opt.bucket, opt.name))# Tensorboardif tb_writer:tags = ['train/giou_loss', 'train/obj_loss', 'train/cls_loss','metrics/precision', 'metrics/recall', 'metrics/mAP_0.5', 'metrics/mAP_0.5:0.95','val/giou_loss', 'val/obj_loss', 'val/cls_loss']for x, tag in zip(list(mloss[:-1]) + list(results), tags):tb_writer.add_scalar(tag, x, epoch)# Update best mAPfi = fitness(np.array(results).reshape(1, -1)) # fitness_i = weighted combination of [P, R, mAP, F1]if fi > best_fitness:best_fitness = fi# Save modelsave = (not opt.nosave) or (final_epoch and not opt.evolve)if save:with open(results_file, 'r') as f: # create checkpointckpt = {'epoch': epoch,'best_fitness': best_fitness,'training_results': f.read(),'model': ema.ema.module if hasattr(ema, 'module') else ema.ema,'optimizer': None if final_epoch else optimizer.state_dict()}# Save last, best and deletetorch.save(ckpt, last)if best_fitness == fi:torch.save(ckpt, best)del ckpt
- 更新学习率调度器的状态,根据预定的策略(如学习率衰减)调整学习率,以帮助模型更好地收敛
- 如果不是分布式训练或者在分布式训练的主进程:
- 如果使用了指数移动平均(EMA)模型,将更新EMA模型的属性:
- 更新EMA模型的属性,包括模型配置(yaml)、类别数量(nc)、超参数(hyp)、损失比例(gr)、类别名称(names)和步长(stride),这是为了确保EMA模型与训练模型保持同步
- final_epoch ,判断当前epoch是否是训练的最后一个epoch,确定何时执行一些只在训练结束时需要进行的操作(如保存模型)非常关键
- 如果设置为在每个epoch结束时都进行测试(notest为False)或者当前是最后一个epoch,则执行模型测试
- 从测试脚本中调用测试函数,进行模型评估。计算模型在测试集上的性能指标,包括精度、召回率和mAP等。根据是否使用EMA以及是否在模型上使用了DataParallel或DistributedDataParallel,选择适当的模型进行评估
- 打开测试文件
- 将测试结果写入到指定的文件中,results_file是存储结果的文件路径,s是包含训练信息的字符串,results包含了测试指标的值
- 如果指定了云存储桶(bucket)和文件命名(name)
- 将结果文件上传到云存储
- 如果配置了TensorBoard日志记录器
- 定义一组标签,用于在TensorBoard中组织不同的训练和验证指标
- 遍历每个指标及其对应的标签
- 使用TensorBoard的add_scalar函数记录这些指标,在TensorBoard中进行可视化
- fi ,调用辅助函数fitness计算一个综合性能指标(称为"fitness"),它基于测试结果(例如精度、召回率、mAP等)
- 如果当前epoch的fitness分数高于迄今为止的最佳分数,则
- best_fitness ,更新最佳fitness分数
- save ,决定是否保存模型。如果不是显式地设置为不保存模型(nosave为False),或者当前是最后一个epoch并且没有进行模型进化(evolve为False),则保存模型
- 如果满足保存模型的条件:
- 读取并保存当前模型的状态,包括epoch数、最佳fitness分数、训练结果、模型本身以及优化器的状态(如果不是最后一个epoch)
- 将模型的状态保存到文件中。last变量代表最后一个checkpoint的文件名
- 如果当前模型的fitness等于最佳fitness,则
- 将其保存为最佳模型的checkpoint
- 删除临时保存的模型状态字典,释放内存
这部分展示了在训练过程中每个epoch结束之前执行的关键步骤,包括更新学习率、评估模型性能、记录和保存结果、以及条件性地保存模型的状态。这些步骤对于监控训练进度、评估模型性能和保证训练过程的可重现性非常重要
25、结束epoch循环训练的后续处理
这部分主要涉及在训练结束的清理和保存工作,包括重命名和保存训练结果、模型状态、上传权重到云存储、绘制结果图表和清理资源等
if rank in [-1, 0]:# Strip optimizersn = ('_' if len(opt.name) and not opt.name.isnumeric() else '') + opt.namefresults, flast, fbest = 'results%s.txt' % n, wdir + 'last%s.pt' % n, wdir + 'best%s.pt' % nfor f1, f2 in zip([wdir + 'last.pt', wdir + 'best.pt', 'results.txt'], [flast, fbest, fresults]):if os.path.exists(f1):os.rename(f1, f2) # renameispt = f2.endswith('.pt') # is *.ptstrip_optimizer(f2) if ispt else None # strip optimizeros.system('gsutil cp %s gs://%s/weights' % (f2, opt.bucket)) if opt.bucket and ispt else None # upload# Finishif not opt.evolve:plot_results(save_dir=log_dir) # save as results.pnglogger.info('%g epochs completed in %.3f hours.\n' % (epoch - start_epoch + 1, (time.time() - t0) / 3600))dist.destroy_process_group() if rank not in [-1, 0] else Nonetorch.cuda.empty_cache()return results
- 如果不是分布式训练或者是分布式训练的主进程:
- n,构造文件名的前缀。如果用户提供了命名(opt.name)且名称不是全数字,则在名称前加上下划线;否则直接使用名称。这有助于生成更具可读性和组织性的文件名
- fresults, flast, fbest,基于上一步得到的名称前缀n,构造结果文件、最后一个模型状态文件和最佳模型状态文件的完整路径
- 使用for循环结合zip函数遍历原始文件名和新文件名的列表,f1是原始文件名,f2是新文件名
- 如果原始文件(f1)存在
- 则将其重命名为新的文件名(f2),保持文件命名的一致性和可识别性
- ispt ,判断文件是否是.pt格式的模型文件,对于接下来是否执行某些特定操作(如剥离优化器状态)很关键
- 如果文件是.pt格式的模型文件,则执行辅助函数strip_optimizer,从模型文件中移除优化器的状态。这可以减小文件大小,便于分享或部署模型
- 如果指定了云存储桶(opt.bucket)且文件是模型文件,则使用gsutil cp命令将文件上传到云存储桶中。这便于模型的远程存储和访问
- 如果不是在执行进化训练(opt.evolve)
- 调用辅助函数plot_results,在指定的日志目录中保存训练结果的图表(通常为results.png),有助于可视化训练过程
- 记录一条日志信息,训练完成,包括完成的epochs数和总耗时(以小时计)
- 如果当前进程是分布式训练中的非主进程,则销毁进程组。这是分布式训练结束时的清理工作,有助于正确地关闭分布式训练环境
- 清空CUDA缓存。这有助于释放未使用的GPU内存,使其可用于其他应用程序
- 返回训练过程中的最终结果,包括模型性能指标等重要信息
相关文章:
物体检测-系列教程27:YOLOV5 源码解析17(训练脚本解读:训练函数4)
😎😎😎物体检测-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 24、epoch循环训练------更新、评估、保存 这部分是训练过程的每个epoch结束之前执行的一…...
基于51单片机的数字时钟(万年历)设计与实现
基于51单片机的数字时钟(万年历)设计与实现 摘要 随着科技的不断发展,数字时钟已成为人们日常生活中不可或缺的一部分。基于51单片机的数字时钟(万年历)设计,结合了传统时钟的功能与现代电子技术…...
2024年谷歌SEO的趋势预测及应对建议(川圣SEO)蜘蛛池
baidu搜索:如何联系八爪鱼SEO? baidu搜索:如何联系八爪鱼SEO? baidu搜索:如何联系八爪鱼SEO? 虽然说“SEO”已死这个口号已经喊了很多年了(最终也没死),但是在2023年很…...
Rust 生命周期符号使用的方法和规律
一、生命周期符号使用的规律 在 Rust 中,生命周期(lifetimes)是用于处理引用和所有权问题的关键概念。生命周期符号(通常表示为 a、b 等)用于指定引用的有效时间范围。这有助于编译器确保在引用被使用时,所…...
生成哈夫曼树(100%用例)C卷(JavaPythonC++Node.jsC语言)
给定长度为n的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。 为了保证输出的二又树中序遍历结果统一,增加以下限制:二叉树节点中,左节点权值小于等于右…...
el-form-item内的el-select如何自适应宽度
最近在使用element-ui做后台管理的时候,有个需求是在弹窗组件里面,添加一个el-select下拉框选项,但是给el-select设置的宽度无法自适应,原因很简单,我们不需要设置固定宽度,设置百分比就行了,让…...
什么洗地机值得推荐?旗舰洗地机希亦、追觅、西屋、海尔实际表现如何?
洗地机这个产品相信大家已经不陌生了,它集合吸尘器和电动扫地拖把的功能,轻轻推拉便可以解决地面上的赃物,且不用我们手动清洗滚刷,深得家务人的喜爱,可是,当我们真正要去选购的时候,还是很纠结…...
掘根宝典之C++隐式类型转化(整型提升,算术转换)
赋值中的隐式转换 话不多说,我们直接看例子 bool b42; //b为真 int ib; //i的值为1 i3.14; //i的值为3 double pi i; // pi的值为3.0 unsigned char c -1; // 假设char占8比特,c的值为255 s…...
group by order by having where union
力扣题目链接 having where 区别 having子句用于分组后筛选,where子句用于行条件筛选 having一般都是配合group by 和聚合函数一起出现如(count(),sum(),avg(),max(),min()) where条件子句中不能使用聚集函数,而having子句就可以。 having只能用在group…...
微信私信短剧机器人源码
本源码仅提供参考,有能力的继续开发 接口为api调用 云端同步 https://ys.110t.cn/api/ajax.php?actyingshilist 影视搜索 https://ys.110t.cn/api/ajax.php?actsearch&name剧名 每日更新 https://ys.110t.cn/api/ajax.php?actDaily 反馈接口 https://ys.11…...
java使用ws.schild.jave将视频转成mp4
<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://…...
python map函数
python map函数 文章目录 python map函数 在Python中, map()函数用于将一个函数应用于可迭代对象(如列表或元组)中的每个元素,并返回一个包含结果的新的可迭代对象。 map()函数的语法如下: map(function, iterable)其…...
基于SSM的党务政务服务热线平台(有报告)。Javaee项目。ssm项目。
演示视频: 基于SSM的党务政务服务热线平台(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spri…...
Unity3D 动态生成场景管理节点详解
前言 Unity3D 提供了丰富的功能和工具,可以帮助开发者快速高效地创建各种类型的游戏。在游戏开发过程中,有时候我们需要动态生成场景管理节点来管理游戏场景中的各种元素,比如角色、道具、敌人等。本文将详细介绍如何在Unity3D中动态生成场景…...
js--构造函数
创建对象的方式: 1、利用对象字面量{}创建 const arr {name: tom,age: 18 } 2、利用js内置构造(Object,Array,String,Number)函数 var obj new Object() //创建一个空的对象 obj.uname tom obj.age 2…...
Tomcat目录结构
文章目录 binconfliblogswebapp bin 存放tomcat的可执行程序 从上图可以看出bin中的文件主要是两种文件,一种是.bat一种是.sh .bat:主要用于windows .sh:主要用于linux .bat文件是Windows操作系统中的批处理文件。它是一种简单的文本文件,其中包含了一…...
读西游记第一回:西游记世界格局
天地之数: 元:十二万九千六百岁(129600年) 1元12会:子、丑、寅、卯、巳、午、未、申、酉、戌、亥。每会18000年。与12地支对应。 亥会期:前5400年混沌期,后5400年,盘古开天辟地&am…...
【Unity知识点详解】Button点击事件拓展,单击、双击、长按实现
Button拓展 今天来聊一下关于Button的事件拓展,这里只是拿Button来举例,Unity中其他的UI组件如Toggle、Slider等都也适用。 我们知道在Button中我们可以通过onClick的方式来添加点击事件,但在游戏开发过程中我们往往对Button有着更多的功能需…...
了解财富的本质才能知道自己几斤几两
生活在现代都市中,经历了经济的潮起潮落。在一望无际的楼宇下,是每天匆忙工作的一个个鲜活个体。有的在为了生存而工作,有的在享受着惬意的时光,有人行色匆匆,目光所及之处,尽是可遇不可求的机会。成为中产…...
机器学习模型—K最近邻(KNN)
机器学习模型—K最近邻(KNN) K最近邻 (KNN) 算法是一种用于解决分类和回归问题的监督机器学习方法。Evelyn Fix 和 Joseph Hodges 于 1951 年开发了该算法,随后 Thomas Cover 对其进行了扩展。本文探讨了 KNN 算法的基本原理、工作原理和实现。 虽然 k近邻算法 (KNN) 可以用…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
