解决模型训练loss nan的问题

本文记录了使用mmdetection训练检测模型时遇到的bbox_loss和cls_loss出现nan值的问题排查过程,从调整学习率到梯度裁剪,最终定位到数据清洗中图像尺寸与标注坐标不匹配的问题,并成功解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用mmdetection训练检测模型时,出现了bbox_loss和cls_loss nan的问题,记录排查原因的过程,以及最终的解决。现象是,loss 在正常降低的过程中,突然跳变nan,整体震荡下降。

1. 调小学习率

一般出现loss nan,无非是网络传输的梯度过大导致的,所以首先考虑减小模型的学习率。可是学习率调小100倍甚至10000倍,还出现nan的情况,所以考虑其他原因导致。先排除学习率的影响,将学习率设为0,loss依旧nan,然后就可以尝试下一个了。

2. 梯度裁剪

在学习率为0的情况下,进行梯度裁剪。在模型配置里schedule_1x.py,加上grad_clip

optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2))

依旧出现loss nan,这时有点蒙了。

3. 数据清洗

在github上看到有人分享经验,mmdetection v2版本,在gt的box和image的重叠区域为0时,会出现loss nan的情况,于是,我查了一边……庞!大!的!数据。发现,还真是数据出的问题。就是有11张图size很大的图在labelImg标注时,旋转了90度,也就是手机采集的竖长的图,到了LabelImg里变成横的了,标注的坐标信息也是这个横着的,而原图是竖着的,所以,标注的box在原图就有对不上的情况,处理掉这个,loss nan情况消失。

训练模型的时候,会遇到各种各样的问题,可能要调很多参数,要根据现象进行分析,把可能的原因都排查一遍,最直接的做法就是排除法,把最好排查的因素排除了,就会逐渐清晰。

### CDDFuse 模型训练 Loss 出现 NaN 的原因分析 在深度学习模型训练中,Loss 值变为 NaN 是一种常见的问题,可能由多种因素引起。对于 CDDFuse 模型而言,以下是可能导致该现象的主要原因及其对应的解决方案: #### 数据预处理中的异常 如果输入数据存在不合理的数值范围(如无穷大或极小值),可能会导致网络层的计算溢出或下溢,从而引发 Loss 变为 NaN[^1]。 **解决方案:** - 对输入数据进行标准化或归一化操作,确保其分布在合理范围内。 - 使用 `numpy` 或其他工具检查是否存在极端值并剔除这些样本。 ```python import numpy as np def normalize_data(data): mean = np.mean(data, axis=0) std = np.std(data, axis=0) normalized_data = (data - mean) / (std + 1e-7) # 避免分母为零 return normalized_data ``` --- #### 学习率设置过高 过高的学习率会使得梯度更新幅度过大,在反向传播过程中容易造成参数发散,最终使 Loss 趋近于 NaN[^2]。 **解决方案:** - 尝试降低初始学习率,并采用动态调整策略逐步优化收敛速度。 - 如果使用 Adam 等自适应优化器,则可以适当减少 beta 参数来缓解此问题。 ```python from torch.optim import Adam optimizer = Adam(model.parameters(), lr=1e-4, betas=(0.9, 0.99)) ``` --- #### 权重初始化不当 错误的权重初始化方式也可能导致神经元激活函数饱和甚至失效,进而影响整个前馈路径上的稳定性[^3]。 **解决方案:** - 更改默认随机分布至 Xavier/He Normal 初始化方法之一以改善这种情况下的表现效果。 ```python import torch.nn.init as init for name, param in model.named_parameters(): if 'weight' in name: init.xavier_normal_(param.data) elif 'bias' in name: init.constant_(param.data, 0.) ``` --- #### Batch Size 过小 当批次大小不足以代表总体特征空间时,每一步 mini-batch 更新都可能存在较大波动性,累积下来便会造成整体不稳定状态而产生 NaN 结果。 **建议措施:** 增加 batch size 至更合适的规模;当然也要注意内存资源限制条件下的可行性权衡考量。 --- ### 总结 通过上述几个方面的排查与修正动作相结合应用之后应该能够有效解决大部分关于 cddfuse 类型项目里遇到类似的 loss 成为了 not-a-number 的难题状况发生几率大大减低下去很多程度上提高了系统的健壮性和可靠性水平等方面都有所体现出来良好成果展示给大家参考借鉴之用!
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值