def dice_coefficient(y_true_cls, y_pred_cls,
training_mask):
'''
dice loss
:param y_true_cls:
:param y_pred_cls:
:param training_mask:
:return:
'''
eps = 1e-5
intersection = torch.sum(y_true_cls * y_pred_cls * training_mask)
union = torch.sum(y_true_cls * training_mask) + torch.sum(y_pred_cls * training_mask) + eps
loss = 1. - (2 * intersection / union)
return loss
今天使用dice损失函数,发现dice损失是负值,也就是说(2 * intersection / union)的值大于1。这绝对是错的。后续发现在最后一个卷积中使用的是nn.ReLU(inplace=True)激活函数。relu激活函数仅对负值进行归零操作,对正值不处理。因此会出现像素值的预测概率大于1的情况。因此换为,nn.Sigmoid()解决该问题。
nn.Conv2d(16, num_class, kernel_size=1),nn.ReLU(inplace=True)