问题描述
我想使用 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]
希望这能清除它。