Neural network 什么';稀疏的softmax交叉熵与逻辑的softmax交叉熵与逻辑的softmax交叉熵之间的区别是什么?

Neural network 什么';稀疏的softmax交叉熵与逻辑的softmax交叉熵与逻辑的softmax交叉熵之间的区别是什么?,neural-network,tensorflow,softmax,cross-entropy,Neural Network,Tensorflow,Softmax,Cross Entropy,我最近遇到过这样的情况,我不知道两者的区别是什么 当使用稀疏的softmax\u交叉的时,训练向量y的唯一区别是什么 阅读API时,我找不到任何其他与softmax\u cross\u entropy\u with\u logits相比的差异。但是为什么我们需要额外的功能呢 如果提供了一个热编码的训练数据/向量,那么softmax\u cross\u entropy\u with_logits是否应该产生与sparse\u softmax\u cross\u entropy\u with_log

我最近遇到过这样的情况,我不知道两者的区别是什么

当使用稀疏的softmax\u交叉的时,训练向量y的唯一区别是什么

阅读API时,我找不到任何其他与
softmax\u cross\u entropy\u with\u logits
相比的差异。但是为什么我们需要额外的功能呢


如果提供了一个热编码的训练数据/向量,那么
softmax\u cross\u entropy\u with_logits
是否应该产生与
sparse\u softmax\u cross\u entropy\u with_logits
相同的结果

具有两种不同的功能是一种方便,因为它们产生相同的结果

区别很简单:

  • 对于带有logits的
    稀疏\u softmax\u交叉\u熵\u,标签必须具有形状[batch\u size]和数据类型int32或int64。每个标签都是范围
    [0,num\u classes-1]
    中的int
  • 对于带有logits的softmax\u cross\u entropy\u,标签的形状必须为[batch\u size,num\u classes]和数据类型float32或float64
softmax\u-cross\u-entropy\u和logits中使用的标签是
sparse\u-softmax\u-cross\u-entropy\u和logits中使用的标签的一个热门版本


另一个微小的区别是,使用带有logits的
sparse\u softmax\u cross\u entropy\u,您可以使用-1作为标签,在这个标签上显示损失
0

我只想在TF文档中也可以找到的公认答案中添加两件事

第一:

tf.nn.softmax\u交叉\u熵\u与逻辑

注意:虽然这些类是互斥的,但它们的概率 不必如此。所需的只是每行标签都是一个 有效概率分布。如果不是,则计算 坡度将不正确

第二:

tf.nn.sparse\u softmax\u cross\u entropy\u与逻辑

注:对于该操作,给定标签的概率为 被认为是排他性的。也就是说,不允许使用软类,并且 labels vector必须为true类提供单个特定索引 对于每行登录(每个小批量条目)


这两个函数都计算相同的结果,并直接在稀疏标签上计算交叉熵,而不是使用

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

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,并比较了它们的输出。尝试重新运行几次,以确保它始终生成相同的输出

如果类不是互斥的,我们应该使用什么。我的意思是如果我们把多个分类标签结合起来?我也读过这篇文章。所以这意味着我们在交叉熵上应用类概率,而不是把它作为一个单热向量。@Hayro-你是说你不能进行单热编码吗?我想你得换一种型号。提到类似“构建4个二元逻辑回归分类器更合适”的内容,以首先确保可以分离这些类。我感兴趣的是,如果两者都可以使用(例如,使用独占图像标签),则可以对它们的性能进行比较;我希望稀疏版本会更有效,至少在内存方面是如此。另请参见,它讨论了tensorflow中的所有交叉熵函数(事实证明有很多)。-1正确吗?正如文档所述:“标签中的每个条目都必须是[0,num_类]中的索引。当在CPU上运行此操作时,其他值将引发异常,并在GPU上为相应的丢失和渐变行返回NaN。”[0,num_类)=[0,num_类-1]此语句正确吗?“softmax\u cross\u entropy\u和\u logits中使用的标签是sparse\u softmax\u cross\u entropy\u和\u logits中使用的标签的一个热版本。”它是向后的吗?sparse loss函数不是int为0的函数,所以sparse函数不是一个热版本吗?