Keras: Пиксельный дисбаланс классов в сегментации двоичного изображения - PullRequest
0 голосов
/ 07 мая 2019

У меня есть задача, в которой я ввожу 500x500x1 изображение и получаю 500x500x1 двоичную сегментацию.При работе должна срабатывать только небольшая часть 500x500 (маленькие «цели»).Я использую сигмовидную активацию на выходе.Поскольку желательно, чтобы такая небольшая доля была положительной, тренировка имеет тенденцию останавливаться со всеми выходами в нуле или очень близко.Я написал свою собственную функцию потерь, которая частично справляется с ней, но я бы хотел использовать двоичную кросс-энтропию с весами классов, если это возможно.

Мой вопрос состоит из двух частей:

  1. Если я наивно применю binary_crossentropy как потерю к моему 500x500x1 выводу, будет ли он применяться на основе на пиксельпо желанию?

  2. Есть ли у кераса способ применить взвешивание классов с одним сигмовидным выходом на пиксель?

1 Ответ

1 голос
/ 07 мая 2019

Чтобы ответить на ваши вопросы.

1) Да, binary_cross_entropy будет работать на основе пикселей, при условии, что вы подаете на пары изображений нейронной сети сегмента изображения форму (изображение 500x500x1 (изображение в градациях серого) + 500x500x1 (соответствуетмаска для вашего изображения).

2) Путем подачи параметра 'class_weight' в model.fit ()

Предположим, у вас есть 2 класса с распределением 90% -10%.Тогда вы можете захотеть оштрафовать свой алгоритм в 9 раз больше, если он допустит ошибку для менее хорошо представленного класса (класс с 10% в данном случае).Предположим, у вас есть 900 примеров класса 1 и 100 примеров класса 2.

Затем ваш словарь весов классов (есть несколько способов его вычислить, но важно назначить больший вес менее хорошо представленному классу.), class_weights = {0: 1000 / 900,1: 1000/100}

Пример: model.fit(X_train, Y_train, epochs = 30, batch_size=32, class_weight=class_weight)

ПРИМЕЧАНИЕ. Это доступно только для двумерных случаев (class_weight).Для трехмерных пространств и пространств с более высокой размерностью следует использовать «sample_weights».

3) Другие показатели, кроме binary_cross_entropy иategor_cross_entropy, по своей природе лучше работают с несбалансированными наборами данных.Dice_Metric - это такая метрика.

Реализация Keras:

smooth = 1.

    def dice_coef(y_true, y_pred):
        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 dice_coef_loss(y_true, y_pred):
        return -dice_coef(y_true, y_pred)
...