2017-08-03 71 views
1

張量流的新特點,有人能解釋我怎麼得到答案爲1.16012561。瞭解softmax_cross_entropy_with_logits的輸出

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

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最有可能執行不同但等效的操作,以獲得更好的性能和數值穩定性。

+1

TensorFlow既不增加它們,也不佔用批處理的平均值,它只返回長度爲'batchsize'的張量,每個元素表示此預測元素與目標元素之間的softmax交叉熵。但是你可以用'tf.reduce_sum(softmax ...)'或'tf.reduce_mean(softmax ...)'來簡單地總結一下它們的含義。 – ml4294

+0

@ ml4294沒錯,更新了,謝謝。我正在考慮['tf.losses.softmax_cross_entropy'](https://www.tensorflow.org/api_docs/python/tf/losses/softmax_cross_entropy)。 – jdehesa