Я полагаю, что ваши y_true
изображения могут быть не в диапазоне от 0 до 1 .... Вы уверены, что они не находятся в диапазоне от 0 до 255? Или что у них есть один канал (вместо 3 каналов?)
Это не должно быть причиной, но вы используете пакетные кубики, вы должны использовать графические кости:
def dice_coef(y_true, y_pred, smooth=1):
y_true_f = K.batch_flatten(y_true)
y_pred_f = K.batch_flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f, axis=-1)
sums = K.sum(y_true_f, axis=-1) + K.sum(y_pred_f, axis=-1)
return (2. * intersection + smooth) / (sums + smooth)
Обычно я использую K.epsilon()
для «сглаживания» (что-то очень маленькое).
То же самое относится к iou
:
def iou(y_true, y_pred, smooth=1):
y_true_f = K.batch_flatten(y_true)
y_pred_f = K.batch_flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f, axis=-1)
union = K.sum(y_true_f, axis=-1) + K.sum(y_pred_f, axis=-1) - intersection
return (intersection + smooth) / (union + smooth)
Пример кости канала:
#considering shape (batch, classes, image_size, image_size)
def dice_coef(y_true, y_pred, smooth=1):
intersection = K.sum(y_true * y_pred, axis=[2,3])
sums = K.sum(y_true, axis=[2,3]) + K.sum(y_pred, axis=[2,3])
dice = (2. * intersection + smooth) / (sums + smooth)
return K.mean(dice, axis=-1)