物体检测-系列教程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
  1. 更新学习率调度器的状态,根据预定的策略(如学习率衰减)调整学习率,以帮助模型更好地收敛
  2. 如果不是分布式训练或者在分布式训练的主进程:
  3. 如果使用了指数移动平均(EMA)模型,将更新EMA模型的属性:
  4. 更新EMA模型的属性,包括模型配置(yaml)、类别数量(nc)、超参数(hyp)、损失比例(gr)、类别名称(names)和步长(stride),这是为了确保EMA模型与训练模型保持同步
  5. final_epoch ,判断当前epoch是否是训练的最后一个epoch,确定何时执行一些只在训练结束时需要进行的操作(如保存模型)非常关键
  6. 如果设置为在每个epoch结束时都进行测试(notest为False)或者当前是最后一个epoch,则执行模型测试
  7. 从测试脚本中调用测试函数,进行模型评估。计算模型在测试集上的性能指标,包括精度、召回率和mAP等。根据是否使用EMA以及是否在模型上使用了DataParallel或DistributedDataParallel,选择适当的模型进行评估
  8. 打开测试文件
  9. 将测试结果写入到指定的文件中,results_file是存储结果的文件路径,s是包含训练信息的字符串,results包含了测试指标的值
  10. 如果指定了云存储桶(bucket)和文件命名(name)
  11. 将结果文件上传到云存储
  12. 如果配置了TensorBoard日志记录器
  13. 定义一组标签,用于在TensorBoard中组织不同的训练和验证指标
  14. 遍历每个指标及其对应的标签
  15. 使用TensorBoard的add_scalar函数记录这些指标,在TensorBoard中进行可视化
  16. fi ,调用辅助函数fitness计算一个综合性能指标(称为"fitness"),它基于测试结果(例如精度、召回率、mAP等)
  17. 如果当前epoch的fitness分数高于迄今为止的最佳分数,则
  18. best_fitness ,更新最佳fitness分数
  19. save ,决定是否保存模型。如果不是显式地设置为不保存模型(nosave为False),或者当前是最后一个epoch并且没有进行模型进化(evolve为False),则保存模型
  20. 如果满足保存模型的条件:
  21. 读取并保存当前模型的状态,包括epoch数、最佳fitness分数、训练结果、模型本身以及优化器的状态(如果不是最后一个epoch)
  22. 将模型的状态保存到文件中。last变量代表最后一个checkpoint的文件名
  23. 如果当前模型的fitness等于最佳fitness,则
  24. 将其保存为最佳模型的checkpoint
  25. 删除临时保存的模型状态字典,释放内存

这部分展示了在训练过程中每个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
  1. 如果不是分布式训练或者是分布式训练的主进程:
  2. n,构造文件名的前缀。如果用户提供了命名(opt.name)且名称不是全数字,则在名称前加上下划线;否则直接使用名称。这有助于生成更具可读性和组织性的文件名
  3. fresults, flast, fbest,基于上一步得到的名称前缀n,构造结果文件、最后一个模型状态文件和最佳模型状态文件的完整路径
  4. 使用for循环结合zip函数遍历原始文件名和新文件名的列表,f1是原始文件名,f2是新文件名
  5. 如果原始文件(f1)存在
  6. 则将其重命名为新的文件名(f2),保持文件命名的一致性和可识别性
  7. ispt ,判断文件是否是.pt格式的模型文件,对于接下来是否执行某些特定操作(如剥离优化器状态)很关键
  8. 如果文件是.pt格式的模型文件,则执行辅助函数strip_optimizer,从模型文件中移除优化器的状态。这可以减小文件大小,便于分享或部署模型
  9. 如果指定了云存储桶(opt.bucket)且文件是模型文件,则使用gsutil cp命令将文件上传到云存储桶中。这便于模型的远程存储和访问
  10. 如果不是在执行进化训练(opt.evolve)
  11. 调用辅助函数plot_results,在指定的日志目录中保存训练结果的图表(通常为results.png),有助于可视化训练过程
  12. 记录一条日志信息,训练完成,包括完成的epochs数和总耗时(以小时计)
  13. 如果当前进程是分布式训练中的非主进程,则销毁进程组。这是分布式训练结束时的清理工作,有助于正确地关闭分布式训练环境
  14. 清空CUDA缓存。这有助于释放未使用的GPU内存,使其可用于其他应用程序
  15. 返回训练过程中的最终结果,包括模型性能指标等重要信息

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

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

