如题,在caffe训练时,遇到这个特殊的数字之后,loss会一直就是这个数字。
网上虽然有很多针对这个问题调参的trick,但少有详细的分析,因此,有必要研究一下caffe的源代码。
softmax的公式为

pk=exp(xk)∑iexp(xi)pk=exp(xk)∑iexp(xi)

p_k= \frac{exp(x_k)}{\sum_{i}exp(x_i)}
其中x为softmax前一层的输出

softmax的loss计算公式也很简单,就是对softmax之后预测的概率做对数似然函数

loss=−∑kyklog(pk)loss=−∑kyklog(pk)

loss = -\sum_{k} y_klog(p_k)
其中y是label,若类别数为N,则y为N维。对于单label情况,N维中只有一维为1,其他为零,计算loss时仅需考虑label中非零那一维即可(实际使用中单label用一个数字记录)
此时

loss=−log(P{k==label})loss=−log(P{k==label})

loss = -log(P_{\{k==label\}})
在softmax_loss_layer.cpp的原码中,就是由label的非零维直接计算loss的

loss -= log(std::max(prob_data[i * dim + label_value * inner_num_ + j],Dtype(FLT_MIN)));                   

loss的最大值由FLT_MIN得到,FLT_MIN定义为1.17549435E-38F,这个数字的自然对数正好就是
-87.3356,算loss时需要取负值,结果就能了87.3356。

**这说明softmax计算得到概率值出现了零(由于float类型所能表示的最小数值是10−3810−38,比这个值还小的无法表示,只能是零)
而softmax是用指数函数计算的,指数函数的值都是大于零的。因此,我们有理由相信,计算过程中出现了float溢出等异常,出现了inf,nan等异常数值导致softmax输出为零
最后我们发现,当softmax之前的feature值过大时,由于softmax先求指数,会超出float数据范围,成为inf。inf与其他任何数值的和都是inf,softmax在做除法时任何正常范围的数值除以inf都会变为0。然后求loss时log一下就出现了87.3356这样的值。**

以下是模拟训练的loss代码,观察feature数值范围对loss的影响:

#include <iostream>
#include <math.h>
#include <float.h>using namespace std;int main()
{float f[] = {100, 20};cout << "feature: " << f[0] << ", " << f[1] << endl;float f_exp[] = {expf(f[0]), expf(f[1])};cout << "exp: " << f_exp[0] << ", " << f_exp[1] << endl;float sum = f_exp[0] + f_exp[1];cout << "sum: " << sum << endl;float softmax[] = {f_exp[0]/sum, f_exp[1]/sum};cout << "softmax: " << softmax[0] << ", " << softmax[1] << endl;float loss[] = {-log(max(softmax[0], FLT_MIN)), -log(max(softmax[1], FLT_MIN))};cout << "loss: " << loss[0] << ", " << loss[1] << endl;return 0;
}

解决方法:
知道了原因,解决时就能对症下药。总体上看,softmax输入的feature由两部分计算得到:一部分是输入数据,另部分是各层权重参数。
1、观察数据中是否有异常样本或异常label导致数据读取异常
2、调小初始化权重,以便使softmax输入的feature尽可能变小
3、降低学习率,这样就能减小权重参数的波动范围,从而减小权重变大的可能性。这条也是网上出现较多的方法。
4、如果有BN(batch normalization)层,finetune时最好不要冻结BN的参数,否则数据分布不一致时很容易使输出值变的很大。

