首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sparse_softmax_cross_entropy_with_logits和softmax_cross_entropy_with_logits有什么不同?

sparse_softmax_cross_entropy_with_logits和softmax_cross_entropy_with_logits有什么不同?
EN

Stack Overflow用户
提问于 2016-05-19 09:15:32
回答 3查看 61.9K关注 0票数 119

我最近遇到了tf.nn.sparse_softmax_cross_entropy_with_logits,我想不出与tf.nn.softmax_cross_entropy_with_logits相比有什么不同。

是使用sparse_softmax_cross_entropy_with_logits时训练向量y必须为one-hot encoded的唯一区别

在阅读应用程序接口时,我找不到与softmax_cross_entropy_with_logits相比的任何其他区别。但是为什么我们需要额外的函数呢?

如果softmax_cross_entropy_with_logits提供的是单一热编码的训练数据/向量,那么它不应该产生与sparse_softmax_cross_entropy_with_logits相同的结果吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-19 16:03:10

拥有两个不同的函数是一种方便的,因为它们产生相同的结果。

区别很简单:

对于

  • sparse_softmax_cross_entropy_with_logits,标签必须具有形状batch_size和数据类型int32或int64。每个标签都是range [0, num_classes-1].
  • For softmax_cross_entropy_with_logits中的一个整数,标签的形状必须为batch_size、num_classes和dtype float32或float64。

softmax_cross_entropy_with_logits中使用的标签是中使用的标签的one hot版本。

另一个微小的区别是,使用sparse_softmax_cross_entropy_with_logits,您可以将-1作为标签,以便在此标签上具有loss 0

票数 182
EN

Stack Overflow用户

发布于 2016-06-29 21:57:33

我只想在可接受的答案中添加两件事,你也可以在TF文档中找到。

首先:

tf.nn.softmax_cross_entropy_with_logits

注意:虽然这些类是相互排斥的,但它们的概率不一定是。所需要的就是每一行标签都是一个有效的概率分布。如果它们不是,梯度的计算将是不正确的。

第二:

tf.nn.sparse_softmax_cross_entropy_with_logits

注意:对于此操作,给定标签的概率被认为是排他的。也就是说,不允许使用软类,并且标签向量必须为每行logit(每个小批量条目)的真类提供一个特定的索引。

票数 26
EN

Stack Overflow用户

发布于 2017-04-24 08:10:41

这两个函数计算相同的结果,sparse_softmax_cross_entropy_with_logits直接在稀疏标签上计算交叉熵,而不是使用one-hot encoding转换它们。

您可以通过运行以下程序来验证这一点:

代码语言:javascript
复制
import tensorflow as tf
from random import randint

dims = 8
pos  = randint(0, dims - 1)

logits = tf.random_uniform([dims], maxval=3, dtype=tf.float32)
labels = tf.one_hot(pos, dims)

res1 = tf.nn.softmax_cross_entropy_with_logits(       logits=logits, labels=labels)
res2 = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=tf.constant(pos))

with tf.Session() as sess:
    a, b = sess.run([res1, res2])
    print a, b
    print a == b

在这里,我创建了一个长度为dims的随机logits向量,并生成单热编码标签(其中pos中的元素为1,其他元素为0)。

之后,我计算softmax和稀疏softmax,并比较它们的输出。尝试重新运行几次,以确保它始终生成相同的输出

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37312421

复制
相关文章

相似问题

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