gpt4 book ai didi

python - 当我在 tensorflow.keras 中使用 BinaryCrossentropy(from_logits=True) 时,我应该使用什么作为目标向量

转载 作者:行者123 更新时间:2023-12-04 00:20:13 33 4
gpt4 key购买 nike

我有一个多标签分类,其中每个目标都是一个由 1 和 0 组成的向量 不是 相互排斥(为了清楚起见,我的目标是类似 [0, 1, 0, 0, 1, 1, ... ] 的东西)。

到目前为止我的理解是:

  • 我应该使用二元交叉熵函数。 (如本 answer 中所述)
  • 另外,我了解到 tf.keras.losses.BinaryCrossentropy()是围绕 tensorflow 的 sigmoid_cross_entropy_with_logits 的包装器.这可以与 from_logits 一起使用TrueFalse . (如本 question 中所述)
  • sigmoid_cross_entropy_with_logits执行自己的 sigmoid,它期望输入在 [-inf,+inf] 范围内。
  • tf.keras.losses.BinaryCrossentropy() ,当网络实现
    本身是最后一层的 sigmoid 激活,必须与 from_logits=False 一起使用.然后它将推断 sigmoid 函数并将输出传递给 sigmoid_cross_entropy_with_logits这将再次执行 sigmoid。然而,由于 sigmoid/logit 函数的渐近线,这可能会导致数值问题。
  • 为了提高数值稳定性,我们可以避免最后一个 sigmoid 层并使用 tf.keras.losses.BinaryCrossentropy(from_logits=False)

  • 题:

    如果我们使用 tf.keras.losses.BinaryCrossentropy(from_logits=False) ,我应该使用什么目标?我是否需要更改 one-hot 向量的目标?

    我想我应该在推理时将 sigmoid 激活应用于网络输出。有没有办法添加仅在推理模式下而不是在训练模式下事件的 sigmoid 层?

    最佳答案

    首先,让我对数值稳定性做一些说明:
    如评论部分所述,使用 from_logits=False 时的数值不稳定性来自将概率值转换回 logits 的过程,这涉及裁剪操作(如 this questionits answer 中所述)。但是,据我所知,这不会产生任何 严重问题大多数实际应用 (尽管在某些情况下,在损失函数中应用 softmax/sigmoid 函数,即使用 from_logits=True,在计算梯度方面会在数值上更稳定;请参阅 this answer 以获得数学解释)。
    换句话说,如果您不关心敏感度小于 1e-7 的生成概率值的精度,或在您的实验中观察到的相关收敛问题 ,那你不用太担心;只需像以前一样使用 sigmoid 和二元交叉熵,即 model.compile(loss='binary_crossentropy', ...) ,它会工作得很好。
    总而言之,如果你真的关心数值稳定性,你可以走最安全的路径并使用 from_logits=True在模型的最后一层不使用任何激活函数。

    现在,要回答最初的问题,使用 y_true 时,真正的标签或目标值(即 BinaryCrossentropy(from_logits=True) )应该仍然只是零或一。 .相反,那是 y_pred (即模型的输出)在这种情况下不应是概率分布(即,如果 from_logits=True ,则不应在最后一层使用 sigmoid 函数)。

    关于python - 当我在 tensorflow.keras 中使用 BinaryCrossentropy(from_logits=True) 时,我应该使用什么作为目标向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61233425/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com