深度学习训练中常用的三个基础库tqdm&argparse&yaml

本文详细介绍了Python中用于训练过程中的三个常用工具:tqdm用于进度条控制,argparse处理命令行参数,yaml用于配置文件管理。通过示例展示了如何灵活使用这些工具来优化代码和配置管理。
摘要由CSDN通过智能技术生成

训练常用工具[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)  # 每次更新步长为 10
        time.sleep(1)
  • with tqdm(total=200) as pbar::这行代码初始化了一个进度条对象pbar,设定总进度(total)为200。这里的total=200表示整个进度条代表的操作总量是200个单位。
  • for i in range(20)::设置一个循环,总共迭代20次。这表示我们计划通过20次迭代来完成总进度。
  • pbar.update(10):在每次循环中,调用pbarupdate方法来更新进度条。参数10表示每次循环我们完成了总任务的10个单位。由于总任务量是200个单位,而我们每次更新10个单位,因此需要更新20次才能达到总进度,这与range(20)设置的迭代次数相吻合。

中点在于每次迭代时,通过update(10)更新进度条的内容

如果只循环10次,最终只会在进度条为100/200时停止。

image-20240401173641194

进阶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_SIZE
                        total batch size for all GPUs, -1 for autobatch
  --imgsz IMGSZ, --img IMGSZ, --img-size IMGSZ
                        train, 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_SMOOTHING
                        Label smoothing epsilon
  --patience PATIENCE   EarlyStopping patience (epochs without improvement)
  --freeze FREEZE [FREEZE ...]
                        Freeze layers: backbone=10, first3=0 1 2
  --save-period SAVE_PERIOD
                        Save checkpoint every x epochs (disabled if < 1)
  --seed SEED           Global training seed
  --local_rank LOCAL_RANK
                        Automatic DDP Multi-GPU argument, do not modify
  --entity ENTITY       Entity
  --upload_dataset [UPLOAD_DATASET]
                        Upload data, "val" option
  --bbox_interval BBOX_INTERVAL
                        Set bounding-box image logging interval
  --artifact_alias ARTIFACT_ALIAS
                        Version 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基本语法

  1. 键值对。key: value。(冒号:后边要接一个空格)
  2. 大小写敏感
  3. 用缩进表示层级关系
  4. 缩进不允许使用tab,只允许空格
  5. 用#表示注释
  6. 单引号‘’与双引号“”表示字符串内容,其中单引号中的内容不会被转义,双引号中的内容会被转义:
    • 如果是在单引号中用\n,那么,会直接输出\n
    • 如果是在双引号中用\n,那么,会输出换行

数据类型

字面量:单个的,不可再分的值。

例如:date、boolean、string、number、null

key: value
对象:键值对的组合

例如map、hash、set、object

key: {key1: value1,key2: value2,key3: value3}

或者用

key:
    key1: value1
    key2: value2
    key3: 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: admin
  psw: 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))
  • 12
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值