yolov8逐步分解(7)_模型训练初始设置之优化器Optimizer及学习率调度器Scheduler初始化

yolov8逐步分解(1)--默认参数&超参配置文件加载

yolov8逐步分解(2)_DetectionTrainer类初始化过程

yolov8逐步分解(3)_trainer训练之模型加载

YOLOV8逐步分解(4)_模型的构建过程

YOLOV8逐步分解(5)_模型训练初始设置之混合精度训练AMP

YOLOV8逐步分解(6)_模型训练初始设置之image size检测batch预设及dataloder初始化

        接逐步分解(6),继续模型训练初始设置的讲解,本章将讲解优化器Optimizer及学习率调度器Scheduler的初始代码。

1.优化器Optimizer

        # Optimizerself.accumulate = max(round(self.args.nbs / self.batch_size), 1)  # accumulate loss before optimizingweight_decay = self.args.weight_decay * self.batch_size * self.accumulate / self.args.nbs  # scale weight_decayiterations = math.ceil(len(self.train_loader.dataset) / max(self.batch_size, self.args.nbs)) * self.epochsself.optimizer = self.build_optimizer(model=self.model,name=self.args.optimizer,lr=self.args.lr0,momentum=self.args.momentum,decay=weight_decay,iterations=iterations)

        设置优化器相关的参数。下面介绍每一行代码的作用:

1.1 self.accumulate = max(round(self.args.nbs / self.batch_size), 1):

        这一行计算梯度累积的步数。

        self.args.nbs 表示每次梯度更新前需要累积的批次数(Nominal Batch Size)。

        self.batch_size 是实际使用的批量大小。

        这个公式确保每次梯度更新前至少会累积 1 个批次。

1.2 weight_decay = self.args.weight_decay * self.batch_size * self.accumulate / self.args.nbs:

        这一行计算权重衰减(weight decay)的值。

        权重衰减是一种正则化方法,用于防止模型过拟合。

        这个公式将原始的权重衰减值 self.args.weight_decay 进行了缩放,使其与批量大小和梯度累积步数相关。

1.3 iterations = math.ceil(len(self.train_loader.dataset) / max(self.batch_size, self.args.nbs)) * self.epochs:

        这一行计算总的训练迭代次数。

        它先计算每个 epoch 中的迭代次数,然后乘以总的 epoch 数。

        每个 epoch 中的迭代次数是通过将训练数据集的长度除以批量大小或 self.args.nbs 的最大值,并向上取整得到的。

1.4 self.optimizer = self.build_optimizer(model=self.model,                                        name=self.args.optimizer,  lr=self.args.lr0,                                        momentum=self.args.momentum,                                        decay=weight_decay,  iterations=iterations):

        这一行创建了优化器对象。

        它调用了 self.build_optimizer() 函数,传入了以下参数:

                model=self.model: 要优化的模型

                name=self.args.optimizer: 优化器的名称

                lr=self.args.lr0: 初始学习率

                momentum=self.args.momentum: 动量参数

                decay=weight_decay: 刚刚计算的权重衰减值

                iterations=iterations: 总的训练迭代次数

        这段代码的目的是根据一些超参数梯度累积步数,来计算出合适的权重衰减值和总的训练迭代次数,并使用这些参数创建一个优化器对象。

2. 学习率调度器Scheduler

关于学习率调度器的详细介绍可以查看文章:深度学习之学习率调度器Scheduler介绍

        # Schedulerif self.args.cos_lr:self.lf = one_cycle(1, self.args.lrf, self.epochs)  # cosine 1->hyp['lrf']else:self.lf = lambda x: (1 - x / self.epochs) * (1.0 - self.args.lrf) + self.args.lrf  # linearself.scheduler = optim.lr_scheduler.LambdaLR(self.optimizer, lr_lambda=self.lf)self.stopper, self.stop = EarlyStopping(patience=self.args.patience), Falseself.resume_training(ckpt) #恢复训练过程。ckpt 是一个检查点文件,用于加载之前保存的模型和训练状态。self.scheduler.last_epoch = self.start_epoch - 1  # do not moveself.run_callbacks('on_pretrain_routine_end') #运行预训练过程结束时的回调函数。

学习率调度器(Scheduler)的设置。下面介绍每一行代码的作用:

