Как использовать взвешенную категориальную кроссентропию на FCN (U-Net) в Керасе?

Я построил модель Keras для сегментации изображений (U-Net). Однако в моих выборках некоторые неправильные классификации (области) не так важны, в то время как другие имеют решающее значение, поэтому я хочу присвоить им более высокий вес в функции потерь. Чтобы еще больше усложнить ситуацию, я бы хотел, чтобы некоторые неправильные классификации (класс 1 вместо 2) имели очень высокий штраф, в то время как обратный (класс 2 вместо 1) не должен подвергаться такому штрафу.

На мой взгляд, мне нужно использовать сумму (по всем пикселям) взвешенной категориальной кроссентропии, но лучшее, что я смог найти, это это:

def w_categorical_crossentropy(y_true, y_pred, weights):
    nb_cl = len(weights)
    final_mask = K.zeros_like(y_pred[:, 0])
    y_pred_max = K.max(y_pred, axis=1)
    y_pred_max = K.reshape(y_pred_max, (K.shape(y_pred)[0], 1))
    y_pred_max_mat = K.cast(K.equal(y_pred, y_pred_max), K.floatx())
    for c_p, c_t in product(range(nb_cl), range(nb_cl)):
        final_mask += (weights[c_t, c_p] * y_pred_max_mat[:, c_p] * y_true[:, c_t])
    return K.categorical_crossentropy(y_pred, y_true) * final_mask

Однако этот код работает только с одним предсказанием, и мне не хватает знаний о внутренней работе Keras (и математическая сторона этого не намного лучше). Кто-нибудь знает, как я могу его адаптировать, или даже лучше, есть ли готовая функция потерь, которая подойдет для моего случая?

Я был бы признателен за несколько указателей.

РЕДАКТИРОВАТЬ: мой вопрос похож на Как сделать точечный- разумная категориальная кроссэнтропия в Керасе?, за исключением того, что я хотел бы использовать взвешенную категориальную кроссэнтропию.


person johndodo    schedule 14.05.2017    source источник


Ответы (1)


Вы можете использовать карты весов (как предложено в документе U-Net). На этих картах весов вы можете взвешивать регионы с большим или меньшим весом. Вот какой-то псевдокод:

loss = compute_categorical_crossentropy()
weighted_loss = loss * weight_map # using element-wise multiplication
person Simdi    schedule 25.02.2019
comment
Я тоже делаю что-то похожее на исходный плакат, но с бинарной кроссентропией. Я полагаю, применим тот же псевдокод? - person n88b; 20.04.2019