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_description
和set_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应用到深度学习中
- 在进行epoch迭代时,将从迭代器
dataloader
前加上tqdm
import tqdm
for data,targets in tqdm(train_loader):
pass
将epoch训练次数设置成了5,所以出现了5个进度条
- 若我们觉得5个进度条不好看,我们想让它只出现一个,并且一次训练结束就重新开始要如何去做?
将leave这个参数设置完成后,他就只会在一行内出现
for data,targets in tqdm(train_loader,leave =False):
- 我们要注意的是,直接是将tqdm加上去会无法得到index的索引,要如何得到index呢?
for index,(data,targets) in tqdm(enumerate(train_loader),total =len(train_loader),
leave = True):
- 加上我们需要的信息,比如准确率,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)