【问题标题】:How to calculate True Positive in custom loss function in Keras如何在 Keras 的自定义损失函数中计算 True Positive
【发布时间】:2019-02-25 14:15:05
【问题描述】:

我用 Keras 做分类任务,我在 Keras 中制作了简单的自定义损失函数,它可以工作

import keras.backend as K

def customLoss(yTrue,yPred):

    return K.abs(yTrue-yPred)

为了制作我想要的更复杂的损失函数,我需要计算真阳性、真阴性、假阳性、假阴性

如何计算它们?

我无法计算它们,因为我不知道 yTrue 和 yPred 的类型。它们是二维数组还是列表或其他任何东西。如果我知道,也许我可以使用 for 计算 TP,TN,FP,FN,如下所示:

TP=0
for x,y in zip(yTrue,yPred):
   if x == 1 and y > 0.5:
      TP=TP+1

【问题讨论】:

  • 即使你可以定义一个带有True Positives、True Negatives等的损失函数,它也可能对训练不起作用。这是因为损失函数需要是连续的,因此优化器可以判断模型中的微小变化是否会使损失变得无限好或更坏。由于您的训练示例数量有限,因此 TP/TN/FP/FN 之类的量会在离散的跳跃中移动,这使得优化器很可能无法找到任何有用的东西。看看使用分类交叉熵作为损失函数,然后使用上面的自定义函数作为指标。
  • 我真正的问题是我想要比召回更大的精度,例如精度 = 0.9 和召回 = 0.5,而不是精度 = 0.5 和召回 = 0.9,如何构建“理解”我的损失函数需要吗?

标签: python machine-learning keras deep-learning


【解决方案1】:

根据Keras Documentation,yTrue/yPred 的数据类型是 TensorFlow/Theano 张量,具体取决于您使用的后端。

因此,损失函数不能使用for循环,否则会报错。

但是对于这个问题,你可以使用逻辑和:

TN = np.logical_and(K.eval(y_true) == 0, K.eval(y_pred) == 0)
FP = np.logical_and(K.eval(y_true) == 0, K.eval(y_pred) == 1)

之后你可以添加它们:

TN = K.sum(K.variable(TN))
FP = K.sum(K.variable(FP))

【讨论】:

  • 我使用 theano 后端,但它不起作用。它返回错误
  • 你得到什么错误?如果是 logical_and 的问题,那么您可以尝试使用 'keras.backend.all(keras.backend.stack([x, y], axis=0), axis=0)' 代替,其中 x=K.eval (y_true) == 0 和 y=K.eval(y_pred) == 0 例如
猜你喜欢
  • 2020-12-19
  • 2017-12-18
  • 2020-03-27
  • 1970-01-01
  • 2019-03-13
  • 2020-06-09
  • 2018-11-24
  • 2021-09-21
  • 1970-01-01
相关资源
最近更新 更多