python tqdm进度条详解

文章目录

    • 1. 语法
      • 1.1 tqdm 参数
      • 1.2 bar_format
        • 案例
    • 2. 基本用法
      • 2.1 指定可迭代对象
      • 2.2 指定迭代次数
      • 2.3 设置显示信息
        • 2.3.1 设置进度条前缀(左侧)信息
        • 2.3.2 显示进度条后缀(右侧)信息
    • 3. 项目案例
    • 参考

tqdm 是 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息。用户只需要封装任意的迭代器,是一个快速、扩展性强的进度条工具库。

1. 语法

1.1 tqdm 参数

tqdm(iterable=None, desc=None, total=None, leave=True, file=None,ncols=None, mininterval=0.1, maxinterval=10.0, miniters=None,ascii=None, disable=False, unit='it', unit_scale=False,dynamic_ncols=False, smoothing=0.3, bar_format=None, initial=0,position=None, postfix=None, unit_divisor=1000, write_bytes=None,lock_args=None, nrows=None, colour=None, delay=0, gui=False,**kwargs):
  • iterable: 接收一个可迭代对象。如果iterable为空的话,则手动通过update来更新迭代
  • total: 总的迭代次数,用于计算进度百分比, 默认等于len(iterable)
  • desc: 进度条的显示信息,显示在进度条前面(前缀)
  • postfix: 字典形式信息,例如:loss=0.56, 显示在进度条的末尾(后缀)
  • mininterval:设置进度条最小的更新间隔,单位,默认:0.1s
  • maxinterval: 设置进度条最大更新间隔,单位,默认:10s
  • bar_format: 设置进度条显示格式,默认为 {desc}: {percentage:3.0f}%|{bar}| {n_fmt}/{total_fmt}
  • ncols: 设置进度条的宽度
  • nrows: 设置进度条的高度
  • unit: 设置进度条的单位,str类型,默认为it

这些参数为相对比较常用的参数,并且全部都是可选参数(optional);在自定义进度条当中比较重要的的一个参数为:bar_format,用于定义进度条的具体格式,所包含的具体数据信息;

1.2 bar_format

下面主要介绍这个参数的具体用法;

  • bar_format默认格式为: {l_bar}{bar}{r_bar}
  • 进度条分为三部分: 中间的条形图(bar),条形图左边信息(l_bar)、条形图右边信息(r_bar)
  • l_bar {desc}: {percentage:3.0f}%| , 即前缀信息(desc)+ 当前进度的百分比
  • bar: 进度条
  • r_bar: |{n_fmt}/{total_fmt}[{elapsed}<{remaining},{rate_fmt}{postfix}]

100%|█████████████████| 3/3 [00:03<00:00, 1.00s/it]

percentage:百分比
n_fmt:当前数
total_fmt:总数
elapsed:消耗的时间
remaining:剩余时间
rate_fmt:速率
postifx:后缀字典描述
desc: 前缀字符串描述
desc、postfix默认为空;
for item in tqdm(data, desc="Processing", bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, {rate_fmt}{postfix}]"):# 在这里添加你的代码
案例

yolov8 代码中将tqdm中的bar_format进行了设置,没有使用原有的bar_format格式, 简化了显示内容。

TQDM_BAR_FORMAT = "{l_bar}{bar:10}{r_bar}" if VERBOSE else None

基于新的bar_format格式,重新封装了tqdm,代码如下

from tqdm import tqdm as tqdm_original
class TQDM(tqdm_original):def __init__(self, *args, **kwargs):"""Initialize custom Ultralytics tqdm class with different default arguments."""# Set new default values (these can still be overridden when calling TQDM)kwargs["disable"] = not VERBOSE or kwargs.get("disable", False)  # logical 'and' with default value if passedkwargs.setdefault("bar_format", TQDM_BAR_FORMAT)  # override default value if passedsuper().__init__(*args, **kwargs)
  • 可以看到,TQDM和原来的tqdm 基本是是一样的,只是自定义了bar_format的形式,使得显示更加简洁。
  • 利用TQDM代替原有的tqdm, 使用方法是一样的
pbar = TQDM(enumerate(self.train_loader), total=nb)

2. 基本用法

2.1 指定可迭代对象

传入迭代器对象(iterable), 默认迭代次数为:len(iterable),:

