Keras自定义损失函数产生奇怪的结果

时间:2019-09-17 05:57:23

标签: tensorflow keras

我正在尝试在Keras中编写自定义的加权二进制交叉熵损失函数。但是,当我使用自定义损失函数编译模型时,损失和准确性均下降。通常,当我使用普通BCE训练模型时,精度约为90%,但是当我使用自定义损失函数时,精度会降至3-10%。这是我的自定义损失函数:

def weighted_crossentropy_core(y_true, y_pred, pos_weight, neg_weight):

    wcel = K.binary_crossentropy(y_true, y_pred)
    weight = y_true * pos_weight + (1.0 - y_true) * neg_weight
    wcel = K.mean(weight * cel)

    return wcel

def weighted_crossentropy_wrapper(pos_weight=1, neg_weight=1):
    def weighted_crossentropy_return(y_true, y_pred):
        return weighted_crossentropy_core(y_true, y_pred, pos_weight, neg_weight)
    return weighted_crossentropy_return

wcel = weighted_crossentropy_wrapper()
model.compile(Adam(init_lr), loss=wcel, metrics=["accuracy"])

最奇怪的是,当我包装tf.keras.losses.binary_crossentropy损失函数,然后发送包装器时(与keras的bce损失基本相同),所产生的损失与我完全不同在没有包装的情况下通过keras bce时得到的!这是我包装bce的方法:

def wrapped_bce(y_true, y_pred):

    bce = tf.keras.losses.binary_crossentropy(y_true, y_pred)

    return bce

wcel = wrapped_bce()
model.compile(Adam(init_lr), loss=wcel, metrics=["accuracy"])

包裹损失函数的方式有什么问题吗?预先感谢!

1 个答案:

答案 0 :(得分:0)

要在第二个示例中弥补损失,应使用wcel = wrapped_bce(不带括号)。

第一个示例中的内容相同,但是您的函数weighted_crossentropy_wrapper是另一个包装器的包装器,并且省略了y_truey_pred,这对我来说有点奇怪。