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
的随机logits
vector,并生成一个热门的编码标签( pos
中的元素为1,其他为0)。
之后,我计算softmax和稀疏softmax并比较它们的输出。 尝试重新运行几次,以确保它始终产生相同的输出