本文对 softmax_cross_entropy_with_logits
和 sparse_softmax_cross_entropy_with_logits
两种交叉熵 API 的使用和之间的差别进行概要说明。
基础函数
基础函数不做说明:
1 | from __future__ import absolute_import |
logits 概率
假设有三张 MNIST 图片,logits
(可以理解成归一化之前的概率表征)如下,形状为 [3, 10]
:
1 | logits = tf.constant( |
通过 softmax 计算的实际概率如下,可以看到这三张图片依次预测为数字 0
、1
、3
:
1 | [[1.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 |
对于某一项,如果 logits
越大,则相应的 softmax 归一化概率也越大。
计算 softmax 交叉熵的两个 API
假设我们的图片实际标签依次为 0
、7
、3
,即第一张和最后一张识别正确,中间一张识别有误(7
识别成了 1
)。
sparse_softmax_cross_entropy_with_logits
sparse_softmax_cross_entropy_with_logits
需要使用一维形状的 labels
,每个元素为整型标签:
1 | # tf.nn.sparse_softmax_cross_entropy_with_logits |
输出为:
1 | [1.6689051, array([ True, False, True]), 0.6666667] |
softmax_cross_entropy_with_logits
sparse_softmax_cross_entropy_with_logits
需要使用二维形状的 labels
,每个元素为独热编码(One Hot Encoder)标签:
1 | # tf.nn.softmax_cross_entropy_with_logits |
输出为:
1 | [1.6689051, array([ True, False, True]), 0.6666667] |
标签的维度转换
观察 labels_1d
和 labels_2d
其中的元素,实际上后者就是前者的独热编码转换:
1 | print(sess.run([tf.one_hot(labels_1d, depth=10)])) |
1 | [array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], |