gpt4 book ai didi

python - from_logits=True 但损失为 0

转载 作者:行者123 更新时间:2023-12-04 07:51:38 24 4
gpt4 key购买 nike

我正在学习 tensorflow 并希望将 tensorflow 实现与数学联系起来。
据我所知,数学交叉熵要求其输入的总和为 1。在以下代码中,y_true是有效输入,而 y_pred不是数学上有效的输入:

y_true = [[0, 1]]
y_pred = [[1.0, 20.0]]
print(tf.keras.losses.CategoricalCrossentropy(from_logits=False).call(y_true, y_pred))
print(tf.keras.losses.CategoricalCrossentropy(from_logits=True).call(y_true, y_pred))
给出:
tf.Tensor([0.04879016], shape=(1,), dtype=float32)
tf.Tensor([0.], shape=(1,), dtype=float32)
请找到要点 here .
This answer说:

if from_logits=False, means the input is a probability


This answer说:

from_logits=True means the input to crossEntropy layer is normaltensor/logits


This answer说:

"Another name for raw_predictions in the above code is logit

from_logits ,我猜,意味着输入是 raw_predictions .
由于我的输入不是概率,我设置了 from_logits=True ,但我得到的结果是 0。
谁能解释一下?

最佳答案

标签之间的交叉熵[[0, 1]]和登录 [[1, 20]]应该是一个非常接近 0 的值(并且由于浮点不精确,某些输出可能将其表示为零)。表示为概率,这些 logits 将约为 [[0.000000005, 1]] .请注意这些概率与标签的接近程度。因此交叉熵应该非常低。
正如 OP 在他们的问题中指出的那样,from_logits=True在未缩放的输出上操作时应使用。实际上,from_logits=True如果在 softmax 之前对输出进行操作,则使用。 Softmax 将未缩放的输出映射到概率。要计算这些概率的交叉熵,from_logits=False应该使用。
下面是一个例子:

import tensorflow as tf

y_true = tf.convert_to_tensor([[0, 1]], "float32")
y_pred = tf.convert_to_tensor([[1, 20]], "float32")

ce_logits_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
ce_probs_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=False)

print(ce_logits_fn(y_true, y_pred))
# tf.Tensor(0.0, shape=(), dtype=float32)

print(ce_probs_fn(y_true, tf.nn.softmax(y_pred)))
# tf.Tensor(1.1920929e-07, shape=(), dtype=float32)
尝试将预测更接近。在上面的例子中,正确类的值远高于错误类的值,因此交叉熵会很低。
import tensorflow as tf

y_true = tf.convert_to_tensor([[0, 1]], "float32")
y_pred = tf.convert_to_tensor([[5, 7]], "float32")

ce_logits_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
ce_probs_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=False)

print(ce_logits_fn(y_true, y_pred))
# tf.Tensor(0.12692805, shape=(), dtype=float32)

print(ce_probs_fn(y_true, tf.nn.softmax(y_pred)))
# tf.Tensor(0.126928, shape=(), dtype=float32)

关于python - from_logits=True 但损失为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66941619/

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