Сегментация изображения — пользовательская функция потерь в Keras

Я использую U-Net, реализованную в Keras (https://arxiv.org/pdf/1505.04597.pdf) для сегментации клеточных органелл на микроскопических изображениях. Чтобы моя сеть распознавала несколько одиночных объектов, разделенных всего 1 пикселем, я хочу использовать карты весов для каждого изображения метки (формула приведена в публикации).

Насколько я знаю, мне нужно создать свою собственную функцию потерь (в моем случае кроссэнтропию), чтобы использовать эти карты весов. Однако пользовательская функция потерь принимает только два параметра. Как я могу добавить значения карты весов в такую ​​функцию?

Ниже приведен код моей пользовательской функции потерь:

def pixelwise_crossentropy(self, ytrue, ypred):

    ypred /= tf.reduce_sum(ypred, axis=len(ypred.get_shape()) - 1, keep_dims=True)

    # manual computation of crossentropy
    _epsilon = tf.convert_to_tensor(epsilon, ypred.dtype.base_dtype)
    output = tf.clip_by_value(ypred, _epsilon, 1. - _epsilon)

    return - tf.reduce_sum(ytrue * tf.log(output))

Есть ли способ объединить значения карты весов вместе со значениями меток в ytrue тензоре?

Прошу прощения, если эти вопросы покажутся глупыми, как я уже сказал, я относительно новичок в игре. Любая помощь или предложения будут с благодарностью!


person disputator1991    schedule 11.05.2018    source источник


Ответы (1)


если вы пытаетесь реализовать бинарную кросс-энтропийную взвешенную потерю, вы можете использовать встроенную функцию потерь тензорного потока

pos_weight = tf.constant([[1.0, 2.0]])
tensorflow.nn.weighted_cross_entropy_with_logits(y_true,
    y_pred,
    pos_weight,
    name=None) 

ознакомьтесь с документацией https://www.tensorflow.org/api_docs/python/tf/nn/weighted_cross_entropy_with_logits

реализация для кераса

def pixel_wise_loss(y_true, y_pred):
    pos_weight = tf.constant([[1.0, 2.0]])
    loss = tf.nn.weighted_cross_entropy_with_logits(
        y_true,
        y_pred,
        pos_weight,
        name=None
    )

    return K.mean(loss,axis=-1)

если вы пытаетесь реализовать softmax_cross_entropy_with_logits, перейдите по ссылке на предыдущую, где это объясняется softmax_cross_entropy_with_logits

person thefifthjack005    schedule 12.05.2018