tf.nn.sparse_softmax_cross_entropy_with_logits

转载总结

请参考原文连接:sparse_softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits与tf.nn.sofrmax_cross_entropy_with_logits有一些差异:

1,Label:onehot格式和类别格式,维度不同;
2,Logits:网络输出结果不需要再经过softmax等函数;
3,sotfmax适用于相互独立类别,sigmoid可以用于多类别;


写在前面:想做这篇很久很久了,想对比加了sparse的和不加的api有什么区别。也准备了很久,但是越准备,我的疑问就越多,所以一直没有下手写。写前一篇也是只写了个代码,没有更深入的东西,因为还有很多疑问没有解决。

tf.nn.sparse_softmax_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)

这个api跟tf.nn.softmax_cross_entropy_with_logits_v2作用一致,是计算softmax交叉熵的。这个api的注释写了很多,重点有三:

labels的条件是互斥的,也就是说,一个样本只能被分为一类,不能有其他的类别

这跟tf.nn.softmax_cross_entropy_with_logits_v2是不一样的,因为tf.nn.softmax_cross_entropy_with_logits_v2的label是one-hot表示的,所以可以有多个类别,是哪一个就在哪个位置写1就可以了。比如

[1,1,0]

表示一个样本既属于第0类也属于第1类

而tf.nn.sparse_softmax_cross_entropy_with_logits中一个样本只能有一类,

[1,1,0]

表示一共有三个样本,第一个样本属于第1类,第二个样本属于第1类,第三个样本属于第0类。含义完全不一样!

  1. api中自己有算softmax,所以输入到api的logits是没有过softmax的,即“unscaled logits”。

这个词百度不到,其实就指的是没有过softmax的logits

  1. 规定了logits和labels的维度都是[batch_size, num_classes]。这是错误的!!!

但是这里我想说的是,这个注释写错了,有问题。
logits的维度是这样没错,但是labels的维度并不是。labels的长度为batch_size,里面对应的值为是哪一个维度。

上代码:

import tensorflow as tf

labels_sparse = [1, 1, 0]
labels = [[0, 1, 0], [0, 1, 0], [1, 0, 0]]

logits = tf.constant(value=[[0.3, 0.3, 0.2], [0, 1, 0.5], [1, 1, 0]],
                     dtype=tf.float32, shape=[3, 3])


loss = tf.nn.softmax_cross_entropy_with_logits_v2(labels=labels, logits=logits)
loss_sparse = tf.nn.sparse_softmax_cross_entropy_with_logits(
    labels=labels_sparse,
    logits=logits)

with tf.Session() as sess:
    print('logits:', sess.run(logits))
    print('tf.nn.softmax_cross_entropy_with_logits_v2:', sess.run(loss))
    print('tf.nn.sparse_softmax_cross_entropy_with_logits:',
          sess.run(loss_sparse))

代码中的labels_sparse和labels表示的是一个意思,不过是两种表达方式,输出的结果是一样的:

这两个api的区别就在于labels的表达方式,正因为表达方式不同,也决定了 tf.nn.sparse_softmax_cross_entropy_with_logits不能处理一个样本被分为多个类别的情况。

至此,tf.nn包中关于softmax的故事就讲完了,总结一下,一共出现了五个api:

tf.nn.softmax 这篇中讲了什么是softmax,我对softmax的理解及实际的应用场景tf.nn.logsoftmax 这篇中讲了softmax怎么计算的并且举出了例子、log_softmax与softmax的区别,以及log_softmax存在的意义。tf.nn.softmax_cross_entropy_with_logits被废弃了换成了v2tf.nn.softmax_cross_entropy_with_logits_v2 这篇中讲了softmax交叉熵loss怎么计算的,为什么要这么计算,怎么调用。tf.nn.sparse_softmax_cross_entropy_with_logits 本篇讲了与v2的区别以及稀疏的如何调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值