我是靠谱客的博主 个性衬衫,最近开发中收集的这篇文章主要介绍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的区别以及稀疏的如何调用

最后

以上就是个性衬衫为你收集整理的tf.nn.sparse_softmax_cross_entropy_with_logits转载总结的全部内容,希望文章能够帮你解决tf.nn.sparse_softmax_cross_entropy_with_logits转载总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部