自定义keras损失

时间:2019-12-07 17:55:52

标签: python tensorflow keras

我正在使用带有tensorflow后端的keras,并且尝试编写自定义keras损失函数,我需要为我的每个类(我有4个类)计算f1分数,问题是当我编写代码时在编译模型时出现错误,因为y_truey_pred是模型编译时的占位符,因此我无法使用scikit-learn计算f1分数。 解决该问题的通常方法是使用keras后端内置函数来解决自定义丢失,但似乎很难将它们用于按类计算的f1分数。 希望对您有所帮助:)

def F1_Loss(y_true,y_pred):
    y_true = K.eval(y_true)
    y_pred = K.eval(y_pred)
    f1_vector = sklearn.metrics.f1_score(y_true,to_categorical(np.argmax(y_pred,axis=1),num_classes=4),average=None)
    return np.mean(f1_vector)

1 个答案:

答案 0 :(得分:2)

我解决了我在这里张贴的问题,以防有人遇到相同的问题

def F1_Vector(y_true,y_pred):
    tp = K.sum(K.cast(y_true*y_pred, 'float'), axis=0)
    tn = K.sum(K.cast((1-y_true)*(1-y_pred), 'float'), axis=0)
    fp = K.sum(K.cast((1-y_true)*y_pred, 'float'), axis=0)
    fn = K.sum(K.cast(y_true*(1-y_pred), 'float'), axis=0)
    p = tp / (tp + fp + K.epsilon())
    r = tp / (tp + fn + K.epsilon())
    f1 = 2*p*r / (p+r+K.epsilon())
    f1_vector = (tf.where(tf.math.is_nan(f1), tf.zeros_like(f1), f1))
    return f1_vector