在网络训练中经常出现loss为nans的情况。

主要原因有如下:

梯度爆炸

原因:巨大的梯度值使model的学习过程off-track。

检测方法:查看运行时日志,您应该查看每个迭代的损失值。您会注意到,损失开始从迭代到迭代显著地增长,最终损失将太大,无法用浮点变量表示,它将成为nan。

措施:减少base_lr (在solver.prototxt中) 至少一个数量级。如果model有多个loss_layer,你应该检查日志,查看哪个层导致了梯度爆炸,并减少该层的loss_weight 值  (在train. prototxt中),而不是简单的减少base_lr。

不当的学习率策略和参数

原因:caffe无法计算一个合理的学习速率并得到'inf'或'nan',相反的,这个不合理的学习速率会进一步更新参数,从而使model中所有参数变得没有价值。

检测方法:查看运行时日志,您应该看到学习速率本身变成了'nan',例如:

... sgd_solver.cpp:106] Iteration 0, lr = -nan

措施:修改影响学习速率的所有参数。在solver.prototxt文件中。例如,如果使用的是lr_policy: "poly",而忘记定义max_iter参数,则最终将会出现lr = nan…

有关在caffe学习速率的更多信息:https://stackoverflow.com/questions/30033096/what-is-lr-policy-in-caffe。

不当的损失函数

原因:有时损失的计算会导致nans出现。例如,给InfogainLoss 层提供没有进行归一化的输出值,使用带有bug的自定义损失层等。

检测方法:查看运行时日志,可能不会出现任何异常情况:损失值正在逐渐减少,突然就出现了一个nan。

措施:看看是否能重现这个错误,在loss_layer加一些输出并调试错误。

例如:有一次使用了一个带有归一化了batch中错误的label次数的loss。如果其中一个label从没有在batch中出现过,那么就会发生这样的情况——loss计算就会产生nans。在这种情况下,处理足够大的batches(相对于数据集中标签的数量)就足以避免这个错误。

错误的输入

理由:model的输入中就有nan

检测方法:一旦训练时“点击”这个错误的输入,输出就会变成nan。查看运行时日志,您可能不会注意到任何异常:丢失正在逐渐减少,突然出现了一个nan。

措施:重建你的输入数据集(lmdb/ leveldn / hdf5…),确保你没有坏图像文件在训练/验证集中。你可以构建一个简单的网络来读取输入层,有一个虚拟的损失值,并且可以遍历所有的输入:如果其中一个输入是错误的,这个虚拟的网络也会产生nan。

池化层中步长比核的尺寸大

当池化层中stride> kernel的时候也会产生nans

如下例所示:

layer {
  name: "faulty_pooling"
  type: "Pooling"
  bottom: "x"
  top: "y"
  pooling_param {
    pool: AVE
    stride: 5
    kernel: 3
  }
}

在y中会产生nans。

归一层(batch_norm_layer)不稳定

据一些反映,在某些归一层的设置中,由于数字的不稳定,“batch_norm”层可能输出nans

这个issue 是在bvlc / caffe提出的, PR #5136是试图修复的方法。

最近,通过对debug_info的flag:在 'solver.prototxt'中设置debug_info: true可以帮助在caffe训练中输出到log更多的调试信息。(包括梯度大小和激活值):这些信息可以帮助在训练过程中发现梯度爆炸和其他问题。

感谢:

https://stackoverflow.com/questions/33962226/common-causes-of-NaNs-during-training

