我最近遇到了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?
阅读API,与 softmax_cross_entropy_with_logits
相比,我找不到任何其他差异 . 但为什么我们需要额外的功能呢?
softmax_cross_entropy_with_logits
不应该产生与 sparse_softmax_cross_entropy_with_logits
相同的结果,如果它提供了一个热编码的训练数据/向量?
3 回答
具有两个不同的功能是 convenience ,因为它们产生相同的结果 .
区别很简单:
对于
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
中使用的 one hot version 标签 .另一个微小的区别是,使用
sparse_softmax_cross_entropy_with_logits
,你可以给-1作为标签,在这个标签上有损失0
.我想在TF文档中添加2个接受答案的内容 .
第一:
第二:
两个函数都计算相同的结果,sparse_softmax_cross_entropy_with_logits直接在稀疏标签上计算交叉熵,而不是用one-hot encoding转换它们 .
您可以通过运行以下程序来验证这一点:
在这里,我创建一个长度为
dims
的随机logits
向量,并生成单热编码标签(其中pos
中的元素为1,其他为0) .之后我计算softmax和稀疏softmax并比较它们的输出 . 尝试重新运行几次以确保它始终产生相同的输出