具有F1分数的Keras多标签图像分类

时间:2019-05-26 17:42:28

标签: python tensorflow keras classification multilabel-classification

我正在研究一个multi-label图像分类问题,并根据系统预测的和地面真实标签之间的F1-score进行了评估。

有鉴于此,我应该使用loss="binary_crossentropy"loss=keras_metrics.f1_score(),其中keras_metrics.f1_score()来自以下位置:https://pypi.org/project/keras-metrics/?我有点困惑,因为我在互联网上找到的有关multi-label分类的所有教程都是基于binary_crossentropy损失函数的,但是在这里我必须针对F1-score进行优化。

此外,我应该设置metrics=["accuracy"]还是metrics=[keras_metrics.f1_score()]还是将其完全留空?

1 个答案:

答案 0 :(得分:0)

基于user706838的答案...

使用https://www.kaggle.com/rejpalcz/best-loss-function-for-f1-score-metric中的f1_score

import tensorflow as tf
import keras.backend as K

def f1_loss(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 = tf.where(tf.is_nan(f1), tf.zeros_like(f1), f1)
    return 1 - K.mean(f1)