为什么 keras binary_crossentropy 损失函数返回错误值?

机器算法验证 损失函数 张量流 喀拉斯 多标签 交叉熵
2022-03-26 10:14:45

多标签分类的二元交叉熵可以由以下损失函数定义:

1Ni=1N[yilog(y^i)+(1yi)log(1y^i)]

为什么kerasbinary_crossentropy损失函数返回不同的值?他们下面的公式是什么?我试图阅读源代码,但它并不容易理解。

更新

给出与 Keras 大致相同结果的代码:

import keras.backend as K
def binary_crossentropy(y_true, y_pred):
    result = []
    for i in range(len(y_pred)):
        y_pred[i] = [max(min(x, 1 - K.epsilon()), K.epsilon()) for x in y_pred[i]]
        result.append(-np.mean([y_true[i][j] * math.log(y_pred[i][j]) + (1 - y_true[i][j]) * math.log(1 - y_pred[i][j]) for j in range(len(y_pred[i]))]))
    return np.mean(result)
1个回答

您的代码中的错误:

1Ni=1N[y^ilog(y^i)+(1yi)log(1y^i)]

它应该是

1Ni=1N[yilog(y^i)+(1yi)log(1y^i)]

你的代码:

result.append([y_pred[i][j] * math.log(y_pred[i][j]) + (1 - y_true[i][j]) * math.log(1 - y_pred[i][j]) for j in range(len(y_pred[i]))])

应该改为

result.append([y_true[i][j] * math.log(y_pred[i][j]) + (1 - y_true[i][j]) * math.log(1 - y_pred[i][j]) for j in range(len(y_pred[i]))])

我已将您的第一个 y_pred 更改为 y_true。

编辑:同样来自keras 文档,我们有

binary_crossentropy(y_true, y_pred)

而不是

binary_crossentropy(y_pred, y_true)