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

在用服务器跑模型计算loss时,出现如下错误:Assertion input_val >= zero && input_val</p> <pre><code>/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 <= 0 440 one` failed. 0%| | [00:02 traceback (most recent call last): file "train_normal.py", line 212, in <module>
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&#x4E3A;mask&#x56FE;&#xFF0C;y_pred&#x4E3A;&#x9884;&#x6D4B;&#x56FE;
#&#x82E5;&#x5747;&#x4E3A;FALSE&#xFF0C;&#x8BF4;&#x660E;mask&#x56FE;&#x548C;&#x751F;&#x6210;&#x7684;&#x9884;&#x6D4B;&#x56FE;&#x4E2D;&#x6CA1;&#x6709;nan

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

pred = nn.Sigmoid()(pred)

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

Original: https://blog.csdn.net/weixin_43435855/article/details/126090321
Author: A徒手摘星星
Title: 错误:Assertion input_val >= zero && input_val <= one failed.

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/719079/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球