yolact
是一个实时的实例分割算法,是目前分割速度最快的算法,而且生成mask的质量也很高。论文上说该算法还可以做目标检查,而且速度和准确度都能够达到(接近)YOLOv3的水平,于是就尝试了一下。将算法该成Paddle上的代码后,训练到5000多个step的时候,conf_loss
突然就变成了nan
。
以前遇到nan
的问题都是因为学习率过大,而且是在训练初期发生的。我这里的学习率用的是0.001
,应该不是学习率的问题,排除。
由于采用的是动态图编写的代码,因此可以通过一步一步的跟踪代码,来诊断错误。从loss一步步向上查找问题,发现target_logits
中存在非常小的数据(负数),如下面的图:
loss代码
target_logits
target_labels
conf_loss
这个问题是由于logits
太负
了,导致其指数接近与0引起的。因此,首先想到的就是对logits
进行裁剪,裁剪到[-10,10]
之间,解决了这个问题。
注:对于
log
函数,如何参数是一个负数,结果中就会出现nan
,而如果参数是0,结果中就会出现inf
。
不过后来训练时又出现了其他nan
的问题,详细观察训练记录发现,损失会出现突然变大的情况,怀疑是异常样本引起的。于是,便记录最近100个损失,如果当前的损失大于这100个的平均值的10倍,则认为是异常数据,不训练该数据。
- 本文作者: killf
- 本文链接: http://www.killf.info/机器学习/记一次nan的问题/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!