gpt4 book ai didi

python-3.x - 如何为keras编写具有加权平均值的自定义f1损失函数?

转载 作者:行者123 更新时间:2023-12-03 23:51:29 26 4
gpt4 key购买 nike

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

像这样的东西:

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_true y_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) + K.epsilon() # = TP + FN
pred_positives = K.sum(pred, axis=0) + K.epsilon() # = TP + FP
true_positives = K.sum(true * pred, axis=0) + K.epsilon() # = TP
#all with shape (4,)

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

f1 = 2 * (precision * recall) / (precision + recall + K.epsilon())
#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 功能,例如样本权重。

关于python-3.x - 如何为keras编写具有加权平均值的自定义f1损失函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59963911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com