函数说明
在计算交叉熵之前,通常要用到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_)
来源:CSDN
作者:LandH的Blog
链接:https://blog.csdn.net/u013084616/article/details/79138380