softmax_cross_entropy_with_logits & sparse_softmax_cross_entropy_with_logit区别

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]

参考:

猜你喜欢

转载自blog.csdn.net/the_lastest/article/details/80994456