我最近遇到了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
相同的结果吗?
答案 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并比较它们的输出。尝试重新运行几次以确保它始终产生相同的输出