如何从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
相关产品推荐
相关产品推荐