深度学习网络模型训练中loss为nans的总结相关推荐

  1. 【毕业设计_课程设计】基于深度学习网络模型训练的车型识别系统

    文章目录 0 项目说明 1 简介 2 模型训练精度 3 扫一扫识别功能 4 技术栈 5 模型训练 6 最后 0 项目说明 基于深度学习网络模型训练的车型识别系统 提示:适合用于课程设计或毕业设计,工作 ...

  2. 如何理解深度学习分布式训练中的large batch size与learning rate的关系?

    问题详情: 在深度学习进行分布式训练时,常常采用同步数据并行的方式,也就是采用大的batch size进行训练,但large batch一般较于小的baseline的batch size性能更差,请问 ...

  3. 深度学习网络模型训练过程中的Loss问题合集

    把数据集随机分为训练集,验证集和测试集,然后用训练集训练模型,用验证集验证模型,根据情况不断调整模型,选择出其中最好的模型,再用训练集和验证集数据训练出一个最终的模型,最后用测试集评估最终的模型 训练 ...

  4. 深度学习网络训练中出现nan的原因分析

    报错: nan:Not a Number 该错误导致的后果:造成训练准确率的断崖式下跌 错误原因分析: 1)在loss函数中出现nan 出现原因:一般是因为tf中的log函数输入了'负数'或'0'值( ...

  5. 使用pytorch进行深度学习网络模型训练,实现车型识别

    ​ 简介 通过深度学习技术搭建残差网络,使用 CompsCars数据集进行车型识别模型的训练,并将训练好的模型移植到了Android端,实现了通过手机扫一扫的方式进行汽车车型识别的功能. 项目涉及到的 ...

  6. 深度神经网络模型训练中的 tricks(原理与代码汇总)

    点击上方"计算机视觉工坊",选择"星标" 干货第一时间送达 作者丨Jack Stark 来源丨机器学习小王子 原文链接|https://mp.weixin.qq ...

  7. [深度学习] - 网络模型训练过程的 loss 变化分析 (loss / val_loss / test_loss)

    目录 一.train set 和 test set 基础知识 二.分析 loss 和 val_loss (test_loss) 变化情况 一.train set 和 test set 基础知识 tra ...

  8. 训练中Loss为Nan的原因,梯度消失或者爆炸的优化

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 现象 如何确定是否出现梯度爆炸? 在训练过程中出现梯度爆炸会伴随一些细微的信号,如: (1)模 ...

  9. 深度学习100问之提高深度学习模型训练效果(调参经验)

    声明 1)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 2)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢 ...

最新文章

  1. if...else if switch分支结构
  2. JavaScript的基本使用
  3. vmware提示:此虚拟机似乎正在使用中,无法取得所有权的解决办法
  4. 汽车需要镀晶吗?镀晶是起什么作用的?
  5. php中try catch捕获异常实例详解
  6. 机器学习数据挖掘笔记_15(关于凸优化的一些简单概念)
  7. mac docker搭建开发环境
  8. oracle 数据库启动停止小结
  9. 使用 ASP.NET Core Razor 页、Web API 和实体框架进行分页和排序
  10. 云端部署大数据解决方案该用IaaS还是PaaS?
  11. 函数指针,函数指针数组,函数返回值为函数指针
  12. 神奇DP [HNOI2004] 打砖块
  13. 在AIX环境下实施Oracle 集群RAC的结构 文平
  14. 传教士和野人问题思考逻辑
  15. 【渗透测试】--- rbash逃逸方法简述
  16. SDR HDR 动态范围
  17. 代码托管平台的待办事项你知道吗 ?|GitCode
  18. Interview:算法岗位面试—BAT公司问题面试之计算机基础(进程与线程的区别)、经典概率问题等集锦
  19. chrome 有哪些有用的插件
  20. npx mrm@2 lint-staged执行报错

热门文章

  1. NC65信用占用重算
  2. GRR3 报表 直接EXCEL输出
  3. 如何测试电脑软件重复或多,如何快捷找出电脑内的重复文件(两个工具)
  4. 学习杂记0001:2019.11.02
  5. 用友ERP U890数据库维护常用脚本
  6. azw3 python数据分析 活用pandas库_Python数据分析 活用Pandas库 数据科学教程数据分析入门图书 Python编程入门数据处理...
  7. C语言——求s=a+aa+aaa+aaaa+aa...a的值
  8. MRPII/ERP对企业经营方式转变的影响(转)
  9. 带你一步步剖析Retrofit-源码解析:一款基于-OkHttp-实现的网络请求框架
  10. 个人时尚竞聘简历PPT模板