让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
问题描述:
在训练模型时,通过控制台可以正常看到val的box_loss、cls_loss和dfl_loss的值,但是输出到result.csv文件中却是nan。同时,控制台还提示了一个警告,可能与代码中的一行语句有关。
解决方案:
- 首先查看代码,判断是否有对结果进行约束或输出处理。例如,可能出现了对负数或空值进行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)
这句话引起的。