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

tqdm迭代结束后无法更新postfix显示平均训练损失

解决tqdm epoch结束后无法更新postfix显示平均损失的问题

问题描述

使用tqdm训练模型时,epoch结束后已执行更新postfix为“Avg. Train Loss”的代码,但进度条最终仍显示最后一次迭代的“Train Loss”,核心代码如下:

for epoch in range(start_epoch, end_epoch):
    train_loss = 0.0

    # 初始化训练进度条
    train_pbar = tqdm(train_dataloader, desc=f"Epoch {epoch}/{end_epoch}")

    for inputs, targets in train_pbar:
        # 训练逻辑(省略)
        train_pbar.set_postfix({"Train Loss": f"{item.loss:.4f}"})

    # 计算当前epoch平均损失
    train_loss /= len(train_dataloader)
    train_pbar.set_postfix({"Avg. Train Loss": f"{train_loss:.4f}"})

原因分析

tqdm在迭代完数据集(进度条达到100%)后,默认不会自动刷新已输出的最终状态,后续调用set_postfix不会更新终端显示的内容,即便代码逻辑已执行。

解决方案

方案1:添加强制刷新参数

在epoch结束更新postfix时,传入refresh=True参数,强制tqdm刷新进度条显示:

# 计算当前epoch平均损失
train_loss /= len(train_dataloader)
train_pbar.set_postfix({"Avg. Train Loss": f"{train_loss:.4f}"}, refresh=True)

方案2:手动控制进度条迭代

不依赖dataloader自动驱动tqdm,手动控制进度更新和刷新,适合更精细的进度条管理场景:

for epoch in range(start_epoch, end_epoch):
    train_loss = 0.0
    total_batches = len(train_dataloader)
    # 初始化进度条并指定总步数
    train_pbar = tqdm(total=total_batches, desc=f"Epoch {epoch}/{end_epoch}")

    for inputs, targets in train_dataloader:
        # 训练逻辑(省略)
        batch_loss = item.loss.item()
        train_loss += batch_loss
        
        # 更新当前batch的损失显示
        train_pbar.set_postfix({"Train Loss": f"{batch_loss:.4f}"})
        # 手动推进进度条
        train_pbar.update(1)

    # 计算平均损失
    train_loss /= total_batches
    # 更新平均损失并强制刷新
    train_pbar.set_postfix({"Avg. Train Loss": f"{train_loss:.4f}"}, refresh=True)
    # 手动关闭进度条
    train_pbar.close()

效果验证

修改后,epoch完成的进度条会显示:

Epoch 0/1000: 100%|██████████| 30/30 [08:25<00:00, 16.85s/it, Avg. Train Loss=5.1223]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:57:43