概述
转载总结
请参考原文连接: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类。含义完全不一样!
- api中自己有算softmax,所以输入到api的logits是没有过softmax的,即“unscaled logits”。
这个词百度不到,其实就指的是没有过softmax的logits
- 规定了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的区别以及稀疏的如何调用
最后
以上就是个性衬衫为你收集整理的tf.nn.sparse_softmax_cross_entropy_with_logits转载总结的全部内容,希望文章能够帮你解决tf.nn.sparse_softmax_cross_entropy_with_logits转载总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复