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
將返回「每個矢量」其中的一個值(默認情況下,「載體」是在最後一個維度),因此,舉例來說,如果你輸入logits和目標有大小10x3你將結束增加10個交叉熵值。通常將這些全部相加或平均,並將結果用作損失值來最小化(這是tf.losses.softmax_cross_entropy
提供的)。交叉熵表達式背後的邏輯是target * np.log(softmax)
將取負值接近於零,其中target
更接近於softmax
,並且當它們不同時從零(趨向負無窮)偏離。
注意:這是一個邏輯函數的解釋。在內部,TensorFlow最有可能執行不同但等效的操作,以獲得更好的性能和數值穩定性。
TensorFlow既不增加它們,也不佔用批處理的平均值,它只返回長度爲'batchsize'的張量,每個元素表示此預測元素與目標元素之間的softmax交叉熵。但是你可以用'tf.reduce_sum(softmax ...)'或'tf.reduce_mean(softmax ...)'來簡單地總結一下它們的含義。 – ml4294
@ ml4294沒錯,更新了,謝謝。我正在考慮['tf.losses.softmax_cross_entropy'](https://www.tensorflow.org/api_docs/python/tf/losses/softmax_cross_entropy)。 – jdehesa