马修斯相关系数作为 keras 的损失

tag*_*tag 1 python keras tensorflow

我尝试使用 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())
Run Code Online (Sandbox Code Playgroud)

如果我将此函数用作指标而不是用作损失函数,则它起作用。我怎样才能使用这个函数作为损失?

删除 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"]]

Ale*_*xis 5

答案是:你不能

让我解释一下原因。首先我们需要定义一些东西:

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

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

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

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

你可以做什么?

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