现在我正在尝试使用 this 代码训练对象检测 - YOLOv1。一开始我使用了 momentum
和 weight_decay
,但经过几个时期后的训练损失变成了 NaN
。据我所知这是因为梯度爆炸,所以我搜索了一些方法来摆脱这个 NaN
然后我忽略了 momentum
和 weight decay
。结果我没有得到任何 NaN
,但是我的模型无法像我预期的那样收敛。当我计算 mAP
时,它仅为 0.29。我使用 VOC 2007 和 2012 数据进行训练,并将 VOC 2007 测试用作测试集。
所以我的问题如下:
NaN
?非常感谢这里的任何建议。
答案 0 :(得分:2)
检查您的代码后,我看到在第一个纪元之后,您将学习率设置为 0.01
直到第 75 纪元。在我看来,大学习率是导致您的参数消失/爆炸的主要原因.通常,学习率在 0.001
附近缩放,因子为 2,1,0.1
。
Follow the config in this repo(最著名的repo根据paperwithcode实现YOLOv1),你可以看到他们的配置设置。您可以在问题中关注他们的超参数 momentum=0.9
和 decay=0.0005
。
注意:请注意 Tensorflow 中的批规范动量 = 1 - Pytorch 中的动量。
最后,你训练前后的参数数量应该是一样的,所以如果你的模型在训练过程后更重/更轻,那就意味着你的训练代码有问题。