相关文章

同城即配年度观察:顺丰同城率先全年盈利,行业破局迎参考

即时消费趋势增强,“万物到家即时可得”成为了消费新常态。这创造出不可忽视的场景潜力,也在无形中让龙头企业的发展质量走到突破点。 3月11日晚,“第三方即时配送第一股”顺丰同城发布公告称,预期实现2023年全年盈利&#xff0c…

Python的os模块,必学干货!

1.os模块作用 主要是用来完成对文件或者文件夹的操作 2.导入os模块 import os 3.listdir() 查看指定目录下面所有的文件或者文件夹 print(os.listdir(r"D:\PycharmProjects\pythonProject")) # [.idea, 01_语法, 02_函数, 03_类型转换, 04_运算符, 05_分支结…

深入解析C++树形关联式容器:map、set及其衍生容器的使用与原理

文章目录 一、引言二、关联式容器的中的 paira.pair 的创建及使用b.pair 间的比较 三、 map 与 set 详解1. map 的基本操作2. set 的基本操作3.关联式容器的迭代器 四、 multimap 与 multiset 的特性五、关联式容器的使用技巧与注意事项1. 键值类型的选择与设计2. 自定义比较函…

Python基础学习(4)散列类型(无序序列)

文章目录 一,认识集合1.定义2.运算 二.集合方法1.删2.增 三.认识字典1.字典(dict)2.特性3.字典方法①查②改③增④删 四.声明空变量 Python基础学习(1)基本知识 Python基础学习(2)序列类型方法与数据类型转换 Python基础学习(3)进阶字符串(格式化输出) Python基础学习(4)散列类…

专题1 - 双指针 - leetcode 15. 三数之和 - 中等难度

leetcode 15. 三数之和 - 点击直达 leetcode 15. 三数之和 中等难度 双指针1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 15. 三数之和 中等难度 双指针 1. 题目详情 给你一个整数数组 nums &#…

通过xlsx库解析读取excel表格内容

一、使用 有时项目中有需要前端自己将本地的excel文件导入并获取内部数据,最终处理数据(批量导入等场景) 这时我们就可以用到一个库(xlsx)来读取excel中的内容,然后通过其API能力将数据转换成json格式 具…

Pytorch实战01——CIAR10数据集

目录 1、model.py文件 (预训练的模型) 2、train.py文件(会产生训练好的.th文件) 3、predict.py文件(预测文件) 4、结果展示: 1、model.py文件 (预训练的模型) impor…

吴恩达机器学习笔记 十七 通过偏差与方差诊断性能 正则化 偏差 方差

高偏差(欠拟合):在训练集上表现得也不好 高方差(过拟合):J_cv要远大于J_train 刚刚好:J_cv和J_train都小 J_cv和J_train与拟合多项式阶数的关系 从一阶到四阶,训练集的误差越来越小…

力扣串题:验证回文串2

整体思路&#xff1a;先找到可能存在问题的点&#xff0c;然后判断&#xff0c;如果一切正常则左指针会来到字符串中部 bool isValidPalindrome(char *s, int i, int j) {while (i < j) {if (s[i] ! s[j]) {return false;}i;j--;}return true; }bool validPalindrome(char …

禁用文本框输入中文,禁用中文输入法的ImeMode方法

之前遇到一个问题&#xff0c;在文本框切换输入法为中文后&#xff0c;使用扫码枪扫码时 会出现 比如条码NH123456 在文本框内会显示 你好23456 这里可以使用输入法编辑器ImeMode枚举属性 如果文本框只能输入英文数字&#xff0c;可以使用ImeMode.Disable&#xff0c;但默…

python界面开发 - Canvas绘制图形

