Tensorflow 分類函數(交叉熵的計算)

命名空間:tf.nn

函數 作用 說明
sigmoid_cross_entropy_with_logits 計算 給定 logits 的S函數 交叉熵。 測量每個類別獨立且不相互排斥的離散分類任務中的概率。(可以執行多標籤分類,其中圖片可以同時包含大象和狗。)

weighted_cross_entropy_with_logits 計算加權交叉熵。  
softmax_cross_entropy_with_logits 計算 logits 和 labels 之間的 softmax 交叉熵。 測量類別相互排斥的離散分類任務中的概率(每個條目恰好在一個類別中)。(有一個且只有一個標籤:圖像可以是狗或卡車,但不能同時爲兩個。)

注意: 每行labels[i]必須是有效的概率分佈。如果不是,梯度的計算將是不正確的。

警告此操作期望未縮放的logits,因爲它softmax 在logits內部執行效率。不要用這個輸出來調用這個op softmax,因爲它會產生不正確的結果。

lables的數據必須經過One-Hot Encodingtf.one_hot)

sparse_softmax_cross_entropy_with_logits 計算 logits 和 labels 之間的 稀疏softmax 交叉熵。 測量類別相互排斥的離散分類任務中的概率(每個條目恰好在一個類別中)。(有一個且只有一個標籤:圖像可以是狗或卡車,但不能同時爲兩個。)

注意: 對於此操作,給定標籤的概率被認爲是獨佔的。也就是說,不允許使用軟類,並且labels向量必須爲每個logits(每個minibatch條目)的每一行的真類提供單個特定索引 。對於每個條目的概率分佈的軟softmax分類,請參閱 softmax_cross_entropy_with_logits

警告此操作期望未縮放的logits,因爲它softmax 在logits內部執行效率。不要用這個輸出來調用這個op softmax,因爲它會產生不正確的結果。

softmax 計算 softmax 激活。 相當於 softmax = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), dim)
log_softmax 計算 對數 softmax激活。 logsoftmax = logits - log(reduce_sum(exp(logits), dim))

tf.nn.sigmoid_cross_entropy_with_logits

該函數計算的是 logits 與 lables 的每一個對應維度上對應元素的損失值。數值越小,表示損失值越小。

import tensorflow as tf

_logits = [[0.5, 0.7, 0.3], [0.8, 0.2, 0.9]]
_one_labels = tf.ones_like(_logits)
_zero_labels = tf.zeros_like(_logits)
with tf.Session() as sess:
    loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=_logits, labels=_one_labels)
    # [[0.47407699  0.40318602  0.5543552]
    #  [0.37110069  0.59813887  0.34115386]]
    print(sess.run(loss))

    loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=_logits, labels=_zero_labels)
    # [[0.97407699  1.10318601  0.85435522]
    #  [1.17110074  0.79813886  1.24115384]]
    print(sess.run(loss))

weighted_cross_entropy_with_logits

weighted_cross_entropy_with_logits 是 sigmoid_cross_entropy_with_logits 的拓展版,輸入參數和實現和後者差不多,可以多支持一個 pos_weight 參數,目的是可以增加或者減小正樣本在算 Cross Entropy 時的 Loss 。

通常的交叉熵成本定義爲:targets * -log(sigmoid(logits)) + (1 - targets) * -log(1 - sigmoid(logits))

這個 pos_weight 被用作積極目標的乘數:targets * -log(sigmoid(logits)) * pos_weight + (1 - targets) * -log(1 - sigmoid(logits))


tf.nn.softmax_cross_entropy_with_logits

該函數與 sigmoid_cross_entropy_with_logits 的區別在於,sigmoid_cross_entropy_with_logits 中的labels 中每一維可以包含多個 1 ,而 softmax_cross_entropy_with_logits ,只能包含一個 1

