首页 > 解决方案 > 马修斯相关系数作为keras中的损失

问题描述

我尝试使用 tf 后端为 keras 编写自定义损失函数。我收到以下错误

ValueError:一个操作有None梯度。请确保您的所有操作都定义了渐变(即可微分)。没有梯度的常见操作:K.argmax、K.round、K.eval。

def matthews_correlation(y_true, y_pred):
    y_pred_pos = K.round(K.clip(y_pred, 0, 1))
    y_pred_neg = 1 - y_pred_pos

    y_pos = K.round(K.clip(y_true, 0, 1))
    y_neg = 1 - y_pos

    tp = K.sum(y_pos * y_pred_pos)
    tn = K.sum(y_neg * y_pred_neg)

    fp = K.sum(y_neg * y_pred_pos)
    fn = K.sum(y_pos * y_pred_neg)

    numerator = (tp * tn - fp * fn)
    denominator = K.sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn))

    return 1.0 - numerator / (denominator + K.epsilon())

如果我将此函数用作度量而不是损失函数,则它可以工作。我怎样才能使用这个功能作为损失?

删除 K.round 后,我收到以下错误:

InvalidArgumentError: 无法挤压 dim[0],预期维度为 1,得到 8 [[{{node loss_9/dense_10_loss/Squeeze}} = Squeeze[T=DT_FLOAT,squeeze_dims=[-1],_device="/job: localhost/replica:0/task:0/device:GPU:0"] (_arg_dense_10_sample_weights_0_2/_2445)]] [[{{node loss_9/add_12/_2467}} = _Recvclient_terminated=false, recv_device="/job:localhost/replica :0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_6418_loss_9/add_12", tensor_type =DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]]

标签: pythontensorflowkeras

解决方案


答案是:你不能

让我解释一下为什么。首先我们需要定义一些东西:

  • 损失:损失函数或成本函数是将一个事件或一个或多个变量的值映射到一个实数上的函数,该实数直观地表示与该事件相关的一些“成本”。优化问题旨在最小化损失函数

  • 度量:在数学中,度量或距离函数是定义集合的每对元素之间的距离的函数

  • optmizer:一种优化(最小化)成本函数的方法。

现在为什么我们不能使用真阳性率作为损失函数?好吧,因为你不能最小化它。它不是凸的。所以你不能单独定义预测的成本。正如您从定义中看到的那样,它是一个成本函数,取决于所有答案来计算费率。您无法计算 1 个样本。

你可以做什么?

将其用作指标并在跟踪该指标的演变时使用早期停止并获得最佳迭代。


推荐阅读