121

我最近遇到了tf.nn.sparse_softmax_cross_entropy_with_logits,我无法弄清楚与tf.nn.softmax_cross_entropy_with_logits相比有什么区别。

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

阅读 API,与softmax_cross_entropy_with_logits. 但是为什么我们需要额外的功能呢?

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

4

3 回答 3

183

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

区别很简单:

  • 对于sparse_softmax_cross_entropy_with_logits,标签必须具有 [batch_size] 形状和 dtype int32 或 int64。每个标签都是一个 int in range [0, num_classes-1]
  • 对于softmax_cross_entropy_with_logits,标签必须具有形状 [batch_size, num_classes] 和 dtype float32 或 float64。

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

另一个微小的区别是sparse_softmax_cross_entropy_with_logits,您可以将 -1 作为标签以0在该标签上有损失。

于 2016-05-19T08:03:10.237 回答
27

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

第一的:

tf.nn.softmax_cross_entropy_with_logits

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

第二:

tf.nn.sparse_softmax_cross_entropy_with_logits

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

于 2016-06-29T13:57:33.210 回答
22

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

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

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

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

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

于 2017-04-24T00:10:40.880 回答