众所周知,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
答案 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)
我不建议您将精度用作损失函数。
另一种解决方案是使用F1作为损失函数,然后手动调整概率截止值以获得所需的精确度以及召回率不太低。