softmax_cross_entropy_with_logits与sparse_softmax_cross_entropy_with_logits的区别

Dear 丶 2021-10-29 14:42 359阅读 0赞

softmax_cross_entropy_with_logits与sparse_softmax_cross_entropy_with_logits的区别

  • 没有sparse:
  • 有sparse:
  • 对比代码

最近学习了Policy Gradients,里面用到了sparse_softmax_cross_entropy_with_logits,很惊诧这是个what,查询了许多资料,做了一点实验,终于明白,这就是另一个版本的softmax_cross_entropy_with_logits。
在这里插入图片描述

没有sparse:

  1. tf.nn.softmax_cross_entropy_with_logits(
  2. labels=None,
  3. logits=None,
  4. name=None
  5. )

第一个参数labels:实际的标签,如果有batch的话,它的大小就是[batch_size,num_classes],单样本的话,大小就是[num_classes]。
第二个参数labels:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batch_size,num_classes],单样本的话,大小就是[num_classes]。

有sparse:

  1. tf.nn.sparse_softmax_cross_entropy_with_logits(
  2. _sentinel=None,
  3. labels=None,
  4. logits=None,
  5. name=None
  6. )

第一个参数labels,实际的标签,其shape为([batch_size,1]直接是分类后的结果。
第二个参数labels:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batch_size,num_classes]。

对比代码

本文使用以下代码进行对比:

  1. import numpy as np
  2. import tensorflow as tf
  3. a = [[0.95,0.02,0.01,0.02],
  4. [0.01,0.02,0.95,0.02],
  5. [0.03,0.094,0.01,0.02]]
  6. b = [0,2,1]
  7. c = [[1,0,0,0],
  8. [0,0,1,0],
  9. [0,1,0,0]]
  10. softmax_cross_entropy_with_logits = tf.nn.softmax_cross_entropy_with_logits(
  11. logits = a,labels = c
  12. )
  13. sparse_softmax_cross_entropy_with_logits = tf.nn.sparse_softmax_cross_entropy_with_logits(
  14. logits = a,labels = b
  15. )
  16. with tf.Session() as sess:
  17. print(
  18. sess.run(softmax_cross_entropy_with_logits),sess.run(sparse_softmax_cross_entropy_with_logits)
  19. )

输出结果为:

  1. [0.7792034 0.7792034 1.3313385] [0.7792034 0.7792034 1.3313385]

由此可知,当函数加上sparse相当于默认该矩阵为稀疏矩阵,将其转化为二维形式时,除去所指定的标签列,其他标签列都是0。

发表评论

表情:
评论列表 (有 0 条评论,359人围观)

还没有评论,来说两句吧...

相关阅读

    相关 +==+区别

    \+=与=+的区别 今天做LeetCode的时候,键盘敲得快了点,后来程序运行结果和设想相差很离谱,于是在关键位置逐行仔细检查代码,发现自己无意间把+=写成了=+(编译并