了解softmax_cross_entropy_with_logits的输出

时间:2017-08-03 16:01:03

标签: tensorflow

对于tensorflow来说,有人可以解释一下我们是如何得到答案的,如1.16012561。

 unscaled_logits = tf.constant([[1., -3., 10.]])
   target_dist = tf.constant([[0.1, 0.02, 0.88]])
   softmax_xentropy = 
   tf.nn.softmax_cross_entropy_with_logits(logits=unscaled_logits, 
   labels=target_dist)
   with tf.Session() as sess:
       print(sess.run(softmax_xentropy))

输出:[1.16012561]

1 个答案:

答案 0 :(得分:3)

Here is a good explanation about it。它的工作原理如下。首先,logits通过softmax function传递给你一个概率分布:

import numpy as np

logits = np.array([1., -3., 10.])
# Softmax function
softmax = np.exp(logits) / np.sum(np.exp(logits))
print(softmax)
>>> array([  1.23394297e-04,   2.26004539e-06,   9.99874346e-01])
# It is a probability distribution because the values are in [0, 1]
# and add up to 1
np.sum(softmax)
>>> 0.99999999999999989  # Almost, that is

然后,计算计算的softmax值与目标之间的交叉熵。

target = np.array([0.1, 0.02, 0.88])
# Cross-entropy function
crossentropy = -np.sum(target * np.log(softmax))
print(crossentropy)
>>> 1.1601256622376641

tf.nn.softmax_cross_entropy_with_logits会返回其中一个值"每个向量" (默认情况下,"向量"位于最后一个维度中),因此,例如,如果输入对数和目标的大小为10x3,则最终会得到10个交叉熵值。通常将这些全部求和或平均,并将结果用作损失值以最小化(这是tf.losses.softmax_cross_entropy提供的)。交叉熵表达背后的逻辑是target * np.log(softmax)将接近零的负值,其中target更接近于softmax并且当它们不同时偏离零(朝向负无穷大)

注意:这是该函数的逻辑解释。在内部,TensorFlow很可能执行不同但等效的操作,以获得更好的性能和数值稳定性。