首页 文章

图像分割 - Keras中的自定义丢失功能

提问于
浏览
2

我正在使用Keras实施的U-Net(https://arxiv.org/pdf/1505.04597.pdf)来分割显微镜图像中的细胞器 . 为了让我的网络识别出仅由1个像素分隔的多个单个对象,我想为每个标签图像使用权重贴图(公式在出版物中给出) .

据我所知,我必须创建自己的自定义丢失函数(在我的情况下是crossentropy)来使用这些权重贴图 . 但是,自定义丢失功能仅包含两个参数 . 如何在这样的函数中添加权重贴图值?

以下是我的自定义丢失功能的代码:

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 回答

  • 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

    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

相关问题