用 mnist 數據舉例,如果是目標值是3,那麼 label 就是[0,0,0,1,0,0,0,0,0,0],除了第4個值爲1,其他全爲0。(數據必須經過 One-Hot Encoding 編碼

該函數把一個維度上的 labels 作爲一個整體判斷,結果給出整個維度的損失值。(而 sigmoid_cross_entropy_with_logits 是每一個元素都有一個損失值)

如果是多目標問題,經過softmax就不會得到多個和爲1的概率,而且label有多個1也無法計算交叉熵,因此這個函數只適合單目標的二分類或者多分類問題。

這個函數傳入的 logits 是 unscaled 的,既不做 sigmoid 也不做 softmax ,因爲函數實現會在內部更高效得使用 softmax 。

import tensorflow as tf

_logits = [[0.3, 0.2, 0.2], [0.5, 0.7, 0.3], [0.1, 0.2, 0.3]]

_labels = [0, 1, 2]
with tf.Session() as sess:
    # Softmax本身的算法很簡單,就是把所有值用e的n次方計算出來,求和後算每個值佔的比率,保證總和爲1,一般我們可以認爲Softmax出來的就是confidence也就是概率
    # [[0.35591307  0.32204348  0.32204348]
    #  [0.32893291  0.40175956  0.26930749]
    #  [0.30060959  0.33222499  0.36716539]]
    print(sess.run(tf.nn.softmax(_logits)))
    # 對 _logits 進行降維處理,返回每一維的合計
    # [1.  1.  0.99999994]
    print(sess.run(tf.reduce_sum(tf.nn.softmax(_logits), 1)))

    # 傳入的 lables 需要先進行 獨熱編碼 處理。
    loss = tf.nn.softmax_cross_entropy_with_logits(logits=_logits, labels=tf.one_hot(_labels,depth=len(_labels)))
    # [ 1.03306878  0.91190147  1.00194287]
    print(sess.run(loss))

tf.one_hot

獨熱編碼

import tensorflow as tf
with tf.Session() as sess:
    _v = tuple(range(0, 5))
    # [[ 1.  0.  0.  0.  0.]
    #  [ 0.  1.  0.  0.  0.]
    #  [ 0.  0.  1.  0.  0.]
    #  [ 0.  0.  0.  1.  0.]
    #  [ 0.  0.  0.  0.  1.]]
    print(sess.run(tf.one_hot(_v, len(_v))))

sparse_softmax_cross_entropy_with_logits

sparse_softmax_cross_entropy_with_logits 是 softmax_cross_entropy_with_logits 的易用版本,除了輸入參數不同,作用和算法實現都是一樣的。

區別是:softmax_cross_entropy_with_logits 要求傳入的 labels 是經過 one_hot encoding 的數據,而 sparse_softmax_cross_entropy_with_logits 不需要。

import tensorflow as tf
_logits = [[0.3, 0.2, 0.2], [0.5, 0.7, 0.3], [0.1, 0.2, 0.3]]
_labels = [0, 1, 2]
with tf.Session() as sess:
    # 
    loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=_logits, labels=_labels)
    # 結果與 softmax_cross_entropy_with_logits 相同,區別就是 labels 傳入參數時不需要做 one_hot encoding。
    # [ 1.03306878  0.91190147  1.00194287]
    print(sess.run(loss))

softmax

softmax 公式:

Softmax本身的算法很簡單,就是把所有值用e的n次方計算出來,求和後算每個值佔的比率,保證總和爲1,一般我們可以認爲Softmax出來的就是confidence也就是概率

該功能執行相當於 softmax = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), dim)

import tensorflow as tf
with tf.Session() as sess:
    _v = tf.Variable(tf.random_normal([1, 5], seed=1.0))
    sess.run(tf.global_variables_initializer())
    # [[-0.81131822  1.48459876  0.06532937 -2.4427042   0.0992484]]
    print(sess.run(_v))
    # [[0.06243069  0.6201579   0.15001042  0.01221508  0.15518591]]
    print(sess.run(tf.nn.softmax(_v)))
    # 1.0
    print(sess.run(tf.reduce_sum(tf.nn.softmax(_v))))

log_softmax

該功能執行相當於 logsoftmax = logits - log(reduce_sum(exp(logits), dim))

 

 

內容來源:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章