文章目录
- 训练常用工具[tqdm][argparse][yaml]
- tqdm
- 1. 导入tqdm
- 2. 传入可迭代对象
- 快速使用
- 进阶1:通过`update()`自定义进度条每次更新的步长
- 进阶2:通过set_description和set_postfix自定义进度条内容
- Argparse
- 第一步:创建ArgumentParser对象
- 第二步:**给ArgumentParser对象添加参数,add_argument函数是核心!!**
- 第三步:解析得到参数
- Yaml
- yaml基本语法
- 数据类型
- 字面量:单个的,不可再分的值。
- 对象:键值对的组合
- 数组:一组按次序排列的值
- 第一步:基于yaml的语法编写yaml文件
- 第二步:读取yaml文件内容
- 第三步:有时候我们也可以保存参数到yaml文件中
训练常用工具[tqdm][argparse][yaml]
tqdm
1. 导入tqdm
from tqdm import *
2. 传入可迭代对象
快速使用
import time
for i in tqdm(range(100)):time.sleep(0.01)
100%|██████████| 100/100 [00:01<00:00, 98.07it/s]
使用trange(100)
简写tqdm(range(100))
for i in trange(100):time.sleep(0.01)
进阶1:通过update()
自定义进度条每次更新的步长
with tqdm(total=200) as pbar:for i in range(20): # 总共更新 20 次pbar.update(10) # 每次更新步长为 10time.sleep(1)
with tqdm(total=200) as pbar:
:这行代码初始化了一个进度条对象pbar
,设定总进度(total
)为200。这里的total=200
表示整个进度条代表的操作总量是200个单位。for i in range(20):
:设置一个循环,总共迭代20次。这表示我们计划通过20次迭代来完成总进度。pbar.update(10)
:在每次循环中,调用pbar
的update
方法来更新进度条。参数10
表示每次循环我们完成了总任务的10个单位。由于总任务量是200个单位,而我们每次更新10个单位,因此需要更新20次才能达到总进度,这与range(20)
设置的迭代次数相吻合。
中点在于每次迭代时,通过update(10)
更新进度条的内容
如果只循环10次,最终只会在进度条为100/200时停止。
进阶2:通过set_description和set_postfix自定义进度条内容
pbar = tqdm(total=100)
for i in range(10):time.sleep(0.1) # 模拟你的任务pbar.set_description("Epoch{}".format(i))# 显示进度条左部的内容pbar.set_postfix(batch=i, loss=0.1*i, accuracy=0.95-0.01*i, refresh=False)# 更新后缀信息以反映更多细节pbar.update(10)pbar.close()
进度条被设置了描述“Epoch i”,同时每次循环更新时,后缀显示了当前批次(batch)、损失(loss)和准确度(accuracy)。注意refresh=False
参数可以用来减少更新频率,以避免在某些情况下的性能问题。
Epoch9: 100%|██████████| 100/100 [00:01<00:00, 97.32it/s, accuracy=0.86, batch=9, loss=0.9]
Argparse
通过argparse库,能够在命令行中设置python文件的启动参数,同时根据获取的参数配置python文件中的对应部分。
第一步:创建ArgumentParser对象
parser = argparse.ArgumentParser("This is a Arg Parser!!")
第二步:给ArgumentParser对象添加参数,add_argument函数是核心!!
可以通过–help或者-h首先看看一个含有ArgumentParser对象的程序的提示信息:使用yolov5做例子
python train.py -h
usage: train.py [-h] [--weights WEIGHTS] [--cfg CFG] [--data DATA] [--hyp HYP] [--epochs EPOCHS] [--batch-size BATCH_SIZE] [--imgsz IMGSZ] [--rect] [--resume [RESUME]] [--nosave][--noval] [--noautoanchor] [--noplots] [--evolve [EVOLVE]] [--bucket BUCKET] [--cache [CACHE]] [--image-weights] [--device DEVICE] [--multi-scale] [--single-cls][--optimizer {SGD,Adam,AdamW}] [--sync-bn] [--workers WORKERS] [--project PROJECT] [--name NAME] [--exist-ok] [--quad] [--cos-lr][--label-smoothing LABEL_SMOOTHING] [--patience PATIENCE] [--freeze FREEZE [FREEZE ...]] [--save-period SAVE_PERIOD] [--seed SEED] [--local_rank LOCAL_RANK][--entity ENTITY] [--upload_dataset [UPLOAD_DATASET]] [--bbox_interval BBOX_INTERVAL] [--artifact_alias ARTIFACT_ALIAS]optional arguments:-h, --help show this help message and exit--weights WEIGHTS initial weights path--cfg CFG model.yaml path--data DATA dataset.yaml path--hyp HYP hyperparameters path--epochs EPOCHS total training epochs--batch-size BATCH_SIZEtotal batch size for all GPUs, -1 for autobatch--imgsz IMGSZ, --img IMGSZ, --img-size IMGSZtrain, val image size (pixels)--rect rectangular training--resume [RESUME] resume most recent training--nosave only save final checkpoint--noval only validate final epoch--noautoanchor disable AutoAnchor--noplots save no plot files--evolve [EVOLVE] evolve hyperparameters for x generations--bucket BUCKET gsutil bucket--cache [CACHE] image --cache ram/disk--image-weights use weighted image selection for training--device DEVICE cuda device, i.e. 0 or 0,1,2,3 or cpu--multi-scale vary img-size +/- 50%--single-cls train multi-class data as single-class--optimizer {SGD,Adam,AdamW}optimizer--sync-bn use SyncBatchNorm, only available in DDP mode--workers WORKERS max dataloader workers (per RANK in DDP mode)--project PROJECT save to project/name--name NAME save to project/name--exist-ok existing project/name ok, do not increment--quad quad dataloader--cos-lr cosine LR scheduler--label-smoothing LABEL_SMOOTHINGLabel smoothing epsilon--patience PATIENCE EarlyStopping patience (epochs without improvement)--freeze FREEZE [FREEZE ...]Freeze layers: backbone=10, first3=0 1 2--save-period SAVE_PERIODSave checkpoint every x epochs (disabled if < 1)--seed SEED Global training seed--local_rank LOCAL_RANKAutomatic DDP Multi-GPU argument, do not modify--entity ENTITY Entity--upload_dataset [UPLOAD_DATASET]Upload data, "val" option--bbox_interval BBOX_INTERVALSet bounding-box image logging interval--artifact_alias ARTIFACT_ALIASVersion of dataset artifact to use
可以发现这些参数都是optional arguments
,也就是关键字参数,当然还有位置参数,这个现在基本不用了;
主要写法:
parser.add_argument("--参数名","-参数名简写",type = ,default =默认值 ,action = ,help = "参数描述信息")
参数名
:由--
或者-
开头,表示可选参数,类似关键字参数,在命令行中可以不用指出;其他的都是位置参数,必须指出,且必须位置对应。例如--output
,-o
type
:指明参数的类型,int/float/bool/str/list/dict
default
:参数的默认值设置
action
:两个store_true
或者store_false
- store_true,当参数列表中出现了对应的参数,那么就会设置为True
- store_false,当参数列表中出现了对应的参数,那么就会设置为False
- 注意,指定了action的参数,不能在后面加上任何内容,否则会报错
help
:参数的描述信息,在运行-h时会指出所有参数的描述信息,帮助理解。
目前的用法就是这些,具体其他用法可以参考文档:argparse 教程 — Python 3.12.2 文档。
或者参考其他教程:argparse模块用法实例详解 - 知乎 (zhihu.com)
第三步:解析得到参数
args = parser.parse_args()
解析得到的参数会被存储在一个由argparse
生成的Namespace
对象中。这个对象将命令行指定的每个参数作为一个属性,属性名与你在添加参数时使用的字符串相对应(去掉了前面的--
)。如果参数未在命令行中提供,那么它将使用在add_argument
函数中指定的默认值。
python your_script.py --weights yolov5s.pt --imgsz 320 --rect --device 0
解析得到的对象:
Namespace(weights='yolov5s.pt', cfg='', data='data/coco128.yaml', hyp='data/hyps/hyp.scratch-low.yaml', epochs=100, batch_size=16, imgsz=320, rect=True, resume=False, nosave=False, noval=False, noautoanchor=False, noplots=False, evolve=None, bucket='', cache=None, image_weights=False, device='0', multi_scale=False, single_cls=False, optimizer='SGD', sync_bn=False, workers=8, project='runs/train', name='exp', exist_ok=False, quad=False, cos_lr=False, label_smoothing=0.0, patience=100, freeze=[0], save_period=-1, seed=0, local_rank=-1, entity=None, upload_dataset=False, bbox_interval=-1, artifact_alias='latest')
如何获取参数呢?
直接通过.
获取args中的属性:
args.epochs
args.batch_size
…
Yaml
yaml全称Yeah Another Markup Language.(仍是一种标记语言)。他非常适合用来做以数据为中心的配置文件。
使用yaml目的:复杂代码可以实现仅修改yaml文件,重新运行打开yaml文件的python命令后参数就可以更新。不需要在python文件中找需要修改的参数位置。这个对于配置模型训练的超参数很有用!!
yaml基本语法
- 键值对。key: value。(冒号:后边要接一个空格)
- 大小写敏感
- 用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 用#表示注释
- 单引号‘’与双引号“”表示字符串内容,其中单引号中的内容不会被转义,双引号中的内容会被转义:
- 如果是在单引号中用\n,那么,会直接输出\n
- 如果是在双引号中用\n,那么,会输出换行
数据类型
字面量:单个的,不可再分的值。
例如:date、boolean、string、number、null
key: value
对象:键值对的组合
例如map、hash、set、object
key: {key1: value1,key2: value2,key3: value3}
或者用
key:key1: value1key2: value2key3: value3
数组:一组按次序排列的值
例如:array、list、queue
key: [value1, value2, value3]
或者用
key:- value1- value2- value3
语法参考文档:
python使用yaml模块_python get_yaml_data-CSDN博客
Python使用第三方库之【yaml】_yaml 是paython的一个什么库-CSDN博客
第一步:基于yaml的语法编写yaml文件
例如config.yml
:
nb:user: adminpsw: 123456
第二步:读取yaml文件内容
- 使用open直接打开读取
# 用open方法打开直接读取
f = open(ymlPath, 'r')
cfg = f.read()
print(type(cfg)) # 读取的结果是 字符串
print(cfg)
- 使用load方法转换成字典
d = yaml.load(cfg) # 用load方法转字典
print(d)
print(type(d))
第三步:有时候我们也可以保存参数到yaml文件中
使用dump()
,将一个Python对象生成为一个yaml文档
a = {'name': 'Jack','race': 'Human','traits': ['Two_Hand', 'Two_Eye']
}
ret = yaml.dump(a)
print(ret)
print(type(ret))