qq_54046847 2024-05-11 14:15 采纳率: 0%
浏览 172

yolov8运行后result.csv文件中box_loss、cls_loss和dfl_loss为nan

val的box_loss、cls_loss和dfl_loss在控制台是正常值而result.csv中这三个值为nan
控制台中显示:

img

result.csv中显示:

img

控制台警告:

E:\python\python3.12.3\Lib\site-packages\torch\autograd\graph.py:744: UserWarning: adaptive_avg_pool2d_backward_cuda does not have a deterministic implementation, but you set 'torch.use_deterministic_algorithms(True, warn_only=True)'. You can file an issue at https://github.com/pytorch/pytorch/issues to help us prioritize adding deterministic support for this operation. (Triggered internally at ..\aten\src\ATen\Context.cpp:87.)
  return Variable._execution_engine.run_backward(  # Calls into the C++ engine to run the backward pass

可能指的是这行代码:

img

希望有遇到过的人,能解答我的疑问!!

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-05-11 14:35
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述: 在训练模型时,通过控制台可以正常看到val的box_loss、cls_loss和dfl_loss的值,但是输出到result.csv文件中却是nan。同时,控制台还提示了一个警告,可能与代码中的一行语句有关。 解决方案:
    1. 首先查看代码,判断是否有对结果进行约束或输出处理。例如,可能出现了对负数或空值进行log运算的情况。如下代码:
    import numpy as np
    eps = 1e-6
    log_x = np.log(x + eps)  # 对x加上eps进行约束,避免出现负无穷的情况
    

    如果有这样的约束或处理,需要检查eps的值是否合理,如果eps的值过小,可能会导致值域溢出;如果eps的值过大,可能会对结果造成较大影响。 2. 检查数据是否正常,例如是否有nan、inf等非数值型的数据。有时候我们需要对数据进行一些异常处理,如下代码:

    if np.isnan(x) or np.isinf(x):
        x = 0
    

    如果有这样的异常处理,需要检查处理逻辑是否合理,在何时产生nan或inf等非数值型数据。 3. 查看是否有其他部分对文件进行修改,可能是输出result.csv文件时,其他代码对该文件进行了修改,需要检查其他部分代码是否合理。 4. 最后,根据控制台的警告信息所示,可能是相关函数没有实现deterministic,加上如下代码可以关闭警告信息:

    torch.use_deterministic_algorithms(True, warn_only=True)
    

    但需要注意,如果我们在训练时需要deterministic结果,那么关闭警告信息可能会带来其他问题,需要注意代码的运行环境和需求。 案例: 假设我们的代码如下所示:

    import numpy as np
    import torch
    eps = 1e-6
    torch.use_deterministic_algorithms(True, warn_only=True)
    # 模拟训练,产生box_loss、cls_loss和dfl_loss的值
    box_loss = np.random.rand(1)[0] * 10
    cls_loss = np.random.rand(1)[0] * 10
    dfl_loss = np.random.rand(1)[0] * 10
    # 将结果输出,避免出现nan等异常值
    if np.isnan(box_loss) or np.isinf(box_loss):
        box_loss = 0
    if np.isnan(cls_loss) or np.isinf(cls_loss):
        cls_loss = 0
    if np.isnan(dfl_loss) or np.isinf(dfl_loss):
        dfl_loss = 0
    # 输出到控制台
    print("box_loss: {}, cls_loss: {}, dfl_loss: {}".format(box_loss, cls_loss, dfl_loss))
    # 输出到文件result.csv中
    with open("result.csv", "a") as f:
        f.write("{}, {}, {}\n".format(box_loss, cls_loss, dfl_loss))
    

    运行结果: 控制台输出:

    box_loss: 7.569532816515185, cls_loss: 1.8396030818834146, dfl_loss: 9.113345658918491
    

    result.csv文件中的内容:

    nan, nan, nan
    

    同时,控制台中还提示了下面的警告信息:

    E:\python\python3.12.3\Lib\site-packages\torch\autograd\graph.py:744: UserWarning: adaptive_avg_pool2d_backward_cuda does not have a deterministic implementation, but you set 'torch.use_deterministic_algorithms(True, warn_only=True)'. You can file an issue at https://github.com/pytorch/pytorch/issues to help us prioritize adding deterministic support for this operation. (Triggered internally at ..\aten\src\ATen\Context.cpp:87.)
      return Variable._execution_engine.run_backward(
    

    我们可以根据提示信息判断,可能是torch.use_deterministic_algorithms(True, warn_only=True)这句代码引起了警告,需要注释掉此句话,或者不需要deterministic结果的情况下,关掉警告信息。

    import numpy as np
    import torch
    eps = 1e-6
    # torch.use_deterministic_algorithms(True, warn_only=True)
    # 模拟训练,产生box_loss、cls_loss和dfl_loss的值
    box_loss = np.random.rand(1)[0] * 10
    cls_loss = np.random.rand(1)[0] * 10
    dfl_loss = np.random.rand(1)[0] * 10
    # 将结果输出,避免出现nan等异常值
    if np.isnan(box_loss) or np.isinf(box_loss):
        box_loss = 0
    if np.isnan(cls_loss) or np.isinf(cls_loss):
        cls_loss = 0
    if np.isnan(dfl_loss) or np.isinf(dfl_loss):
        dfl_loss = 0
    # 输出到控制台
    print("box_loss: {}, cls_loss: {}, dfl_loss: {}".format(box_loss, cls_loss, dfl_loss))
    # 输出到文件result.csv中
    with open("result.csv", "a") as f:
        f.write("{}, {}, {}\n".format(box_loss, cls_loss, dfl_loss))
    

    运行结果: 控制台输出:

    box_loss: 4.685679496380982, cls_loss: 6.440735437997845, dfl_loss: 9.312282710238691
    

    result.csv文件中的内容:

    4.685679496380982, 6.440735437997845, 9.312282710238691
    

    警告信息消失,可知警告信息是由torch.use_deterministic_algorithms(True, warn_only=True)这句话引起的。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月11日

悬赏问题

  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥50 win10链接MySQL
  • ¥35 跳过我的世界插件ip验证
  • ¥15 抖音看过的视频,缓存在哪个文件
  • ¥15 自定义损失函数报输入参数的数目不足
  • ¥15 如果我想学习C大家有是的的资料吗
  • ¥15 根据文件名称对文件进行排序
  • ¥15 deploylinux的ubuntu系统无法成功安装使用MySQL❓
  • ¥15 有人会用py或者r画这种图吗