TensorFlow:sparse_softmax_cross_entropy_with_logits和softmax_cross_entropy_with_logits有什么区别?

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

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

读取API我无法find与softmax_cross_entropy_with_logits相比有任何其他区别…但为什么我们需要额外的function呢?

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

有两个不同的function是一个方便 ,因为他们产生相同的结果。

区别很简单:

  • 对于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]和dtype float32或float64的形状。

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

另一个微小的差别是,用sparse_softmax_cross_entropy_with_logits ,你可以给-1作为标签在这个标签上有损失0

我只是想添加2个东西到接受的答案,你也可以在TF文档中find。

第一:

tf.nn.softmax_cross_entropy_with_logits

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

第二:

tf.nn.sparse_softmax_cross_entropy_with_logits

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

这两个函数计算相同的结果, sparse_softmax_cross_entropy_with_logits直接在稀疏标签上计算交叉熵,而不是用单热编码来转换它们。

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

 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 

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

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

Interesting Posts