Сегментация изображения - пользовательская функция потери в Keras - PullRequest
0 голосов
/ 11 мая 2018

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

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

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

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?

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

1 Ответ

0 голосов
/ 12 мая 2018

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

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

реализация для keras

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

...