tqdm进度条重复显示问题:如何实现单进度条+间隔打印损失值
解决tqdm进度条重复生成+损失值正常打印的问题
问题场景
PyTorch训练时需实现两个需求:
- 每隔指定迭代次数(如5000次)将损失值打印到新行
- tqdm进度条始终保持单个,持续展示总训练进度
但原始代码使用print()打印损失时,会导致tqdm进度条被推至上方,每次打印都会生成新的进度条,最终出现多个进度条堆叠的问题;ChatGPT提供的自定义进度条方案也未解决该问题。
原始代码:
import torch from math import tanh,cos from tqdm import tqdm from time import sleep batch, dim_in, dim_h, dim_out = 1, 100, 10, 1 input_X = torch.randn(batch, dim_in) output_Y = torch.randn(batch, dim_out) SGD_model = torch.nn.Sequential( torch.nn.Linear(dim_in, dim_h), torch.nn.Tanh(), torch.nn.Linear(dim_h, dim_out), ) loss_fn = torch.nn.MSELoss(reduction='sum') rate_learning = 0.01 optim = torch.optim.SGD(SGD_model.parameters(), lr=rate_learning, momentum=0.01) for values in tqdm(range(1000)): pred_y = SGD_model(input_X) loss = loss_fn(pred_y, output_Y) if values % 100 == 0: print(values, loss.item()) optim.zero_grad() loss.backward() optim.step()
问题根源
print()会直接向标准输出写入内容并换行,而tqdm进度条依赖同一行覆盖刷新实现。每次print()执行后,终端会将当前进度条行上移,tqdm下次刷新时会在新行生成进度条,最终导致多个进度条堆叠。
解决方案
使用tqdm内置的write()方法替代print(),该方法会在不干扰进度条行的前提下,将内容输出到新行,同时进度条始终保持在终端底部持续更新。
修改后的代码:
import torch from math import tanh, cos from tqdm import tqdm batch, dim_in, dim_h, dim_out = 1, 100, 10, 1 input_X = torch.randn(batch, dim_in) output_Y = torch.randn(batch, dim_out) SGD_model = torch.nn.Sequential( torch.nn.Linear(dim_in, dim_h), torch.nn.Tanh(), torch.nn.Linear(dim_h, dim_out), ) loss_fn = torch.nn.MSELoss(reduction='sum') rate_learning = 0.01 optim = torch.optim.SGD(SGD_model.parameters(), lr=rate_learning, momentum=0.01) # 初始化tqdm进度条,指定总迭代次数 with tqdm(total=1000) as pbar: for values in range(1000): pred_y = SGD_model(input_X) loss = loss_fn(pred_y, output_Y) if values % 100 == 0: # 使用tqdm的write方法打印损失,不破坏进度条 pbar.write(f"迭代次数: {values}, 损失值: {loss.item()}") optim.zero_grad() loss.backward() optim.step() # 更新进度条 pbar.update(1)
关键说明
- 采用
with tqdm(total=...) as pbar上下文管理器,规范管理进度条生命周期 - 用
pbar.write()替代print(),自动处理输出位置,避免干扰进度条刷新 - 手动调用
pbar.update(1)更新进度(也可直接迭代tqdm对象,上下文管理器方式更灵活)
修改后既能按需求在新行打印损失值,又能保持单个tqdm进度条持续更新,不会出现多个进度条堆叠的问题。
内容的提问来源于stack exchange,提问作者user1766349
相关产品推荐
相关产品推荐