import time
from tqdm import *
for i in tqdm(range(1000)):time.sleep(.01)   #进度条每0.01s前进一次,总时间为1000*0.01=10s # 运行结果如下
100%|██████████| 1000/1000 [00:10<00:00, 93.21it/s]  

2.2 指定迭代次数

如果没有传入可迭代对象,可以使用total指定迭代总数,并配合update手动更新进度条

from tqdm import tqdm
import timepbar = tqdm(total=200) # 设置总长度
for i in range(100):time.sleep(0.05)# 每次更新进度条的长度pbar.update(1) # 相当于在当前长度的基础上 +1 的操作pbar.close()
  • 由于进度条总长200,现在累加到100就停止,因此最终会停在50%
  • pbar.update(1) : update中传入更新的步长

2.3 设置显示信息

2.3.1 设置进度条前缀(左侧)信息
  • (1) 利用desc参数,指定进度条左侧显示的信息
s = ('%20s' + '%11s' * 6) % ('Class', 'Images', 'Labels', 'P', 'R', 'mAP@.5', 'mAP@.5:.95')
pbar = tqdm(dataloader, desc=s, bar_format='{l_bar}{bar:10}{r_bar}{bar:-10b}')
for batch_i, (im, targets, paths, shapes) in enumerate(pbar):pass

等价于:

s = ('%20s' + '%11s' * 6) % ('Class', 'Images', 'Labels', 'P', 'R', 'mAP@.5', 'mAP@.5:.95')
pbar = tqdm(dataloader, bar_format='{l_bar}{bar:10}{r_bar}{bar:-10b}')
for batch_i, (im, targets, paths, shapes) in enumerate(pbar):pbar.desc = s
  • (2) 使用set_description, 指定进度条左侧(前缀)显示的信息
import time
from tqdm import tqdmpbar = tqdm(["a","b","c","d"])for char in pbar:pbar.set_description("Processing %s" % char) # 设置描述time.sleep(1)  # 每个任务分配1s# 结果如下Processing a:   0%|          | 0/4 [00:00<?, ?it/s]
Processing b:  25%|██▌       | 1/4 [00:01<00:03,  1.01s/it]
Processing c:  50%|█████     | 2/4 [00:02<00:02,  1.01s/it]
Processing d:  75%|███████▌  | 3/4 [00:03<00:01,  1.01s/it]
for epoch in range(self.start_epoch, self.epochs):pbar = TQDM(enumerate(self.train_loader), total=nb)for i, batch in pbar:self.loss, self.loss_items = self.model(batch)if RANK in (-1, 0):pbar.set_description(("%11s" * 2 + "%11.4g" * (2 + loss_len))% (f"{epoch + 1}/{self.epochs}", mem, *losses, batch["cls"].shape[0], batch["img"].shape[-1]))pbar.close()
  • set_description以及参数desc都可以设置进度条左侧(前缀)信息,
  • set_description相比desc更加灵活,可以在每次迭代时,传入计算的结果。比如可以显示模型训练的loss, 图像的shape大小,以及当前的epoch等,用起来更加灵活。
2.3.2 显示进度条后缀(右侧)信息
  • (1) 利用postfix参数,指定进度条右侧(后缀)显示的信息
pbar = tqdm(range(N),total=N, desc="N")
start = time.time()
for i in pbar:pbar.postfix=f"{i}"
print("w .postfix: {:.2f}".format(time.time() - start))
  • (2) 使用set_postfix, 指定进度条右侧(后缀)显示的信息
# -*- coding: utf-8 -*-from tqdm import tqdm
from collections import OrderedDicttotal = 10000 #总迭代次数
loss = total
with tqdm(total=total, desc="进度条") as pbar:for i  in range(total):loss -= 1 
#        pbar.set_postfix(OrderedDict(loss='{0:1.5f}'.format(loss)))pbar.set_postfix(val_loss=1.63,fscore=0.88,batch=i) #输入一个字典,显示实验指标pbar.update(1)
  • set_postfix用于设置进度条右侧信息,可以将训练的结果,设置在进度条右侧显示。
  • set_postfix 在指定信息时,需要使用关键字参数的信息,比如以loss=5, bach=3的形式,这样也可以容易的参数,某个参数的值
  • 当传入的是字典dict时,需要使用**解包dict对象的每个元素,然后传入到set_postfix中,如下所示
