tf.nn.softmax_cross_entropy_with_logits_v2(labels, logits)
第一个参数是实际的标签,label的含义就是一个分类标签,所不同的是,这个label是分类的概率,比如说[0.2,0.3,0.5],labels的每一行必须是一个概率分布(即概率之合加起来为1)。
第二个参数是它可以是其他分类器(如逻辑回归等、SVM等)最后一层神经网络的输出。它的值域范围[-inf,+inf](即正负无穷区间)。我们可以把logist理解为原生态的、未经缩放的,可视为一种未归一化的l“概率替代物”,如[4, 1, -2]。
2 作用作用是: 计算label和logits之间的softmax交叉熵 这一个函数包括了三个步骤,分别是 (1)对网络最后一层的输出做一个softmax,即是将softmax应用于logit(y_hat)以便对其进行归一化
y_hat_softmax = softmax(y_hat)
(2)softmax的输出向量和样本的实际标签做一个交叉熵
y_cross = y_true_label * tf.log(y_hat_softmax)
(3)求实例的不同类的总和(注意前面有个负号)
-tf.reduce_sum(y_cross,reduction_indices = [1])
3 代码实现分别拆分为三个步骤去实现和是直接使用该函数对比一下
y_true_label = tf.convert_to_tensor(np.array([[0.0, 1.0, 0.0],[0.0, 0.0, 1.0]]))
y_hat = tf.convert_to_tensor(np.array([[0.5, 1.5, 0.1],[2.2, 1.3, 1.7]]))
# 第一步
y_hat_softmax = tf.nn.softmax(y_hat)
# 第二步
y_cross = y_true_label * tf.log(y_hat_softmax)
# 第三步
result = - tf.reduce_sum(y_cross, 1)
# 使用 tf.nn.softmax_cross_entropy_with_logits_v2
result_tf = tf.nn.softmax_cross_entropy_with_logits_v2(labels = y_true_label, logits = y_hat)
with tf.Session() as sess:
sess.run(result)
sess.run(result_tf)
print('y_hat_softmax:\n{0}\n'.format(y_hat_softmax.eval()))
print('y_true_label: \n{0}\n'.format(y_true_label.eval()))
print('y_cross: \n{0}\n'.format(y_cross.eval()))
print('result: \n{0}\n'.format(result.eval()))
print('result_tf: \n{0}'.format(result_tf.eval()))
输出结果如下,对比可以看到输出结果一样
y_hat_softmax: [[0.227863 0.61939586 0.15274114] [0.49674623 0.20196195 0.30129182]] y_true_label: [[0. 1. 0.] [0. 0. 1.]] y_cross: [[-0. -0.4790107 -0. ] [-0. -0. -1.19967598]] result: [0.4790107 1.19967598] result_tf: [0.4790107 1.19967598]