tqdm进度条基本用例,以及在pytorch中的使用

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

用法:
tqdm(iterator)

安装方法:

pip install tqdm 

方法一: 传入可迭代对象

import time
from tqdm import *

for i in tqdm(range(1000)):
    time.sleep(.01)    #进度条每0.1s前进一次,总时间为1000*0.1=100s

输出:

97%|█████████▋| 969/1000 [01:46<00:03,  9.08it/s]

解读:

  • 969/1000 总共有1000个迭代,已经进行了969个
  • 01:46<00:03 已经运行了1分46秒,还需3秒运行完成
  • 9.08it/s 每秒钟平均运行9.08个迭代

方法二: trange

trange(i)tqdm(range(i)) 的简单写法

from tqdm import trange

for i in trange(100):
    #do something
    pass

方法三: 可以为进度条设置描述

for 循环外部初始化 tqdm,可以打印其他信息:
通过set_descriptionset_postfix方法设置进度条显示信息:

import time
from tqdm import tqdm
from random import random, randint
pbar = tqdm(["a", "b", "c", "d"])
for char in pbar:
    #设置进度条左边显示的信息
    pbar.set_description("Processing %s" % char)
    #设置进度条右边显示的信息   	
    pbar.set_postfix(loss=random(),gen=randint(1,999),str="h",lst=[1,2])														  
    time.sleep(1)

输出:

Processing d: 100%|██████████| 4/4 [00:04<00:00,  1.01s/it, gen=951, loss=0.611, lst=[1, 2], str=h]

方法四:write 方法

import time
from tqdm import tqdm

bar = trange(10)
for i in bar:
    time.sleep(0.1)
    if not (i % 3):
        tqdm.write("Done task %i" % i)

输出:

 20%|██        | 2/10 [00:00<00:00,  8.45it/s]
 Done task 0
 50%|█████     | 5/10 [00:00<00:00,  8.79it/s]
 Done task 3
 80%|████████  | 8/10 [00:00<00:00,  8.79it/s]
 Done task 6
100%|██████████| 10/10 [00:01<00:00,  8.88it/s]
Done task 9

方法五:手动控制进度条:

通过update方法可以控制每次进度条更新的进度:

from tqdm import tqdm
import time
 
#total参数设置进度条的总长度
with tqdm(total=100) as pbar:
  for i in range(100):
    time.sleep(0.05)
    #每次更新进度条的长度
    pbar.update(1)

除了使用with之外,还可以使用另外一种方法实现上面的效果:

from tqdm import tqdm
import time
 
#total参数设置进度条的总长度
pbar = tqdm(total=100)
for i in range(100):
  time.sleep(0.05)
  #每次更新进度条的长度
  pbar.update(1)
#关闭占用的资源
pbar.close()

应用:将tqdm应用到深度学习中

  1. 在进行epoch迭代时,将从迭代器dataloader前加上tqdm
import tqdm
for data,targets in tqdm(train_loader):
    pass

在这里插入图片描述
将epoch训练次数设置成了5,所以出现了5个进度条

  1. 若我们觉得5个进度条不好看,我们想让它只出现一个,并且一次训练结束就重新开始要如何去做?

将leave这个参数设置完成后,他就只会在一行内出现

for data,targets in tqdm(train_loader,leave =False):

在这里插入图片描述

  1. 我们要注意的是,直接是将tqdm加上去会无法得到index的索引,要如何得到index呢?
for index,(data,targets) in tqdm(enumerate(train_loader),total =len(train_loader),
leave = True):

在这里插入图片描述

  1. 加上我们需要的信息,比如准确率,loss值
#首先我们的循环就不能直接向刚刚那么定义了,为了更新信息,我们要将我们的loop单独定义
#为了更好的展示我就附上了训练过程的全部代码
for epoch in range(num_epoch):
    losses = []
    accuracy =[]
    loop = tqdm(enumerate(train_loader), total =len(train_loader))
    for index,(x, target)in loop:
        x = x.to(decive)
        target = target.to(decive)

        predict = model(x)
        loss = criterion(predict,target)
        losses.append(loss)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        _,predictions = predict.max(1)
        num_correct = (predictions == target).sum()
        running_train_acc = float(num_correct) / float(x.shape[0])
        accuracy.append(running_train_acc)
        writer.add_scalar('Training loss',loss ,global_step=step)
        writer.add_scalar('Training accuracy',running_train_acc,global_step= step)
        #writer.add_hparams({'lr':learning_rate,'batch_size':batch_size},{'acciracy':sum(accuracy)/len(accuracy)})
        step+=1

        #更新信息
        loop.set_description(f'Epoch [{epoch}/{num_epoch}]')
        loop.set_postfix(loss = loss.item(),acc = running_train_acc)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值