Кубик кости больше 1 - PullRequest
       65

Кубик кости больше 1

3 голосов
/ 06 февраля 2020

Когда я тренировался UNET, число костей и кубиков иногда становилось больше 1 и iou > dice, затем через несколько партий они снова становились нормальными. Как показано на картинке .

, я определил их следующим образом:

def dice_coef(y_true, y_pred, smooth=1):
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = K.sum(y_true_f * y_pred_f)
    return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)

def iou(y_true, y_pred, smooth=1):
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = K.sum(y_true_f * y_pred_f)
    union = K.sum(y_true_f) + K.sum(y_pred_f) - intersection
    return (intersection + smooth) / (union + smooth)

def dice_loss(y_true, y_pred):
    return 1. - dice_coef(y_true, y_pred)

Я попытался добавить K.abs() в y_pred, но это привело к снижению производительности , Я чувствую, что поскольку выход активирован сигмоидом, должно ли добавление K.abs() или нет давать тот же результат? Кроме того, как вы можете видеть, моя точность странная, я полагался на кости, чтобы судить о производительности моей модели, было бы лучше, если бы кто-то мог указать на проблему.

1 Ответ

2 голосов
/ 06 февраля 2020

Я полагаю, что ваши 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)
...