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

PyTorch下BERT模型训练损失与准确率曲线绘制方法求助

PyTorch BERT 4分类任务训练曲线绘制方案

第一步:训练过程中预埋指标存储逻辑

在训练启动前先定义4个空列表,按epoch粒度存储训练、验证阶段的损失和准确率指标,以下是适配BERT分类任务的训练循环示例:

import torch
import matplotlib.pyplot as plt

# 提前定义运行硬件
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 训练前初始化指标存储列表
train_loss_all = []
train_acc_all = []
val_loss_all = []
val_acc_all = []

num_epochs = 10 # 你的训练轮次配置

for epoch in range(num_epochs):
    model.train()
    train_loss = 0.0
    train_correct = 0
    train_total = 0

    # 训练批次循环
    for batch in train_dataloader:
        input_ids = batch['input_ids'].to(device)
        attention_mask = batch['attention_mask'].to(device)
        labels = batch['labels'].to(device)

        optimizer.zero_grad()
        outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
        loss = outputs.loss
        logits = outputs.logits

        loss.backward()
        optimizer.step()

        # 累计训练损失
        train_loss += loss.item()
        # 计算训练准确率
        preds = torch.argmax(logits, dim=1)
        train_correct += (preds == labels).sum().item()
        train_total += labels.size(0)

    # 计算当前epoch平均训练指标,存入列表
    avg_train_loss = train_loss / len(train_dataloader)
    avg_train_acc = train_correct / train_total
    train_loss_all.append(avg_train_loss)
    train_acc_all.append(avg_train_acc)

    # 验证阶段
    model.eval()
    val_loss = 0.0
    val_correct = 0
    val_total = 0
    with torch.no_grad():
        for batch in val_dataloader:
            input_ids = batch['input_ids'].to(device)
            attention_mask = batch['attention_mask'].to(device)
            labels = batch['labels'].to(device)

            outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
            loss = outputs.loss
            logits = outputs.logits

            val_loss += loss.item()
            preds = torch.argmax(logits, dim=1)
            val_correct += (preds == labels).sum().item()
            val_total += labels.size(0)

    # 计算当前epoch平均验证指标,存入列表
    avg_val_loss = val_loss / len(val_dataloader)
    avg_val_acc = val_correct / val_total
    val_loss_all.append(avg_val_loss)
    val_acc_all.append(avg_val_acc)

    # 打印每轮指标方便核对
    print(f"Epoch {epoch+1}/{num_epochs}, 训练损失: {avg_train_loss:.4f}, 训练准确率: {avg_train_acc:.4f}, 验证损失: {avg_val_loss:.4f}, 验证准确率: {avg_val_acc:.4f}")

第二步:训练完成后绘制曲线

以下代码可生成和你之前LSTM任务效果一致的双列曲线图:

# 设置画布,1行2列分别展示损失、准确率
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 绘制损失曲线
ax1.plot(range(1, num_epochs+1), train_loss_all, label='训练损失')
ax1.plot(range(1, num_epochs+1), val_loss_all, label='验证损失')
ax1.set_title('训练/验证损失变化')
ax1.set_xlabel('Epoch')
ax1.set_ylabel('Loss')
ax1.legend()
ax1.grid(alpha=0.3)

# 绘制准确率曲线
ax2.plot(range(1, num_epochs+1), train_acc_all, label='训练准确率')
ax2.plot(range(1, num_epochs+1), val_acc_all, label='验证准确率')
ax2.set_title('训练/验证准确率变化')
ax2.set_xlabel('Epoch')
ax2.set_ylabel('Accuracy')
ax2.legend()
ax2.grid(alpha=0.3)

plt.tight_layout()
plt.show()
# 可取消注释下方代码直接保存图片到本地
# plt.savefig('bert_train_curve.png')

注意事项

  • 你的批次配置为batch size=3,不需要修改上述逻辑,指标计算会自动按总样本数做平均
  • 如果你没有划分验证集,只需要删掉验证相关的存储和绘图代码即可
  • 要确保提前安装了matplotlib依赖,没有安装的话执行pip install matplotlib

你之前LSTM任务的曲线效果参考:
LSTM损失准确率曲线示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:06:03