sparse_softmax_cross_entropy_with_logits和softmax_cross_entropy_with_logits有什么区别?

dan*_*451 99 neural-network tensorflow softmax cross-entropy

我最近遇到了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吗?

Oli*_*rot 166

具有两种不同的功能是方便的,因为它们产生相同的结果.

区别很简单:

  • 对于sparse_softmax_cross_entropy_with_logits,标签必须具有[batch_size]形状和dtype int32或int64.每个标签都是范围内的int [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在这个标签上有损失.

  • -1是否正确?正如文档中所写:"标签中的每个条目必须是[0,num_classes中的索引].当在CPU上运行此操作时,其他值将引发异常,并在GPU上返回相应的丢失和梯度行的NaN." (14认同)
  • [0, num_classes) = [0, num_classes-1] (3认同)

Dra*_*ag0 24

我想在TF文档中添加2个接受答案的内容.

第一:

tf.nn.softmax_cross_entropy_with_logits

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

第二:

tf.nn.sparse_softmax_cross_entropy_with_logits

注意:对于此操作,给定标签的概率被视为独占.也就是说,不允许使用软类,并且标签向量必须为每行logits(每个小批量条目)的真实类提供单个特定索引.

  • 如果这些类不相互排斥,我们应该使用什么.我的意思是,如果我们组合多个分类标签? (4认同)

Sal*_*ali 21

两个函数都计算相同的结果,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
Run Code Online (Sandbox Code Playgroud)

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

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