Выбор формулы для расчета Dice метрики
Я решаю задачу бинарной сегментации медицинских снимков и планирую в качестве метрики качества использовать Dice. Проблема состоит в следующем: в разных статьях используют две разные формулы для подсчета этого коэффициента. Такая:
class DiceMetric1(nn.Module):
def __init__(self, weight=None, size_average=True):
super(DiceMetric1, self).__init__()
def forward(self, inputs, targets, smooth=1e-6):
inputs = inputs.view(-1)
targets = targets.view(-1)
intersection = (inputs * targets).sum()
dice = (2.*intersection + smooth)/(torch.pow(inputs, 2).sum() + torch.pow(targets,2).sum() + smooth)
return dice
Или такая:
class DiceMetric2(nn.Module):
def __init__(self, weight=None, size_average=True):
super(DiceMetric2, self).__init__()
def forward(self, inputs, targets, smooth=1e-6):
inputs = inputs.view(-1)
targets = targets.view(-1)
intersection = (inputs * targets).sum()
dice = (2.*intersection + smooth)/(inputs.sum() + targets.sum() + smooth)
return dice
Эксперименты показали, что значение посчитанное по первой формуле обычно больше, чем по второй. Какую стоит использовать?
Второй вопрос заключается в том, что в моем датасете есть изображения, в маске которых вообще нету положительных значений, а только фон (в маске он соответствует значению 0). Для таких изображений значение метрики выводятся очень маленькими, даже если полученные сетью вероятности близки к нулю, что выглядит не очень логично, ведь сеть правильно поняла, что на картинке фон. Но эта проблема решается, если поставить значение smooth = 1, а именно такое значение по умолчанию я видел в половине реализаций Dice (в другой половине smooth = 1e-6). Какой smooth стоит использовать?