对于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]
答案 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很可能执行不同但等效的操作,以获得更好的性能和数值稳定性。