1.相同点
两者都是先经过softmax处理,然后来计算交叉熵,并且最终的结果是一样的,再强调一遍,最终结果都一样。那既然有了softmax_cross_entropy_with_logits 这个方法,那么sparse_softmax_cross_entropy_with_logit 有何用?
按照《TensorFlow实战Google深度学习框架》中的说法:在只有一个正确答案的分类问题中,TensorFlow提供了sparse_softmax_cross_entropy_with_logit 函数来进一步加速计算过程。例如手写体识别中,每个图片都只代表唯一数字。
2.不同点
不同点在于两者在传递参数时的形式上。
对于softmax_cross_entropy_with_logits 来说,其logits= 的维度是[batch_size,num_classes],即正向传播最后的输出层结果;labels=的维度也是[batch_size,num_classes],即正确标签的one_hot形式。
对于sparse_softmax_cross_entropy_with_logit来说,其logits= 的维度是[batch_size,num_classes],即正向传播最后的输出层结果;但labels=的维度有所不同,此时就不再是one_hot形式的标签,而是每一个标签所代表的真实答案,其维度为[batch_size]的一个一维张量。
3.例程import tensorflow as tf
y=tf.constant([[0,0,0,1,0],[0,0,1,0,0]],dtype=tf.float32)
logits=tf.random_normal(shape=[2,5],seed=1)
loss1=tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits,labels=y)
loss1=tf.reduce_mean(loss1)
loss2=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits,labels=tf.argmax(y,1))
loss2=tf.reduce_mean(loss2)
with tf.Session() as sess:
a,b=sess.run([loss1,loss2])
print(a,b)
>>
4.085017 4.085017 可以看到两者输出来的结果是一样的,其中tf.argmax(y,1)的作用是用来查找每一行最大值所对应的索引号,比如此处的结果就应该是[3,2]
更多内容欢迎扫码关注公众号月来客栈!
|