如何编写具有加权平均的keras自定义f1损失函数?

妮基·米什拉(Nikhil Mishra)

我正在尝试在keras中进行多类分类。到目前为止,我使用categorical_crossentropy作为损失函数。但是由于所需的度量是weighted-f1,所以我不确定categorical_crossentropy是否是最佳损耗选择。我试图使用sklearn.metrics.f1_score在keras中实现加权f1分数,但是由于张量和标量之间的转换问题,我遇到了错误。

像这样:

def f1_loss(y_true, y_pred):
   return 1 - f1_score(np.argmax(y_true, axis=1), np.argmax(y_pred, axis=1), average='weighted')

其次是

 model.compile(loss=f1_loss, optimizer=opt)

如何在keras中编写此损失函数?

编辑:

y_true和y_pred的形状(n_samples,n_classes),在我的情况下是(n_samples,4)

y_truey_pred都是张量,因此sklearn的f1_score无法直接在它们上工作。我需要一个函数来计算张量上的加权f1

丹尼尔·莫勒

变量是自我解释的:

def f1_weighted(true, pred): #shapes (batch, 4)

    #for metrics include these two lines, for loss, don't include them
    #these are meant to round 'pred' to exactly zeros and ones
    #predLabels = K.argmax(pred, axis=-1)
    #pred = K.one_hot(predLabels, 4) 


    ground_positives = K.sum(true, axis=0)       # = TP + FN
    pred_positives = K.sum(pred, axis=0)         # = TP + FP
    true_positives = K.sum(true * pred, axis=0)  # = TP
        #all with shape (4,)

    precision = (true_positives + K.epsilon()) / (pred_positives + K.epsilon()) 
    recall = (true_positives + K.epsilon()) / (ground_positives + K.epsilon()) 
        #both = 1 if ground_positives == 0 or pred_positives == 0
        #shape (4,)

    f1 = 2 * (precision * recall) / (precision + recall + K.epsilon())
        #not sure if this last epsilon is necessary
        #matematically not, but maybe to avoid computational instability
        #still with shape (4,)

    weighted_f1 = f1 * ground_positives / K.sum(ground_positives)
    weighted_f1 = K.sum(weighted_f1)


    return 1 - weighted_f1 #for metrics, return only 'weighted_f1'

重要笔记:

这种损失将分批进行(与任何Keras损失一样)。

因此,如果您使用小批量,则每个批之间的结果将不稳定,并且可能会得到不好的结果。使用大批量,足以包含所有类别的大量样本。

由于这种损失会使批次大小崩溃,因此,您将无法使用某些依赖于批次大小的Keras功能,例如样品重量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Keras自定义损失函数InvalidArgumentError:In [1]不是矩阵。相反,它具有形状[]

来自分类Dev

keras 中的加权 mse 自定义损失函数 - 自定义权重

来自分类Dev

如何在Tensorflow中编写自定义损失函数?

来自分类Dev

如何在Keras中加快具有自定义损失功能的模型的训练?

来自分类Dev

自定义keras损失

来自分类Dev

如何在Keras / Tensorflow中编写自定义损失函数,该函数将循环/迭代与参考numpy代码一起使用

来自分类Dev

Keras中具有自定义损失功能的批次大小错误

来自分类Dev

Keras 自定义损失具有使用的功能之一和条件

来自分类Dev

Keras,Python中的自定义损失函数?

来自分类Dev

Keras模型-在自定义损失函数中获取输入

来自分类Dev

在CNN的Keras自定义损失函数中处理数据

来自分类Dev

Keras:无法在模型中使用自定义损失函数

来自分类Dev

自定义损失函数,Keras \\ ValueError:无渐变

来自分类Dev

基于输入数据的Keras中的自定义损失函数

来自分类Dev

如何在Keras自定义损失函数中使用张量?

来自分类Dev

如何计算自定义 keras 损失函数中属于一个标签类的元素?

来自分类Dev

如何为Keras使用自定义损失功能

来自分类Dev

张量流中具有循环的自定义损失

来自分类Dev

F#如何列出具有自定义属性的函数?

来自分类Dev

Keras上的自定义损失功能

来自分类Dev

在Keras建立自定义损失

来自分类Dev

Keras 中自定义损失的输出

来自分类Dev

具有加权边缘的1/0背包变化

来自分类Dev

Keras ValueError:尺寸必须相等-如何将标签相关的值传递给自定义损失函数

来自分类Dev

PyTorch中具有自定义后向功能的损失-简单的MSE示例中的爆炸损失

来自分类Dev

在Mac OS(10.9)上从具有加密功能的自定义QIODevice播放QMediaplayer流

来自分类Dev

如何编写一个函数,该函数创建一定长度的对象数组?对象具有自定义生成的数据

来自分类Dev

以y_true取决于y_pred的方式自定义Keras的损失函数

来自分类Dev

琐碎的自定义Keras损失函数导致精度指标失败

Related 相关文章

  1. 1

    Keras自定义损失函数InvalidArgumentError:In [1]不是矩阵。相反,它具有形状[]

  2. 2

    keras 中的加权 mse 自定义损失函数 - 自定义权重

  3. 3

    如何在Tensorflow中编写自定义损失函数?

  4. 4

    如何在Keras中加快具有自定义损失功能的模型的训练?

  5. 5

    自定义keras损失

  6. 6

    如何在Keras / Tensorflow中编写自定义损失函数,该函数将循环/迭代与参考numpy代码一起使用

  7. 7

    Keras中具有自定义损失功能的批次大小错误

  8. 8

    Keras 自定义损失具有使用的功能之一和条件

  9. 9

    Keras,Python中的自定义损失函数?

  10. 10

    Keras模型-在自定义损失函数中获取输入

  11. 11

    在CNN的Keras自定义损失函数中处理数据

  12. 12

    Keras:无法在模型中使用自定义损失函数

  13. 13

    自定义损失函数,Keras \\ ValueError:无渐变

  14. 14

    基于输入数据的Keras中的自定义损失函数

  15. 15

    如何在Keras自定义损失函数中使用张量?

  16. 16

    如何计算自定义 keras 损失函数中属于一个标签类的元素?

  17. 17

    如何为Keras使用自定义损失功能

  18. 18

    张量流中具有循环的自定义损失

  19. 19

    F#如何列出具有自定义属性的函数?

  20. 20

    Keras上的自定义损失功能

  21. 21

    在Keras建立自定义损失

  22. 22

    Keras 中自定义损失的输出

  23. 23

    具有加权边缘的1/0背包变化

  24. 24

    Keras ValueError:尺寸必须相等-如何将标签相关的值传递给自定义损失函数

  25. 25

    PyTorch中具有自定义后向功能的损失-简单的MSE示例中的爆炸损失

  26. 26

    在Mac OS(10.9)上从具有加密功能的自定义QIODevice播放QMediaplayer流

  27. 27

    如何编写一个函数,该函数创建一定长度的对象数组?对象具有自定义生成的数据

  28. 28

    以y_true取决于y_pred的方式自定义Keras的损失函数

  29. 29

    琐碎的自定义Keras损失函数导致精度指标失败

热门标签

归档