评论

收藏

[Hbase] softmax_cross_entropy_with_logits & sparse_softmax_cross_entropy_with_logit区别

数据库 数据库 发布于:2021-12-30 10:40 | 阅读数:552 | 评论:0

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]​​


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







关注下面的标签,发现更多相似文章