tf.nn.sparse_softmax_cross_entropy_with_logits与 tf.nn.softmax_cross_entropy_with_logits的区别
(1)tf.nn.sparse_softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
labels:为样本的真实标签, shape为[batch_size],每一个值∈[0,num_classes),其实就是代表了batch中对应样本的类别,如二分类的label[0,0,1,0…]
logits:为神经网络输出层的输出,shape为[batch_size,num_classes]
具体举例:
import tensorflow as tf
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=tf.argmax(labels, 1))#此处的label经过ont-hot处理
cost = tf.reduce_mean(cross_entropy)
(2)tf.nn.softmax_cross_entropy_with_logits
tf.nn.softmax_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
dim=-1,
name=None
)
labels:为one-hot处理后的真实标签, shape为[batch_size, num_classes],如多分类的label[0,2,1,0…]处理后的标签为[[1,0,0],[0,0,1],[0,1,0],[1,0,0]…];除了one-hot表示,labels的每一行也可以是一个概率分布,每个数值表示属于每个类别的概率。
logits:为神经网络输出层的输出,shape为[batch_size,num_classes]
具体举例:
import tensorflow as tf
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labels)#此处的label经过ont-hot处理
cost = tf.reduce_mean(cross_entropy)
两个函数的作用是一样的,只是一个处理的是真实标签,一个处理的是one-hot标签。如果使用不当,容易引起如下错误:
Rank mismatch: Rank of labels (received 2) should equal rank of logits minus 1 (received 2)