model_train.eval()
for iteration, batch in enumerate(gen_val):imgs, pngs, labels = batchoutputs     = model_train(imgs)loss = CE_Loss(outputs, pngs, weights, num_classes = num_classes)f_score    = f_score(outputs, labels)pbar.set_postfix(**{'loss'  : loss / (iteration + 1),'f_score'   : f_score / (iteration + 1),'lr'        : get_lr(optimizer)})pbar.update(1)

可以看到如果传入字典dict,需要**将dict解包为关键字参数,通过字典dict传参,在实际中应用的更加普遍。

3. 项目案例

Init_Epoch =0 
Total_Epoch =300epoch_iters      = num_train // batch_size  #  iters of one epoch for train
epoch_iters_val  = num_val // batch_size    #  #  iters of one epoch for val
for epoch in range(Init_Epoch, Total_Epoch):pbar = tqdm(total=epoch_iters,desc=f'Epoch {epoch + 1}/{Total_Epoch}',postfix=dict,mininterval=0.3)for iteration, batch in enumerate(train_dataloader):imgs, pngs, labels = batchoutputs = model_train(imgs)loss = CE_Loss(outputs, pngs, weights, num_classes = num_classes)_f_score = f_score(outputs, labels)pbar.set_postfix(**{'total_loss': total_loss / (iteration + 1), 'f_score'   : total_f_score / (iteration + 1),'lr'        : get_lr(optimizer)})pbar.update(1)pbar.close()
  • 在每个epoch中,利用tqdm定义进度条pbar
  • tqdm中通过total设置每个epoch的迭代次数
  • 在每次迭代中,通过pbar.set_postfix设置进度条右侧显示信息,由于是通过total设置总迭代数而不是利用一个可迭代对象来控制迭代,因此需要利用update来更新迭代
  • 进度条使用完毕后,记得关闭:pbar.close()

参考

https://github.com/bubbliiiing/deeplabv3-plus-pytorch
https://www.cnblogs.com/softlin/p/13339766.html
https://github.com/ultralytics/ultralytics

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

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

相关文章

学术写作|第二篇论文写作记录|GPT4论文润色Prompt

本文目录 写作时间安排如何写出初稿?找谁修改?1. 找AI修改2. 找师姐、师兄、老师、同行/外行修改论文修改意见集锦(反复观看)最好用的GPT4指令禁止转载,未经允许的任何引用。 写作时间安排 第二篇工作的idea去年就想出来了,一直被其他事情干扰,错过了N个会议… 在寒假…

西瓜书学习笔记——k近邻学习(公式推导+举例应用)

文章目录 算法介绍实验分析 算法介绍 K最近邻&#xff08;K-Nearest Neighbors&#xff0c;KNN&#xff09;是一种常用的监督学习算法&#xff0c;用于分类和回归任务。该算法基于一个简单的思想&#xff1a;如果一个样本在特征空间中的 k k k个最近邻居中的大多数属于某个类别…

vue+element 换肤功能

1.首先建深色和浅色两个主题样式变量样式表&#xff0c;样式表名和按钮中传入的值一样&#xff0c;本例中起名为default.scss和dark.scss 2.在data中定义主题变量名 zTheme:‘defalut’&#xff0c;默认引用defalut.scss, 在点击按钮时切换引用的样式表&#xff0c;达到换肤效果…

结合实例谈谈SPSS多元线性回归分析结果解读与报告撰写

为研究某地区房地产市场的价格与相关影响因素之间的关系&#xff0c;现从该地区采集了 20 份样本&#xff0c;数据如下表&#xff0c;请给出销售价格与相关影响因素之间的函数表达式&#xff0c;并从统计学角度分析这些因素之间的关系&#xff0c;最后预测 X 小区的平均销售价格…

【洛谷学习自留】p1055 ISBN 号码

解题思路&#xff1a; 1.首先考虑怎么分解字符串的问题&#xff0c;把字符串内的数字拿出来&#xff0c;这里我使用了String的toCharArray方法&#xff0c;将字符串内的所有字符拿出来&#xff0c;然后针对性的把所有数字轮流用于计算&#xff0c;因为数组内的数字是以字符的形…

中小学电子编程内部集中培训第三课

蜂鸣器学习 可视化代码 见链接&#xff1a; 利用小车写蜂鸣器

VMware:在部分链上无法执行所调用的函数,请打开父虚拟磁