Caffe 训练时loss等于87.3365且保持不变的原因及解决方法相关推荐

  1. 使用caffe训练时Loss变为nan的原因

    极视角高校计算机视觉算法邀请赛目前正在报名中,欢迎各高校在读学生报名参加,大奖+商业项目参与机会+数据库等你来拿!!!咨询报名请加小助手(微信号:Extreme-Vision) 本文为极市平台原创编译 ...

  2. Android 系统(87)---常见的内存泄漏原因及解决方法

    常见的内存泄漏原因及解决方法 (Memory Leak,内存泄漏) 为什么会产生内存泄漏? 当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被 ...

  3. 深度学习之---loss等于87.336

    如题,在caffe训练时,遇到这个特殊的数字之后,loss会一直就是这个数字. 网上虽然有很多针对这个问题调参的trick,但少有详细的分析,因此,有必要研究一下caffe的源代码. softmax的 ...

  4. 神经网络训练时loss不下降的问题

    原文地址:如何解决神经网络训练时loss不下降的问题 | AI柠檬 当我们训练一个神经网络模型的时候,我们经常会遇到这样的一个头疼的问题,那就是,神经网络模型的loss值不下降,以致我们无法训练,或者 ...

  5. 如何解决神经网络训练时loss不下降的问题

    本文转载,原文链接:https://blog.ailemon.me/2019/02/26/solution-to-loss-doesnt-drop-in-nn-train/ 当我们训练一个神经网络模型 ...

  6. (转载) loss不降低原因以及解决方法

    原文地址https://blog.csdn.net/zongza/article/details/89185852 当我们训练一个神经网络模型的时候,我们经常会遇到这样的一个头疼的问题,那就是,神经网 ...

  7. 启动pip时,< Fatal error in launcher: Unable to create process using ‘“‘ >问题的原因及解决方法

    启动pip时,< Fatal error in launcher: Unable to create process using '"' >问题的原因及解决方法 参考文章: (1 ...

  8. 使用Fastjson解析List对象时出现:{“$ref“:“$.data[0].task.OBJECTS[0]“}的问题原因及解决方法

    使用Fastjson解析List对象时出现:{"$ref":"$.data[0].task.OBJECTS[0]"}的问题原因及解决方法 参考文章: (1)使用 ...

  9. ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法

    ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法 参考文章: (1)ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法 (2)ht ...

最新文章

  1. CentOS 5.5环境下安装配置Varnish
  2. bmp转换tiff c++代码_Creative Convert for Mac(文件格式转换工具)
  3. Eclipse配置开发Go的插件——Goclipse
  4. php群发不用foreach,如何在没有foreach的情况下使用PHP生成器?
  5. 代理模式 委派模式 策略模式_策略模式
  6. 计划任务如何使用 java_java – 如何计划任务以定期间隔运行?
  7. MyEclipse6.5的反编译插件的安装
  8. Linux开发_最全在Ubnutu环境下为你的程序设置快捷启动项和启动时管理员权限
  9. 计算机仿真matlab编程,MATLAB与计算机仿真
  10. CSS font-family字体大合集
  11. imo与slack竞品分析报告
  12. 汉字书写亟待规范——《中国汉字听写大会》第七场复赛观后感
  13. 磨金石教育摄影技能干货分享|世界顶级的手机摄影作品欣赏
  14. 【水题】hzy 和zsl 的生存挑战
  15. Rust: 基于 napi-rs 开发 Node.js 原生模块
  16. Unity双人坦克大战竞速游戏,超简单教学
  17. seo外链建设(如何正确做好seo网站外链建设)
  18. python怎么调字体_python怎么改字体
  19. 在ubuntu系统下使用gcc和makefile实现c语言程序的编译运行
  20. [硬件项目] 1、汽车倒车雷达设计——基于API8108A芯片简易智能语音模块的设计与实现...

热门文章

  1. UNITY崩溃的日志
  2. js小笔记 -- let const的理解
  3. TensorFlow与主流深度学习框架对比
  4. 8.Redis 数据备份与恢复
  5. WORD拼页、书籍折页、反向书籍折页功能(3)
  6. rsync配置与报错总结
  7. 系统集成资质培训 - 教学方式与效果研究
  8. hdu 1937(尺取法)
  9. 第一个QGLViewer程序
  10. NYOJ 661 亲亲串