如何在Keras中将精度定义为损失函数?

时间:2018-04-25 14:21:10

标签: keras loss-function

众所周知,keras中的sparse_categorical_crossentropy可以获得每个类别中的平均损失函数。但是,如果我最关心的只有一个类别呢?就像我想基于此类别定义精度(= TP /(TP + FP))作为损失函数一样,我该如何编写它?谢谢!

我的代码就像:

from keras import backend as K
def my_loss(y_true,y_pred):
    y_true = K.cast(y_true,"float32")
    y_pred = K.cast(K.argmax(y_pred),"float32")
    nominator = K.sum(K.cast(K.equal(y_true,y_pred) & K.equal(y_true, 0),"float32"))
    denominator = K.sum(K.cast(K.equal(y_pred,0),"float32"))
    return -(nominator + K.epsilon()) / (denominator + K.epsilon())

错误就像:

argmax is not differentiable

3 个答案:

答案 0 :(得分:1)

您可以将fit [{1}}参数传递给fit方法,以确定哪些类更重要。

应该是字典:

class_weight

自定义丢失

如果这不是您所需要的,您可以创建丢失函数,如:

{
    0: 1, #class 0 has weight 1
    1: 0.5, #class 1 has half the importance of class 0
    2: 0.7, #....
    ...
}

答案 1 :(得分:0)

您不能使用argmax,因为它不可区分。这意味着如果无法区分损失函数,则反向传播将无法工作。

执行y_true * y_pred,而不是使用argmax。

答案 2 :(得分:0)

我不建议您将精度用作损失函数。

  • 无法将其设置为nn的损失函数。
  • 您可以通过将所有实例预测为负类来最大化它,这没有任何意义。

另一种解决方案是使用F1作为损失函数,然后手动调整概率截止值以获得所需的精确度以及召回率不太低。