2.1 if self.args.cos_lr: 和 else::

        这里根据 self.args.cos_lr 的值来决定使用余弦学习率衰减还是线性学习率衰减。

        self.lf = one_cycle(1, self.args.lrf, self.epochs) 和 self.lf = lambda x: (1 - x / self.epochs) * (1.0 - self.args.lrf) + self.args.lrf:

        这两行分别定义了两种不同的学习率调整函数 self.lf。

        第一个函数是使用 "one cycle" 策略,其中学习率从 1 逐渐降到 self.args.lrf。

        第二个函数是使用线性衰减,学习率从 1.0 逐渐降到 self.args.lrf。

2.2 self.scheduler = optim.lr_scheduler.LambdaLR(self.optimizer, lr_lambda=self.lf):

        这一行创建了一个 PyTorch 的学习率调度器对象 self.scheduler。

        它使用刚才定义的 self.lf 函数来动态调整学习率。

2.3 self.stopper, self.stop = EarlyStopping(patience=self.args.patience), False:

        这一行创建了一个 "Early Stopping" 对象 self.stopper。

        self.args.patience 是提前停止训练的等待轮数,如果验证集指标在这么多轮内都没有提升,则停止训练。

        self.stop 标志位用于指示是否应该停止训练。

2.4 self.resume_training(ckpt):

        这一行恢复之前保存的训练状态,包括模型参数和优化器状态等。

        ckpt 是一个检查点文件,包含了之前保存的训练状态。

2.5 self.scheduler.last_epoch = self.start_epoch - 1:

        这一行设置学习率调度器的当前 epoch 为上一个 epoch,因为后续训练会从 self.start_epoch 开始。

2.6 self.run_callbacks('on_pretrain_routine_end'):

        这一行运行预训练过程结束时的回调函数。

        回调函数可以用于在训练过程的不同阶段执行自定义操作。

        总的来说,这段代码设置了学习率调度器和提前停止机制,并恢复了之前保存的训练状态,最后运行了预训练过程结束时的回调函数。这些设置都是为了提高训练的效率和性能。

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

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

相关文章

xjoi题库一级八段题解(c语言版)

求和 时间:1s 空间:128M 题目描述: 给你n个数,求出它们的和 输入格式: 第一行输入一个整数n,表示数的个数 接下来n行,每行一个数,表示要加起来的数。 输出格式: 输出n个…

conda修改环境名称后,无法安装包,显示no such file

1问题描述 原本创建环境时设置的名字不太合适,但是因为重新创建环境很麻烦,安装很多包。。所以想直接对包名进行修改,本人采用的方式是直接找到conda环境的文件目录,然后修改文件名,简单粗暴。确实修改成功了&#xf…

模拟集成电路(5)----单级放大器(共栅级)

