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

如何从FastAI Learner获取每轮测试/验证损失数值列表?

获取FastAI验证/测试阶段按轮次的损失列表

一、获取验证阶段按轮次的损失

FastAI的Learner训练时会自动记录每轮的验证损失,可通过以下两种方式获取:

1. 训练后直接提取

训练完成后,learn.recorder的valid_loss属性就是按轮次排列的验证损失列表:

# 执行训练
learn.fit_one_cycle(EPOCHS, OPTIMAL_LEARNING_RATE)

# 提取验证损失列表
valid_losses = learn.recorder.valid_loss

# 按轮次输出
for epoch_idx, loss in enumerate(valid_losses, start=1):
    print(f"第{epoch_idx}轮验证损失: {loss:.4f}")

2. 训练中实时记录(自定义回调)

如果需要在训练过程中实时保存损失,可自定义Callback:

from fastai.callback.core import Callback

class ValidLossRecorder(Callback):
    def __init__(self):
        self.valid_losses = []
    
    def after_epoch(self):
        # 记录当前轮次的验证损失
        self.valid_losses.append(self.learn.recorder.valid_loss[-1])

# 初始化回调
loss_recorder = ValidLossRecorder()
# 训练时传入回调
learn.fit_one_cycle(EPOCHS, OPTIMAL_LEARNING_RATE, cbs=[loss_recorder])

# 获取损失列表
valid_losses = loss_recorder.valid_losses

二、获取测试阶段按轮次的损失

FastAI默认不会每轮自动评估测试集,需要手动在每轮结束后评估并记录:

from fastai.callback.core import Callback

class TestLossRecorder(Callback):
    def __init__(self, test_dl):
        self.test_dl = test_dl
        self.test_losses = []
    
    def after_epoch(self):
        # 每轮结束后评估测试集,返回损失和指标
        test_loss, test_metrics = self.learn.validate(dls=self.test_dl)
        self.test_losses.append(test_loss)

# 假设已创建测试集数据加载器test_dl
test_recorder = TestLossRecorder(test_dl)
# 训练时传入回调
learn.fit_one_cycle(EPOCHS, OPTIMAL_LEARNING_RATE, cbs=[test_recorder])

# 获取按轮次的测试损失列表
test_losses = test_recorder.test_losses

注意事项

  • learn.recorder.valid_loss中的数值是每轮验证集的平均损失,和训练日志中显示的valid_loss完全对应
  • 测试集评估会额外消耗计算资源,如果轮次较多,需考虑训练效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:57:50