在用服务器跑模型计算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操作。