模拟集成电路(5)----单级放大器(共栅级) 有一些场合需要一些小的输入电阻(电流放大器) 大信号分析 − W h e n V i n ≥ V B − V T H ∙ M 1 i s o f f , V o u t V D D − F o r L o w e r V i n I d 1 2 μ n C o x W L ( V…

手摸手教你uniapp原生插件开发

行有余力,心无恐惧 这篇技术文章写了得有两三个礼拜,虽然最近各种事情,工作上的生活上的,但是感觉还是有很多时间被浪费.还记得几年前曾经有一段时间7点多起床运动,然后工作学习,看书提升认知.现在我都要佩服那会儿的自己.如果想回到那种状态,我觉得需要有三个重要的条件. 其…

xcode依赖包package已经安装,但是提示No such module ‘Alamofire‘解决办法

明明已经通过xcode自带的swift包管理器安装好了依赖包,但是却还是提示:No such module,这个坑爹的xcode,我也只能说服气,但是无奈,没办法攻打苹果总部,只能自己想解决办法了 No such module Ala…

香港优才计划找中介是否是智商税,靠谱中介又该如何找?

关于香港优才计划的申请,找中介帮助还是自己DIY,网络上充斥的声音太多,对不了解的人来说,难以抉择的同时还怕上当受骗。 这其中很容易误导人的关键在于——信息差! 今天这篇文章的目的就是想让大家看清一些中介和DIY…

evaluate.load(metric)和dataset.load_metric(metric)

evaluate.load 和 dataset.load_metric 是两个不同的库中用于加载评估指标的方法,分别属于 evaluate 库和 datasets 库。它们虽然功能相似,但在使用场景和细节上有一些区别。 evaluate.load(metric) evaluate 库是 Hugging Face 提供的一个专门用于评估…

CentOS 7.9 源码编译安装maven

CentOS 7.9 源码编译安装maven Centos镜像源中没有maven,通过下载源码编译进行安装: # 下载 $ wget https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz --no-check-certificate $ tar xf apache-maven-3.9.6-bin.…

Python的类全面系统学习

文章目录 1. 基本概念1.1 类(Class)1.2 对象(Object) 2. 类的属性和方法3. 类的继承3.1 继承的概念3.2 单继承3.3 多重继承 4. 方法重写与多态4.1 方法重写4.2 多态 5. 特殊方法与运算符重载5.1 特殊方法(魔法方法&…

MoE模型大火,源2.0-M32诠释“三个臭皮匠,顶个诸葛亮”!

文 | 智能相对论 作者 | 陈泊丞 近半年来,MoE混合专家大模型彻底是火了。 在海外,OpenAI的GPT-4、谷歌的Gemini、Mistral AI的Mistral、xAI的Grok-1等主流大模型都采用了MoE架构。而在国内,浪潮信息也刚刚发布了基于MoE架构的“源2.0-M3…

读取csv文件

问题: 一直显示是非数值型数据 解决:原来是sep“\t”,改为sep","即可 注:读取csv文件时,sep为关键词划分 import pandas as pd data pd.read_csv("y.csv",sep",") # data pd.read_…

C++【缺省参数|函数重载|引用】

目录 1 缺省参数 1.1 全缺省 1.2 半缺省 注意 1.3 应用 2 函数重载 函数重载的概念 1、参数类型不同 2、参数个数不同 3、参数类型顺序不同 3 引用 3.1 引用概念 3.2 引用特性 3.3 常引用 3.4 使用场景 3.5 传值、传引用效率比较 3.6 引用和指针的区别 1 缺…

leetcode 2981.找出出现至少三次的最长子特殊字符串(纯哈希表暴力)

leetcode 2981.找出出现至少三次的最长子特殊字符串(传送门) class Solution { public:int maximumLength(string s) {int hash[30][52] { 0 },len 1,maxn0;char last A;for (char ch : s) {if (ch last) len;else len 1;for (int i len; i > …

基于51单片机的温度+烟雾报警系统设计

一.硬件方案 本设计采用51单片机为核心控制器,利用气体传感器MQ-2、ADC0832模数转换器、DS18B20温度传感器等实现基本功能。通过这些传感器和芯片,当环境中可燃气体浓度或温度等发生变化时系统会发出相应的灯光报警信号和声音报警信号,以此来…

输入输出(2)——C++的标准输出流

目录 一、C的标准输出流 (一)cout、cerr和clog流对象 1、cout 流对象 2、cerr 流对象 3、clog流对象 (二)用函数put输出字符 (三)用函数 write 输出字符 一、C的标准输出流 标准输出流——流向标准输…

【C++课程学习】:二叉树的基本函数实现

🎁个人主页:我们的五年 🔍系列专栏:C课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🍉二叉树的结构类型: 🍉1.创建二叉树函数(根据数组&am…

如何向一个六岁的孩子讲解JavaScript 闭包的工作原理是什么?

作为一位六岁孩子的父亲,目前我正在教小孩子们编程(同时我自己也是一个对编程没有正式教育的新手),我认为最好的学习方式是通过实际操作。如果六岁的孩子已经准备好理解闭包的概念,那么他们也足够大,可以自己动手试一试。下面的解释文字可能更适合十岁左右的孩子。 案例…

30【Aseprite 作图】桌子——拆解

1 桌子只要画左上方,竖着5,斜着3个1,斜着两个2,斜着2个3,斜着一个5,斜着一个很长的 然后左右翻转 再上下翻转 在桌子腿部分,竖着三个直线,左右都是斜线;这是横着水平线不…

Python os.path.isfile() 和 os.path.isdir() 函数

Python os.path.isfile 和 os.path.isdir 函数 正文 正文 在网上看到很多人对这两个函数的用法有过说明,然而感觉都没有说到它们的本质,这里特来记录一下。os.path.isfile() 用来判断所给参数是否一个文件。os.path.isdir() 用来判断所给的参数是否是一…

Mybatis多表查询

MyBatis-多表查询-一对一查询(方式一) 一个菜品对应一个分类 直接菜品记录category对象 菜品id写入Dish,后面的分类直接写入 Category类 封装,如果sql不能封装上,那么直接使用resultmap封装 使用resultType只能封装基本属性 所以要定义一个resultmap手动封装 使用标签 要…