В настоящее время я экспериментирую с различными функциями потерь и оптимизаторами для моей проблемы сегментации двоичного изображения. Однако функции потерь, которые я использую в своем Unet, дают разные карты сегментации вывода.
У меня очень несбалансированный набор данных, поэтому я пытаюсь потерять кости, для которых настраиваемая функция приведена ниже.
def dice_coef(y_true, y_pred, smooth=1):
"""
Dice = (2*|X & Y|)/ (|X|+ |Y|)
= 2*sum(|A*B|)/(sum(A^2)+sum(B^2))
ref: https://arxiv.org/pdf/1606.04797v1.pdf
"""
intersection = K.sum(K.abs(y_true * y_pred), axis=-1)
return (2. * intersection + smooth) / (K.sum(K.square(y_true), -1) + K.sum(K.square(y_pred), -1) + smooth)
def dice_coef_loss(y_true, y_pred):
return 1 - dice_coef(y_true, y_pred)
Двоичная перекрестная энтропия приводит к выходной карте вероятности, где каждый пиксель имеет интенсивность цвета, которая представляет вероятность того, что этот пиксель является положительным или отрицательным классом. Однако, когда я использую функцию потери игральных костей, выходные данные не являются картой вероятности, а пиксели классифицируются как 0 или 1.
Мои вопросы:
1. Как это возможно, что эти разные функции потерь имеют эти совершенно разные результаты?
- Есть ли способ настроить функцию потери игральных костей таким образом, чтобы карта выходной сегментации представляла собой карту вероятностей, аналогичную той, которая относится к потере двоичной кроссцентропии.