这两个函数都计算出相同的结果,而sparse_softmax_cross_entropy_with_logits直接在稀疏标签上计算交叉熵,而不是使用一键编码进行转换。
您可以通过运行以下程序来验证这一点:
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并比较它们的输出。尝试重新运行几次,以确保始终产生相同的输出
0
我最近遇到了tf.nn.sparse_softmax_cross_entropy_with_logits ,但我不知道与tf.nn.softmax_cross_entropy_with_logits有什么区别。
使用
sparse_softmax_cross_entropy_with_logits
时,训练向量y
必须进行一次热编码的唯一区别是?阅读API,与
softmax_cross_entropy_with_logits
相比,我找不到任何其他区别。但是,为什么我们需要额外的功能呢?如果提供了一键编码训练数据/向量,
sparse_softmax_cross_entropy_with_logits
是否应产生与softmax_cross_entropy_with_logits
相同的结果?