我正在尝试在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"])
包裹损失函数的方式有什么问题吗?预先感谢!
答案 0 :(得分:0)
要在第二个示例中弥补损失,应使用wcel = wrapped_bce
(不带括号)。
第一个示例中的内容相同,但是您的函数weighted_crossentropy_wrapper
是另一个包装器的包装器,并且省略了y_true
和y_pred
,这对我来说有点奇怪。