sparse_softmax_cross_entropy_with_logits和softmax_cross_entropy_with_logits有什么区别?

时间:2016-05-19 01:15:32

标签: 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的唯一区别是one-hot encoded吗?

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

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

3 个答案:

答案 0 :(得分:156)

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

区别很简单:

  • 对于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

答案 1 :(得分:24)

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

首先:

  

tf.nn.softmax_cross_entropy_with_logits

     

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

第二

  

tf.nn.sparse_softmax_cross_entropy_with_logits

     

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

答案 2 :(得分:19)

两个函数都计算相同的结果,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向量,并生成一个热门编码标签(pos中的元素为1,其他为0)。

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