我最近遇到了tf.nn.sparse_softmax_cross_entropy_with_logits,我想不出与tf.nn.softmax_cross_entropy_with_logits相比有什么不同。
是使用sparse_softmax_cross_entropy_with_logits时训练向量y必须为one-hot encoded的唯一区别
在阅读应用程序接口时,我找不到与softmax_cross_entropy_with_logits相比的任何其他区别。但是为什么我们需要额外的函数呢?
如果softmax_cross_entropy_with_logits提供的是单一热编码的训练数据/向量,那么它不应该产生与sparse_softmax_cross_entropy_with_logits相同的结果吗?
发布于 2016-05-19 16:03:10
拥有两个不同的函数是一种方便的,因为它们产生相同的结果。
区别很简单:
对于
sparse_softmax_cross_entropy_with_logits,标签必须具有形状batch_size和数据类型int32或int64。每个标签都是range [0, num_classes-1].softmax_cross_entropy_with_logits中的一个整数,标签的形状必须为batch_size、num_classes和dtype float32或float64。softmax_cross_entropy_with_logits中使用的标签是中使用的标签的one hot版本。
另一个微小的区别是,使用sparse_softmax_cross_entropy_with_logits,您可以将-1作为标签,以便在此标签上具有loss 0。
发布于 2016-06-29 21:57:33
我只想在可接受的答案中添加两件事,你也可以在TF文档中找到。
首先:
tf.nn.softmax_cross_entropy_with_logits
注意:虽然这些类是相互排斥的,但它们的概率不一定是。所需要的就是每一行标签都是一个有效的概率分布。如果它们不是,梯度的计算将是不正确的。
第二:
tf.nn.sparse_softmax_cross_entropy_with_logits
注意:对于此操作,给定标签的概率被认为是排他的。也就是说,不允许使用软类,并且标签向量必须为每行logit(每个小批量条目)的真类提供一个特定的索引。
发布于 2017-04-24 08:10:41
这两个函数计算相同的结果,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在这里,我创建了一个长度为dims的随机logits向量,并生成单热编码标签(其中pos中的元素为1,其他元素为0)。
之后,我计算softmax和稀疏softmax,并比较它们的输出。尝试重新运行几次,以确保它始终生成相同的输出
https://stackoverflow.com/questions/37312421
复制相似问题