文章目录 1. Tkinter 开发2. Canvas绘制图形2.1. 示例1:绘制矩形、椭圆和多边形2.2. 示例2:绘制柱状图、折线图2.3. 示例3&#xff1a;同时绘制多个画布 3. python图形界面开发3.1. Python图形界面开发——Tkinter3.2. Python图形界面开发——PyQt3.3. Python图形界面开发——w…

LeetCode(力扣)算法题_1261_在受污染的二叉树中查找元素

今天是2024年3月12日&#xff0c;可能是因为今天是植树节的原因&#xff0c;今天的每日一题是二叉树&#x1f64f;&#x1f3fb; 在受污染的二叉树中查找元素 题目描述 给出一个满足下述规则的二叉树&#xff1a; root.val 0 如果 treeNode.val x 且 treeNode.left ! n…

js【详解】ajax (含XMLHttpRequest、 同源策略、跨域)

ajax 的核心API – XMLHttpRequest get 请求 // 新建 XMLHttpRequest 对象的实例 const xhr new XMLHttpRequest(); // 发起 get 请求&#xff0c;open 的三个参数为&#xff1a;请求类型&#xff0c;请求地址&#xff0c;是否异步请求&#xff08; true 为异步&#xff0c;f…

探秘Elasticsearch:高性能搜索引擎的原理与应用场景(一)

本系列文章简介&#xff1a; 本系列文章将探秘Elasticsearch的原理与应用场景&#xff0c;从基本原理到具体应用&#xff0c;带领读者全面了解这一强大的搜索引擎。首先我们将介绍Elasticsearch的基本原理&#xff0c;包括分布式架构、倒排索引和分片等核心概念。然后我们将深入…

【Python】shutil库的介绍及用法

目录 1、应用场景 2、shutil-标准库 1、应用场景 Python的shutil库主要用于文件的读取、创建、复制、删除、移动等操作&#xff0c;以下是一些典型的使用场景&#xff1a; 复制文件&#xff1a; 使用shutil.copy(src, dst)可以复制一个文件。源和目标位置都可以是文件也可以…

ChatGPT免费使用网站分享大全,可以直接访问

方法在结尾 介绍&#xff1a; ChatGPT是OpenAI公司开发的一种基于大规模预训练的语言模型。作为GPT-3系列的最新版本&#xff0c;GPT-3.5 Turbo集成了最新的技术改进&#xff0c;具备了更强大的对话生成能力。 GPT-3.5 Turbo是一个自动对话系统&#xff0c;它能够理解和生成…

Linux使用git命令行教程

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 git安装git仓库的创建.git 文件添加文件git 三板斧(add,commit,push)解释拓展git log.gitignore git安装 首先输入git --version看看有没有安装git 如…

Python语言在编程业界的地位——《跟老吕学Python编程》附录资料

Python语言在编程业界的地位——《跟老吕学Python编程》附录资料 ⭐️Python语言在编程业界的地位2024年3月编程语言排行榜&#xff08;TIOBE前十&#xff09; ⭐️Python开发语言开发环境介绍1.**IDLE**2.⭐️PyCharm3.**Anaconda**4.**Jupyter Notebook**5.**Sublime Text** …

操作系统——cpu、内存、缓存介绍

一、内存是什么 内存就是系统资源的代名词&#xff0c;它是其他硬件设备与 CPU 沟通的桥梁&#xff0c; 计算机中的所有程序都在内存中运行。其作用是暂时存放CPU的运算数据&#xff0c;以及与硬盘交换的数据。也是相当于CPU与硬盘沟通的桥梁。只要计算机在运行&#xff0c;CP…

【C++那些事儿】深入理解C++类与对象:从概念到实践(下)| 再谈构造函数(初始化列表)| explicit关键字 | static成员 | 友元

&#x1f4f7; 江池俊&#xff1a;个人主页 &#x1f525; 个人专栏&#xff1a;✅C那些事儿 ✅Linux技术宝典 &#x1f305; 此去关山万里&#xff0c;定不负云起之望 文章目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit 关键字 2. static成员2.1 概念…