You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键说明

  1. 采用with tqdm(total=...) as pbar上下文管理器,规范管理进度条生命周期
  2. 用pbar.write()替代print(),自动处理输出位置,避免干扰进度条刷新
  3. 手动调用pbar.update(1)更新进度(也可直接迭代tqdm对象,上下文管理器方式更灵活)

修改后既能按需求在新行打印损失值,又能保持单个tqdm进度条持续更新,不会出现多个进度条堆叠的问题。

内容的提问来源于stack exchange,提问作者user1766349

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:18:15