[tensorflow] tf.nn.sparse_softmax_cross_entropy_with_logits的使用方法及常见报错

会有一股神秘感。 提交于 2019-12-03 13:04:54
函数说明

在计算交叉熵之前,通常要用到softmax层来计算结果的概率分布。因为softmax层并不会改变最终的分类结果(排序),所以,tensorflow将softmax层与交叉熵函数进行封装,形成一个函数方便计算:tf.nn.softmax_cross_entropy_with_logits(logits= , labels=)
为了加速计算过程,针对只有一个正确答案(例如MNIST识别)的分类问题,tensorflow提供了tf.nn.sparse_softmax_cross_entropy_with_logits(logits= , labels=)

两个函数的区别

两个函数虽然功能类似,但是其参数labels有明显区别。tf.nn.softmax_cross_entropy_with_logits()中的logits和labels的shape都是[batch_size, num_classes],而tf.nn.sparse_softmax_cross_entropy_with_logits()中的labels稀疏表示的,是 [0,num_classes)中的一个数值,代表正确分类结果。即sparse_softmax_cross_entropy_with_logits 直接用标签计算交叉熵,而 softmax_cross_entropy_with_logits 是标签的onehot向量参与计算。softmax_cross_entropy_with_logits 的 labels 是 sparse_softmax_cross_entropy_with_logits 的 labels 的一个独热版本(one hot version)。

正确示例

y2 = tf.convert_to_tensor([[0, 0, 1, 0]], dtype=tf.int64)    
y_2 = tf.convert_to_tensor([[-2.6, -1.7, 3.2, 0.1]], dtype=tf.float32)    
c2 = tf.nn.sparse_softmax_cross_entropy_with_logits(logits= y_2, labels=tf.argmax(y2,1)) 

常见错误

c2 = tf.nn.sparse_softmax_cross_entropy_with_logits( y_2, tf.argmax(y2,1))

ValueError: Only call `sparse_softmax_cross_entropy_with_logits` with named arguments (labels=..., logits=..., ...)

新版本tensorflow这个函数不能按以前的方式进行调用了,只能使用命名参数的方式来调用。

tf.nn.softmax_cross_entropy_with_logits(y, y_)

因此修改需要成这样:

tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_)



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!