理解张量流函数输出

时间:2017-11-20 13:31:42

标签: python tensorflow deep-learning cross-entropy

有人可以解释为什么以下代码会生成array([ 0.59813887, 0.69314718], dtype=float32)的输出吗?例如,numpy.log(0.5) = 0.69314718,但0.598138是如何产生的?

import tensorflow as tf
res1 = tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=[1, 0], logits=[[0.4, 0.6], [0.5, 0.5]], name=None)
res2 = tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=[0, 1], logits=[[0.4, 0.6], [0.5, 0.5]], name=None)
res3 = tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=[1, 0], logits=[[0.6, 0.4], [0.5, 0.5]], name=None)
sess = tf.Session()
sess.run(res1)

2 个答案:

答案 0 :(得分:2)

您提供的logits分别针对0和1类(即tensorflow如何理解它)。

因此,对于res1 - 第一个数据点的prob(class1)为0.6

根据定义, Cross Entropy 是 -

-np.log(np.exp([0.6]) / np.sum(np.exp([0.4, 0.6])))

同样,对于第二种情况 -

-np.log(np.exp([0.5]) / np.sum(np.exp([0.5, 0.5])))

给出所需的输出。

这与Tensorflow的输出一致。希望这有帮助!

答案 1 :(得分:0)

事实证明,对于这个函数,tensorflow将其解释为logit输入,这意味着它需要反转log(p / 1-p)操作以在计算交叉熵之前首先获得softmax输出,但我还没有找到为什么没有功能直接从概率输出计算交叉熵

以下是一篇帖子https://github.com/tensorflow/tensorflow/issues/2462

的答案