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

Posted

技术标签:

【中文标题】在 TensorFlow BinaryCrossentropy 损失函数中配置标签【英文标题】:Configuring labels in TensorFlow BinaryCrossentropy loss function 【发布时间】:2021-07-08 00:41:24 【问题描述】:

我想使用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()

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

【问题讨论】:

【参考方案1】:

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

至少 TensorFlow 是这样计算上述张量的交叉熵的。因此,每一行的总和不需要为 1。

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

K.binary_crossentropy(y_true, y_pred)

哪个会返回,

[[0.9162906 0.9162905]
 [0.5108254 0.9162906]]

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

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

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

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

您只会看到两个条目,

[0.9162905  0.71355796]

希望这可以清除它。

【讨论】:

以上是关于在 TensorFlow BinaryCrossentropy 损失函数中配置标签的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow环境下安装Python包

为啥在windows下用不了tensorflow

大神在啊。tensorflow 遇到的问题

anaconda安装tensorflow,在import tensorflow时报错,要怎么解决

TensorFlow:在PyCharm中配置TensorFlow

在 tensorflow 2 中导入 tensorflow 模块很慢