错误:Assertion `input_val >= zero && input_val <= one` failed.

在用服务器跑模型计算loss时,出现如下错误:Assertion `input_val >= zero && input_val <= one` failed.和 RuntimeError: CUDA error: device-side assert triggered。

/opt/conda/conda-bld/pytorch_1640811757556/work/aten/src/ATen/native/cuda/Loss.cu:115: operator(): block: [428,0,0], thread: [61,0,0] Assertion `input_val >= zero && input_val <= one` failed.
  0%| | 0/440 [00:02
Traceback (most recent call last):
  File "train_normal.py", line 212, in 
    train(net)
  File "train_normal.py", line 109, in train
    train_loss = solver.optimize()
  File "/home/liuming/mmq/Hi/framework.py", line 87, in optimize
    loss = self.loss(self.mask, pred)
  File "/home/liuming/mmq/Hi/loss/dice_bce_loss.py", line 45, in __call__
    a = self.bce_loss(y_pred, y_true)
  File "/home/liuming/.conda/envs/mmqpytorch/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1102, in _call_impl
    return forward_call(*input, **kwargs)
  File "/home/liuming/.conda/envs/mmqpytorch/lib/python3.8/site-packages/torch/nn/modules/loss.py", line 603, in forward
    return F.binary_cross_entropy(input, target, weight=self.weight, reduction=self.reduction)
  File "/home/liuming/.conda/envs/mmqpytorch/lib/python3.8/site-packages/torch/nn/functional.py", line 2915, in binary_cross_entropy
    return torch._C._nn.binary_cross_entropy(input, target, weight, reduction_enum)
RuntimeError: CUDA error: device-side assert triggered

综合查到的资料、观点,解决思路总结如下:

1、查看cuda版本和python版本是否匹配,如不匹配,需要重新安装。

PS:因为我用我的环境跑过好多网络,所以这个问题不存在。

2、batch_size设置的太大,可以适当减小些。

3、查看num_class是否等于类别数,因为我做的是语义分割二分类任务,所以num_class设置为2。

3、该错误大多出现在loss函数附近,所以可以检查下生成的预测图和mask图shape是否一致:

#predict为预测图,mask为输入的标签图
a = predict.shape
b = mask.shape
print(a,b)

若a=b,则两者相同,问题不出在这。

4、用isnan()查看mask及预测图中是否含有未知数nan:

c = torch.isnan(y_true).any()
d = torch.isnan(y_pred).any()
print(c,d)
#y_true为mask图,y_pred为预测图
#若均为FALSE,说明mask图和生成的预测图中没有nan

5、如果是bceloss,标签必须要在0到1之间,可以用assert函数判断输出loss函数需要的mask与pred的的max(),min(),若发现pred或mask的值没有映射到0-1之间,需要将最后输出的pred这里添加一个sigmoid(用于二分类)函数:

pred = nn.Sigmoid()(pred)

或在网络的def forward返回值前进行sigmoid操作。

你可能感兴趣的:(python,深度学习,开发语言,人工智能,架构)