sparse_softmax_cross_entropy_with_logits和softmax_cross_entropy_with_logits有什么区别?
neural-network
tensorflow
5
0

我最近遇到了tf.nn.sparse_softmax_cross_entropy_with_logits ,但我不知道与tf.nn.softmax_cross_entropy_with_logits有什么区别。

使用sparse_softmax_cross_entropy_with_logits时,训练向量y必须进行一次热编码的唯一区别是?

阅读API,与softmax_cross_entropy_with_logits相比,我找不到任何其他区别。但是,为什么我们需要额外的功能呢?

如果提供了一键编码训练数据/向量, sparse_softmax_cross_entropy_with_logits是否应产生与softmax_cross_entropy_with_logits相同的结果?

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

我只想在已接受的答案中添加2件事,您也可以在TF文档中找到它们。

第一:

tf.nn.softmax_cross_entropy_with_logits

注意:尽管这些类是互斥的,但它们的概率不是必须的。所需要的只是标签的每一行都是有效的概率分布。如果不是,则梯度的计算将不正确。

第二:

tf.nn.sparse_softmax_cross_entropy_with_logits

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

收藏
评论

具有两个不同的功能很方便 ,因为它们产生相同的结果。

区别很简单:

  • 对于sparse_softmax_cross_entropy_with_logits ,标签的形状必须为[batch_size]且dtype为int32或int64。每个标签都是一个[0, num_classes-1]范围内的int值。
  • 对于softmax_cross_entropy_with_logits ,标签的形状必须为[batch_size,num_classes]且类型为float32或float64。

softmax_cross_entropy_with_logits中使用的标签是sparse_softmax_cross_entropy_with_logits使用的标签的一个热门版本

另一个微小的区别是,使用sparse_softmax_cross_entropy_with_logits ,您可以给-1作为标签,使该标签上的损失为0

收藏
评论

这两个函数都计算出相同的结果,而sparse_softmax_cross_entropy_with_logits直接在稀疏标签上计算交叉熵,而不是使用一键编码进行转换。

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

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并比较它们的输出。尝试重新运行几次,以确保始终产生相同的输出

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号