【调试Bug】网络在训练中输出NaN

首先情况是开始训练正常,网络也在更新,更新后网络就输出了NaN。调试过程:

1. 查看模型权重更新前后的值

复制代码
    print("更新前权重信息:")
    print(f"  权重均值: {fc2.weight.mean().item() if not torch.isnan(fc2.weight.mean()) else 'NaN'}")
    print(f"  最大值: {fc2.weight.max().item() if not torch.isnan(fc2.weight.max()) else 'NaN'}")
    print(f"  最小值: {fc2.weight.min().item() if not torch.isnan(fc2.weight.min()) else 'NaN'}\n")

    权重更新


    print("更新后权重信息:")
    print(f"  权重均值: {fc2.weight.mean().item() if not torch.isnan(fc2.weight.mean()) else 'NaN'}")
    print(f"  最大值: {fc2.weight.max().item() if not torch.isnan(fc2.weight.max()) else 'NaN'}")
    print(f"  最小值: {fc2.weight.min().item() if not torch.isnan(fc2.weight.min()) else 'NaN'}\n")

判断标准

  • 权重 / 偏置的绝对值如果超过1e4,可能导致输出过大。
  • 若训练中权重突然变得极大,说明可能存在梯度爆炸。

2. 发现权重更新前正常,更新后NaN

权重在参数更新后变成了NaN,这说明问题出在反向传播和参数更新环节(梯度计算或优化器步骤导致权重被更新为异常值)。

原因分析:

权重从正常数值突然变成NaN,几乎可以确定是梯度爆炸导致的:

  • 反向传播时计算出的梯度为NaN或极端大值(如1e20),优化器用这些异常梯度更新权重,直接导致权重变成NaN
  • 常见触发点:损失函数计算异常(如NaN损失)、输入数据极端值导致中间激活值爆炸、学习率过高放大梯度影响。

第一步 检查损失函数是否为NaN

如果损失本身输出是NaN,反向传播的梯度必然是NaN,直接导致权重更新异常。在反向传播前检查损失需要。

损失为NaN的常见原因:

  • 损失中包含log(0)(如nn.Softmax输出接近 0 时,torch.log(prob)会趋近于-inf

结果:发现正是损失函数torch.log输出了NaN。

3 解决

限制torch.log的值,NaN的问题得到了解决

相关推荐
制造业的搬运工11 分钟前
AI服务器背板与传统背板差异:三大设计升级解析
运维·服务器·人工智能·科技·制造·pcb工艺
hughnz25 分钟前
石油工程的端到端数字化转型:演化还是革命
大数据·人工智能·科技
xiao5kou4chang6kai429 分钟前
AI-XGBoost机器学习与生态—植被与土地利用识别、土壤碳氮空间预测、生物多样性驱动机制、土壤微生物功能预测、生态退化与风险识
人工智能·机器学习·生态·xgboost·地学
龙亘川29 分钟前
旅游强国建设|一网统管智慧旅游服务模块,赋能节假日文旅数字化治理
大数据·数据库·人工智能·科技·智慧城市·旅游
Microvision维视智造32 分钟前
产品尺寸一年一换,视觉系统能跟几次?
人工智能·计算机视觉·机器人·视觉检测·机器视觉
@嵌入式扫地僧33 分钟前
TFLite Micro STM32/ESP32 开箱即用推理骨架 + INT8 量化脚本实战:零调试跑通端侧 AI 推理完整步骤
人工智能·嵌入式硬件·tinyml·端侧ai·tflite micro
IT_陈寒37 分钟前
JavaScript的这个隐式转换特性差点让我加班到凌晨
前端·人工智能·后端
byte轻骑兵37 分钟前
【BlueZ 】hci 模块:用户态 HCI 层的核心封装与消息处理
linux·人工智能·bluez·电脑蓝牙·嵌入式蓝牙
计算机编程-吉哥38 分钟前
脑肿瘤MRI智能识别系统:基于深度学习的像素级脑肿瘤语义分割平台【计算机毕业设计选题推荐】
人工智能·python·深度学习·算法·毕业设计·课程设计·大数据毕业设计选题推荐
阿里云大数据AI技术43 分钟前
Al Search x ES Agent Builder:让数据活起来,从搜索走向行动
人工智能·elasticsearch·agent