1 参考1
在参考有头发的垃圾猿的《YOLO系列训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法(GTX16xx系列显卡大坑)》后,发现问题不能得到实际的解决(可能是版本不一样导致代码不一样的问题),所以按照其思路,对有头发的垃圾猿文章进行补充说明。
2 补充
因为yolo各个系列中又分为多个版本,所以在上个作者的文章,指出来取消自动混合精度,但仅指出某个yolo系列的版本的更改,这里进行补充。
YOLO版本:YOLOV5系列第6版本,V6.0;V7.0也一样 没去看
图1
因为调试后发现在经过model后,数据显示都为NAN,传入model前数据如图2所示,传入后数据变nan如图3所示:
原因可能是精度的变化导致经过model后数据被莫名其妙更改,引起某些指数计算,算得值为INF、梯度变化等情况,这里仅为猜测,没有研究,有兴趣的读者可以自己去看看。
图2
图3
我的更改:
train.py文件中
原代码:
# Forward
with amp.autocast(enabled=cuda):
pred = model(imgs) # forward
loss, loss_items = /
compute_loss(pred, targets.to(device))
更改后的代码:
# Forward
# with amp.autocast(enabled=cuda):
pred = model(imgs) # forward
loss, loss_items = compute_loss(pred, /
targets.to(device))
更改后,会增加GPU内存消耗,因为所有的精度都采用全精了
是的就是这么简单,取消掉后的训练结果,显示正常如图4所示:
图4
3 小结
不写了,上面那个作者写过了。