在 TensorFlow BinaryCrossentropy 损失函数中配置标签

问题描述

我想使用 tf.keras.losses.BinaryCrossentropy 计算交叉熵损失。该文档有以下示例,并指定真实标签和预测标签应具有 [batch_size] 形状:

y_true = [[0.,1.],[0.,0.]]
y_pred = [[0.6,0.4],[0.4,0.6]]

bce = tf.keras.losses.BinaryCrossentropy()
bce(y_true,y_pred).numpy()

从例子中推断,每个样本的标签应该格式化为[属于第0类的概率,属于第1类的概率]。这是对的吗?如果是,为什么 y_true[1] 概率加起来不等于 1?

解决方法

不要将每一行视为一个示例,而是将每个元素视为一个示例。换句话说,第一个示例的标签为 0,模型预测为 0.6,第二个示例的标签为 1,模型预测为 0.4,依此类推。

至少 TensorFlow 是这样计算上述张量的交叉熵的。所以,每一行不需要加起来为 1。

您可以使用 K.binary_crossentropy() 使用的函数 tf.keras.losses.BinaryCrossentropy() 来检查它的有效性。

K.binary_crossentropy(y_true,y_pred)

哪个会返回,

[[0.9162906 0.9162905]
 [0.5108254 0.9162906]]

tf.keras.losses.BinaryCrossentropy() 函数对上述输出的最后一个轴进行缩减,如文档 here 中所述,

加权损失浮动张量。如果reduction 为NONE,则其形状为[batch_size,d0,.. dN-1];否则,它是标量。 (注意 dN-1,因为所有损失函数都减少了 1 维,通常轴 =-1。)

这就是为什么你,如果你执行,

bce = tf.keras.losses.BinaryCrossentropy(reduction=tf.keras.losses.Reduction.NONE)

您只会看到两个条目,

[0.9162905  0.71355796]

希望这能清除它。