最近在用U-Net做语义分割,效果不太好所以开始调整代码,换函数,写着写着就出现一些奇怪的错误,如题:
RuntimeError: CUDA error: device-side assert tr
Debug定位错误
根据报错信息,定位到损失函数处,打个断点,发现中间所有tensor都出现了以下错误:
unable to get repr for <class ‘torch.Tensor‘>
出现这个错误大概率就是tensor的shape有问题,或者分类数与tensor维度不匹配
最终发现问题就是出在了损失函数上,开始时我选用的是BCEWithLogitsLoss()函数,由于损失值居高不下,我试着换成了BCELoss()函数,没有考虑到二者的差异性。
- BCEWithLogitsLoss() 自带sigmoid处理将tensor映射到【0.1】之间
- BCELoss()函数调用之前需要手动使用torch.sigmoid完成映射
常见损失函数
损失函数通过torch.nn包实现
- 交叉熵损失 CrossEntropyLoss
在多分类任务中,经常采用 softmax 激活函数+交叉熵损失函数,因为交叉熵描述了两个概率分布的差异,然而神经网络输出的是向量,并不是概率分布的形式。所以需要 softmax激活函数将一个向量进行“归一化”成概率分布的形式,再采用交叉熵损失函数计算 loss。 - 二进制交叉熵损失 BCELoss
- BCEWithLogitsLoss