Keras多标签图像分类与F1得分

6
我正在处理一个多标签图像分类问题,评估是根据系统预测和实际标签之间的 F1 分数进行的。
鉴于此,我应该使用 "loss='binary_crossentropy'" 还是 "loss=keras_metrics.f1_score()",其中 "keras_metrics.f1_score()" 取自这里: https://pypi.org/project/keras-metrics/?我有点困惑,因为我在互联网上找到的所有关于多标签分类的教程都基于 binary_crossentropy 损失函数,但在这里我需要针对 F1 分数进行优化。
此外,我应该设置 metrics=["accuracy"] 还是 metrics=[keras_metrics.f1_score()],或者干脆把它完全留空?

6
您应该使用f1_score作为度量值,而不是损失函数。在模型训练中,损失函数用于指导优化过程,而人可以理解的度量标准则用于我们理解模型的性能(即准确性)。还有一个重要的问题是,损失函数通常应该是可微分的,而大多数使用的度量函数则不具备这一属性。这个回答可能也会有所帮助。 - today
2
所以,只是为了确认一下:我可以使用keras_metrics包中的f1_score作为metrics=(人类可解释的),但对于loss=,我应该使用一个可微分的函数。那么,以下是关于F1-score的可微分版本呢? https://www.kaggle.com/rejpalcz/best-loss-function-for-f1-score-metric - user706838
3
我无法立即验证该损失函数,但如果它满足以下两个条件:1)可微分,2)最小化它意味着建立的模型具有更高的准确性(即更高的指标值),那么就可以使用它。另一个要点是,在Keras中对于多标签分类问题使用度量值'accuracy'可能会给出错误信号,特别是当唯一标签数目很高时,因为它给出非常高的值,因此你可能认为你的模型表现得极其良好,这可能并不是真实情况。因此,f1_score是一个更好的指标。 - today
2
所以我猜“准确率”不是应该在这里使用的正确“损失”函数,所以我肯定要使用f1_score。是的,但我想你指的是正确的“度量”函数 ;) - today
2
那基本上是正确的,唯一的例外是:「我必须找到/实现一个可微分版本的 '1 - F1 分数' 并将其用作损失函数」。实际上,并没有必要这样做,因为可能情况是 binary_crossentropy 也可以工作。但是,如果你能够找到一个可以直接针对 f1 分数进行目标设置的损失函数,并且在你的实验中它比 binary_crossentropy 效果更好,那么就可以使用该函数。但是我建议你首先开始尝试最常用的选项:binary_crossentropy - today
显示剩余2条评论
1个回答

2

根据user706838的回答...

使用f1_score,网址为https://www.kaggle.com/rejpalcz/best-loss-function-for-f1-score-metric

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接