0

有人可以解释为什么下面的代码会生成输出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)
4

2 回答 2

2

您提供的 logits 分别用于 0 类和 1 类(这就是 tensorflow 理解它的方式)。

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

根据定义,交叉熵是 -

-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 的输出一致。希望这可以帮助!

于 2017-11-20T14:14:37.890 回答
0

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

这是一篇帖子的答案https://github.com/tensorflow/tensorflow/issues/2462

于 2017-11-20T14:39:22.463 回答