VMware:在部分链上无法执行所调用的函数&#xff0c;请打开父虚拟磁 问题&#xff1a;VMware给虚拟机扩展硬盘容量&#xff0c;提示&#xff1a;在部分链上无法执行所调用的函数&#xff0c;请打开父虚拟磁。原因&#xff1a;是因为你的虚拟磁盘文件是分多个文件存储的&#xf…

北朝隋唐文物展亮相广西,文物预防性保护网关保驾护航

一、霸府名都——太原博物馆收藏北朝隋朝文物展 2月1日&#xff0c;广西民族博物馆与太原博物馆携手&#xff0c;盛大开启“霸府名都——太原博物馆北朝隋文物展”。此次新春展览精选了北朝隋唐时期150多件晋阳文物珍品。依据“巍巍雄镇”“惊世古冢”“锦绣名都”三个单元&am…

【程序员的自我修养】7. 动态链接

为什么要动态链接 浪费内存和和磁盘空间 每个程序都得拥有相同的拷贝程序的发布、更新和部署困难 更新任何一个小的模块&#xff0c;整个程序都需要重新链接 动态链接&#xff1a;将链接的过程推迟到运行时 节省内存减少物理页面的换入换出、增加CPU的缓存命中率更新升级方便…

LeetCode--88

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组…

ChatGPT实战100例 - (13) 写一个属于自己的 ChatGPT 新版 WebUI

文章目录 ChatGPT实战100例 - (13) 写一个属于自己的 ChatGPT 新版 WebUI一、ChatGPT(OpenAI)的新版API调用1.1 环境变量配置与调用1.2 新版api调用1.3 命令行流式输出二、Gradio制作自己的聊天WebUIChatGPT实战100例 - (13) 写一个属于自己的 ChatGPT 新版 WebUI 今时不同往日…

某赛通电子文档安全管理系统 UploadFileList 任意文件读取漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

用VsCode写python

1.创建一个文件夹 2.创建.py文件 print("Hello World") print("*"*10) 4.运行 在终端版本fileName python3 app.py

线性代数:线性方程组

目录 一、线性方程组概念 二、消元法求线性方程组 三、系数阵的秩与线性方程组的解 无解 唯一解 无数解 相关定理 一、线性方程组概念 二、消元法求线性方程组 三、系数阵的秩与线性方程组的解 无解 唯一解 无数解 相关定理

Redis -- hash哈希

马行软地易失蹄&#xff0c;人贪安逸易失志。 目录 关于Redis的hash hash命令 hset hget hexists hdel hkeys hvals hgetall hmget hlen hsetnx hash计数 hincrby hincrbyfloat 小结 关于Redis的hash 几乎所有的主流编程语言都提供了哈希&#xff08;hash&a…

移动机器人激光SLAM导航(三):Hector SLAM 篇

参考引用 Hector_Mapping ROS-Wiki从零开始搭二维激光SLAM机器人工匠阿杰wpr_simulation 移动机器人激光SLAM导航&#xff08;文章链接汇总&#xff09; 1. 基于滤波器的 SLAM 问题 1.1 什么是 SLAM 什么是SLAM SLAM 就是为了构建地图用的&#xff0c;这个地图可以保存下来&…

SpringBoot集成Redisson实现限流(二)

1. 简介 Springboot集成Redisson默认的限流器为令牌桶型限流器&#xff0c;底层是通过lua脚本去实现的。 通过lua脚本我们可以去实现一个滑动窗口限流器&#xff0c;利用ZSET格式数据就可以轻松实现。 springboot集成Redisson就不做讲解&#xff0c;可以参考&#xff1a;sprin…

将word中插入的zotero文献转为latex引用样式

在word中&#xff0c;可以使用zotero插件插入和管理参考文献。 例如&#xff1a; 若需要将这段内容移植到latex&#xff0c;就需要将对应的引用编号用\cite{}替换。手动替换非常麻烦且容易出错。要实现自动转换&#xff0c;可在zotero中定制一种新的引文格式&#xff0c;自动将…

第二十三天| 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

Leetcode 669. 修剪二叉搜索树 题目链接&#xff1a;669 修剪二叉搜索树 题干&#xff1a;给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元…

常见的6种软件测试用例设计方法

常见的软件测试用例设计方法&#xff0c;个人认为主要是下面这6种&#xff1a; 流程图法&#xff08;也叫场景法&#xff09;等价类划分法边界值分析判定表正交法错误推测法 这6种常见方法中&#xff0c;我分别按照定义、应用场景、使用步骤、案例讲解这4个部分进行讲解。 所…