在 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 损失函数中配置标签的主要内容,如果未能解决你的问题,请参考以下文章
anaconda安装tensorflow,在import tensorflow时报错,要怎么解决