DETR类模型训练报错assert (boxes1[:, 2:] >= boxes1[:, :2]).all()

问题:代码断言错误,模型预测结果的box输出为NaN。

过程:在多卡模型训练时碰到了这个问题,github给出的解决方案五花八门,有降低学习率的,有人num_classes写错了的,但是都不行。

解决方案:关闭混合精度训练,即在训练中让amp=False,为了让自己的batch size大一些,魔改了作者的代码,结果最后是这里出了问题,估计是FP16精度不够溢出了。

额外记录:一个另外的问题时当时想在模型报错的时候打印box的结果,但是终端什么东西都没有,可能是多进程的原因,解决方案为报错时写入log文件而不是print()

额外更新:发现了新的解决方案,如果是半精度训练,则在adamw优化器中改动eps为1e-5,如下。eps是为了防止模型权重出现NaN的一个参数,而半精度训练是没有办法表示到1e-8的,所以改大一些可以防止这个问题。

   if args.amp:
        eps = 1e-5
    else:
        eps = 1e-8
    optimizer = torch.optim.AdamW(
        param_dicts, lr=args.lr, weight_decay=args.weight_decay, eps=eps
    )

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值