两个函数的区别
两个函数虽然功能类似,但是其参数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。
总之:
tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_) logits 和labels大小相同,且都是one hot形式
tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y_) logits 的长度需要比 labels 多一维,就可以了。