如何解决YOLO v1中的梯度爆炸问题

时间:2021-06-17 05:44:37

标签: python pytorch object-detection nan yolo

现在我正在尝试使用 this 代码训练对象检测 - YOLOv1。一开始我使用了 momentumweight_decay,但经过几个时期后的训练损失变成了 NaN。据我所知这是因为梯度爆炸,所以我搜索了一些方法来摆脱这个 NaN 然后我忽略了 momentumweight decay。结果我没有得到任何 NaN,但是我的模型无法像我预期的那样收敛。当我计算 mAP 时,它仅为 0.29。我使用 VOC 2007 和 2012 数据进行训练,并将 VOC 2007 测试用作测试集。

所以我的问题如下:

  • 如何在训练时摆脱 NaN
  • 在哪里可以获得最佳训练配置?
  • 梯度爆炸在目标检测任务中是否正常?
  • YOLOv1 在训练后得到 1.1Gb 的权重是否正常?

非常感谢这里的任何建议。

1 个答案:

答案 0 :(得分:2)

检查您的代码后,我看到在第一个纪元之后,您将学习率设置为 0.01 直到第 75 纪元。在我看来,大学习率是导致您的参数消失/爆炸的主要原因.通常,学习率在 0.001 附近缩放,因子为 2,1,0.1

Follow the config in this repo(最著名的repo根据paperwithcode实现YOLOv1),你可以看到他们的配置设置。您可以在问题中关注他们的超参数 momentum=0.9decay=0.0005

注意:请注意 Tensorflow 中的批规范动量 = 1 - Pytorch 中的动量。

最后,你训练前后的参数数量应该是一样的,所以如果你的模型在训练过程后更重/更轻,那就意味着你的训练代码有问题。