Чтобы ответить на ваши вопросы.
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)