首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >from_logits=True但损失为0

from_logits=True但损失为0
EN

Stack Overflow用户
提问于 2021-04-04 13:10:13
回答 1查看 337关注 0票数 2

我正在学习tensorflow,并希望将tensorflow实现与数学联系起来。

据我所知,数学交叉熵要求其输入之和为1。在以下代码中,y_true是有效输入,而y_pred不是数学上有效的输入:

代码语言:javascript
复制
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))

给予:

代码语言:javascript
复制
tf.Tensor([0.04879016], shape=(1,), dtype=float32)
tf.Tensor([0.], shape=(1,), dtype=float32)

请找到要点这里

这个答案说:

如果是from_logits=False,则表示输入为概率。

这个答案说:

from_logits=True表示crossEntropy层的输入是正常张量/逻辑。

这个答案说:

“在上述代码中,raw_predictions的另一个名称是logit

我猜,from_logits意味着输入是raw_predictions

因为我的输入不是概率,所以我设置了from_logits=True,但是我得到的结果是0。

有人能解释吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-04 14:02:19

标签[[0, 1]]和logits [[1, 20]]之间的交叉熵应该是一个非常接近0的值(由于浮点不精确,一些输出可能表示为零)。这些逻辑表示为概率,近似为[[0.000000005, 1]]。注意这些概率与标签的距离有多近。因此,交叉熵应该非常低。

正如OP在他们的问题中所指出的那样,在对未缩放的输出进行操作时,应该使用from_logits=True。实际上,如果在软件最大值之前对输出进行操作,则使用from_logits=True。Softmax将未缩放的输出映射为概率。为了计算这些概率的交叉熵,应该使用from_logits=False

下面是一个示例:

代码语言:javascript
复制
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)

试着把预测更紧密地结合起来。在上面的例子中,正确类的值远高于不正确的类,因此交叉熵将很低。

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66941619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档