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

微调FasterRCNN时训练出现NaN损失值,求解决方案

问题:FasterRCNN微调时第二个epoch损失变为NaN

项目概况

  • 基于PyTorch官方目标检测代码微调FasterRCNN模型,仅做目标检测,使用use-v2参数
  • 数据集:自定义COCO格式,由labelImg标注VOC格式后通过pylabel转换而来

使用的命令行参数

"--data-path", "..\Dataset\data_set_coco",
"--model", "fasterrcnn_resnet50_fpn",
"batch-size", "16",
"epochs", "100",
"print-freq", "5",
"output-dir", ".\results",
"backend", "tensor",
"weights-backbone", "ResNet50_Weights.IMAGENET1K_V1",
"use-v2",

第一个epoch训练及测试结果

Epoch: [0] [ 0/23] eta: 0:27:58 lr: 0.000928 loss: 5.2509 (5.2509) loss_classifier: 4.5420 (4.5420) loss_box_reg: 0.0006 (0.0006) loss_objectness: 0.6790 (0.6790) loss_rpn_box_reg: 0.0293 (0.0293) time: 72.9583 data: 15.0346 max mem: 18916
Epoch: [0] [20/23] eta: 0:02:34 lr: 0.019092 loss: 0.4284 (1.5884) loss_classifier: 0.2211 (1.2283) loss_box_reg: 0.0296 (0.0344) loss_objectness: 0.0589 (0.2585) loss_rpn_box_reg: 0.0376 (0.0672) time: 50.4280 data: 0.0239 max mem: 19053
Epoch: [0] [22/23] eta: 0:00:50 lr: 0.020000 loss: 0.3843 (1.4968) loss_classifier: 0.1955 (1.1559) loss_box_reg: 0.0446 (0.0377) loss_objectness: 0.0483 (0.2396) loss_rpn_box_reg: 0.0316 (0.0635) time: 49.9681 data: 0.0226 max mem: 19053
Epoch: [0] Total time: 0:19:30 (50.8758 s / it)
Test: [ 0/32] eta: 0:08:09 model_time: 0.7523 (0.7523) evaluator_time: 0.0042 (0.0042) time: 15.2950 data: 14.5345 max mem: 19053
Test: [31/32] eta: 0:00:01 model_time: 0.5700 (0.5871) evaluator_time: 0.0010 (0.0007) time: 0.6016 data: 0.0012 max mem: 19053
Test: Total time: 0:00:34 (1.0793 s / it)
Averaged stats: model_time: 0.5700 (0.5871) evaluator_time: 0.0010 (0.0007)
Accumulating evaluation results...
DONE (t=0.01s).
IoU metric: bbox
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.000

第二个epoch错误信息

Epoch: [1] [ 0/23] eta: 0:26:27 lr: 0.020000 loss: 0.8838 (0.8838) loss_classifier: 0.7125 (0.7125) loss_box_reg: 0.0614 (0.0614) loss_objectness: 0.0181 (0.0181) loss_rpn_box_reg: 0.0918 (0.0918) time: 69.0171 data: 14.8666 max mem: 19053
Loss is nan, stopping training
{'loss_classifier': tensor(nan, device='cuda:0', grad_fn=), 'loss_box_reg': tensor(nan, device='cuda:0', grad_fn=), 'loss_objectness': tensor(nan, device='cuda:0', grad_fn=), 'loss_rpn_box_reg': tensor(nan, device='cuda:0', grad_fn=)}

重启训练后问题复现,需解决NaN损失问题。


解决方案

1. 降低学习率

第一个epoch结束时学习率达到0.02,该值过高易引发梯度爆炸导致NaN:

  • 直接调低初始学习率,比如添加--lr 0.001或--lr 0.0005参数
  • 若使用默认学习率调度器,调整--lr-step-size和--lr-gamma参数,减缓学习率变化幅度

2. 排查数据集标注问题

第一个epoch测试AP全为0,说明模型未学到有效信息,大概率标注存在问题:

  • 检查COCO标注文件的categories字段,确保类别ID从1开始(PyTorch检测框架默认0为背景类)
  • 验证bbox坐标合法性:是否存在超出图像范围、宽高为0/负数的标注
  • 确认训练/测试集图像路径正确,图像可正常加载

3. 调整批次大小

当前batch-size=16,若GPU显存接近上限可能导致计算不稳定:

  • 降低batch-size至8或4,减少单步计算的显存占用,避免数值溢出

4. 添加梯度裁剪

在训练循环中加入梯度裁剪,防止梯度爆炸:

# 在loss.backward()之后、optimizer.step()之前添加
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)

若使用官方脚本,可修改engine.py中的训练循环部分插入上述代码。

5. 检查数据预处理

确保预处理流程与预训练模型匹配:

  • 确认图像归一化参数为ResNet50的标准值:均值[0.485, 0.456, 0.406],标准差[0.229, 0.224, 0.225]
  • 排查是否存在极端尺寸的图像,导致RPN生成异常锚点引发计算错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:42:07