湛蓝之海 发表于 2021-12-30 10:40:20

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=​​ 的维度是​​​​,即正向传播最后的输出层结果;​​labels=​​的维度也是​​​​,即正确标签的one_hot形式。
对于​​sparse_softmax_cross_entropy_with_logit​​​来说,其​​logits=​​​ 的维度是​​​​​,即正向传播最后的输出层结果;但​​labels=​​​的维度有所不同,此时就不再是one_hot形式的标签,而是每一个标签所代表的真实答案,其维度为​​​​的一个一维张量。
3.例程
import tensorflow as tf
y=tf.constant([,],dtype=tf.float32)
logits=tf.random_normal(shape=,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()
    print(a,b)


>>
4.085017 4.085017
可以看到两者输出来的结果是一样的,其中​​tf.argmax(y,1)​​​的作用是用来查找每一行最大值所对应的索引号,比如此处的结果就应该是​​​​


更多内容欢迎扫码关注公众号月来客栈!







https://blog.51cto.com/u_15268254/4860707
页: [1]
查看完整版本: softmax_cross_entropy_with_logits & sparse_softmax_cross_entropy_with_logit区别