1 参数解析

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]

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