Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow Keras自定义损失函数产生奇怪的结果_Tensorflow_Keras - Fatal编程技术网

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

Tensorflow Keras自定义损失函数产生奇怪的结果,tensorflow,keras,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) we

我试图在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.loss.binary_crossentropy loss函数,然后发送包装(本质上与keras的bce loss相同)时,产生的损失与我在没有包装的情况下通过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"])

我包装损失函数的方式有什么问题吗?提前谢谢

要在第二个示例中包装您的损失,您应该使用
wcel=wrapped\u bce
(不带括号)


在第一个示例中也是一样,但是您的函数
加权的交叉熵包装
是另一个包装的包装,省略了
y\u true
y\u pred
,这对我来说有点奇怪。

要在第二个示例中包装您的损失,您应该使用
wcel=wrapped\u bce
(不带括号)


在第一个示例中也是一样,但是您的函数
加权的\u crossentropy\u wrapper
是另一个包装的包装,并且省略了
y\u true
y\u pred
,这对我来说有点奇怪。

很抱歉这里的错误。我刚刚运行了:```model.compile(Adam(init_lr),loss=wrapped_bce,metrics=[“accurity”]```它仍然给我带来了与keras bce不同的奇怪的损失和准确性。对于我跟随这篇文章的第一个例子:好的,我理解你在第一个例子中做了什么。关于使用和不使用包装器的不同结果,这很奇怪。包装器不应该对结果有任何影响。在比较结果之前,你是重新训练你的模型(在这种情况下,你会有差异)还是只是重新编译它?我重新编译模型。这里的错误很抱歉。我刚刚运行了:```model.compile(Adam(init_lr),loss=wrapped_bce,metrics=[“accurity”]```它仍然给我带来了与keras bce不同的奇怪的损失和准确性。对于我跟随这篇文章的第一个例子:好的,我理解你在第一个例子中做了什么。关于使用和不使用包装器的不同结果,这很奇怪。包装器不应该对结果有任何影响。在比较结果之前,你是重新训练你的模型(在这种情况下,你会有差异),还是只是重新编译它?我重新编译模型。