神经网络训练时,出现NaN loss
来源:互联网 发布:老虎 比特 知乎 编辑:程序博客网 时间:2024/05/17 07:23
1、梯度爆炸
原因:在学习过程中,梯度变得非常大,使得学习的过程偏离了正常的轨迹
症状:观察输出日志(runtime log)中每次迭代的loss值,你会发现loss随着迭代有明显的增长,最后因为loss值太大以至于不能用浮点数去表示,所以变成了NaN。
可采取的方法:1.降低学习率,比如solver.prototxt中的base_lr,降低一个数量级(至少)。如果在你的模型中有多个loss层,就不能降低基础的学习率base_lr,而是需要检查日志,找到产生梯度爆炸的层,然后降低train_val.prototxt中该层的loss_weight.
2、错误的学习率策略及参数
原因:在学习过程中,caffe不能得出一个正确的学习率,相反会得到inf或者nan的值。这些错误的学习率乘上所有的梯度使得所有参数变成无效的值。
症状:观察输出日志(runtime log),你应该可以看到学习率变成NaN,例如:
... sgd_solver.cpp:106] Iteration 0, lr = -nan可采取的方法:修改solver.prototxt文件中所有能影响学习率的参数。比如,如果你设置的学习率策略是lr_policy:"poly", 而你又忘了设置最大迭代次数max_iter,那么最后你会得到lr=NaN...
关于caffe学习率及其策略的内容,可以在github的/caffe-master/src/caffe/proto/caffe.proto文件中看到(传送门)
3、错误的损失函数
原因:有时,在损失层计算损失值时会出现NaN的情况。比如,向InfogainLoss层没有归一化输入值,使用自定义的损失层等。
症状:观察输出日志(runtime log)的时候,你可能不会发现任何异常:loss逐渐下降,然后突然出现NaN。
可采取的方法:重新尝试该错误,打印损失层的值并调试。
举个栗子:有一回,我根据批量数据中标签出现的 频率去归一化惩罚值并以此计算loss。如果有个label并没有在批量数据中出现,频率为0,结果loss出现了NaN的情况。在这种情况先,需要用足够大的batch来避免这个错误。
4、错误的输入
原因:你的输入中存在NaN!
症状:一旦学习过程中碰到这种错误的输入,输出就会变成NaN。观察输出日志(runtime log)的时候,你可能也不会发现任何异常:loss逐渐下降,然后突然出现NaN。
可采取的方法:重建你的输入数据集(Imdb/leveldn/hdf5...),确保你的训练集/验证集中没有脏数据(错误的图片文件)。调试时,使用一个简单的网络去读取输入,如果有一个输入有错误,这个网络的loss也会出现NaN。
5、Pooling层的步长大于核的尺寸
由于一些原因,步长stride>核尺寸kernel_size的Pooling层会出现NaN。比如:
layer { name: "faulty_pooling" type: "Pooling" bottom: "x" top: "y" pooling_param { pool: AVE stride: 5 kernel: 3 }}
结果y会出现NaN。
一般来说,出现NaN有以下几种情况:
1.如果在迭代的100轮以内,出现NaN,一般情况下的原因是因为你的学习率过高,需要降低学习率。可以不断降低学习率直至不出现NaN为止,一般来说低于现有学习率1-10倍即可。
2.如果当前的网络是类似于RNN的循环神经网络的话,出现NaN可能是因为梯度爆炸的原因,一个有效的方式是增加“gradient clipping”(梯度截断来解决)
3.可能用0作为了除数;
4.可能0或者负数作为自然对数
5.需要计算loss的数组越界(尤其是自己,自定义了一个新的网络,可能出现这种情况)
6.在某些涉及指数计算,可能最后算得值为INF(无穷)(比如不做其他处理的softmax中分子分母需要计算exp(x),值过大,最后可能为INF/INF,得到NaN,此时你要确认你使用的softmax中在计算exp(x)做了相关处理(比如减去最大值等等))
原文链接
参考
- 神经网络训练时,出现NaN loss
- 在卷积神经网络训练过程中loss出现NaN的原因以及可以采取的方法
- faster rcnn训练过程出现loss=nan解决办法
- 使用caffe训练时Loss变为nan的原因
- 使用caffe训练时Loss变为nan的原因
- 使用caffe训练时Loss变为nan的原因
- 使用caffe训练时Loss变为nan的原因
- caffe训练时loss=nan的原因
- 使用caffe训练时Loss变为nan的原因
- Loss和神经网络训练
- caffe 训练中loss 为nan
- loss超大,训练一次后loss为nan
- caffe中出现loss等于nan
- tensorflow 运行过程中loss出现 NaN
- tensorflow训练中出现nan问题
- tensorflow训练出现nan的讨论
- tensorflow训练中出现nan问题
- 关于caffe训练出现loss=87.3365
- 购物车,添加:判断(为空,为数字,等于8位数)搜索名称显示
- Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例
- 用ARVR编辑器开启圣诞节,营销也能玩出新花样
- Oracle学习2:别名&字符串拼接
- Zookeeper实现分布式锁
- 神经网络训练时,出现NaN loss
- 笔记2017.12.19
- (备忘录)Rxjava2+Retrofit封装1
- 递归
- 前端冷知识集锦
- 点到线段的距离
- 解析xml数据存入bean映射到数据库的 需求解决过程
- MIT-BIH ECG 信号的数据读取方法和Matlab程序
- 各种连接池性能对比测试