【问题标题】:Configuring labels in TensorFlow BinaryCrossentropy loss function在 TensorFlow BinaryCrossentropy 损失函数中配置标签
【发布时间】: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?

【问题讨论】:

    标签: python tensorflow loss-function cross-entropy


    【解决方案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]
    

    希望这可以清除它。

    【讨论】:

      猜你喜欢
      • 2021-01-18
      • 1970-01-01
      • 2022-06-28
      • 2017-04-08
      • 2019-01-20
      • 2019-02-03
      • 1970-01-01
      • 2017-09-23
      • 2018-10-27
      相关资源
      最近更新 更多