解决训练 FasterRCNN 时 Loss 一直为 Nan

一句话: 看读入的坐标!试试把 -1 去掉。

本文完


接上篇。上回书说到,自己的代码,数据集从 VOC 换到了 COCO 上。一切都还蛮顺利的。直到运行的时候…… 仔细一看 Loss,RPN Regression Loss__在第 3 个 iter__就变成了 Nan

这一点都不 Scitific!跟代码,查了一整天加已晚上,无果。

然后重写了数据转换脚本、样本选择脚本,无果。

简直开始怀疑人生。

在群里问了好久,有人说是加载的 Weights 不对,有人说是减小一下 Learning Rate(这个方法之前有效,但是 Learning Rate 直接减小到 1e-6 是不是很难学到东西了就?),还有人说调整一下几部分 Loss 的权重。

下午睡醒后想到,会不会是坐标的事情?去年这个时候遇到过一次。一些数据集的坐标是从 0 开始,一些是从 1 开始,转换的时候改了,但是读取的时候就不知道是什么样子了。

找到

x1 = float(bbox.find('xmin').text) - 1
y1 = float(bbox.find('ymin').text) - 1
x2 = float(bbox.find('xmax').text) - 1
y2 = float(bbox.find('ymax').text) - 1

将后面的 -1 去掉。

原因是如果使用 0-based 的 annotation ,再减一就会出现 log(-1)的情况,自然就 nan 了。

简直拨开乌云见太阳,翻身农奴把歌唱。

留下评论