TensorFlow中的tf.nn.softmax_cross_entropy_with_logits 交叉熵 損失函數

交叉熵

交叉熵可在神經網絡(機器學習)中作爲損失函數,p表示真實標記的分佈,q則爲訓練後的模型的預測標記分佈,交叉熵損失函數可以衡量p與q的相似性。交叉熵作爲損失函數還有一個好處是使用sigmoid函數在梯度下降時能避免均方誤差損失函數學習速率降低的問題,因爲學習速率可以被輸出的誤差所控制。tensorflow中自帶的函數可以輕鬆的實現交叉熵的計算。

tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)

Computes softmax cross entropy between logits and labels.

注意:如果labels的每一行是one-hot表示,也就是隻有一個地方爲1,其他地方爲0,可以使用tf.sparse_softmax_cross_entropy_with_logits()

警告

1. 這個操作的輸入logits是未經縮放的,該操作內部會對logits使用softmax操作

2. 參數labels,logits必須有相同的形狀 [batch_size, num_classes] 和相同的類型(float16, float32, float64)中的一種

參數_sentinel: 一般不使用

labels: labels的每一行labels[i]必須爲一個概率分佈

logits: 未縮放的對數概率

dims: 類的維度,默認-1,也就是最後一維

name: 該操作的名稱

返回值:長度爲batch_size的一維Tensor

下面用個小例子來看看該函數的用法

import tensorflow as tf

labels = [[0.2,0.3,0.5],
          [0.1,0.6,0.3]]
logits = [[2,0.5,1],
          [0.1,1,3]]
logits_scaled = tf.nn.softmax(logits)

result1 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)
result2 = -tf.reduce_sum(labels*tf.log(logits_scaled),1)
result3 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits_scaled)

with tf.Session() as sess:
    print sess.run(result1)
    print sess.run(result2)
    print sess.run(result3)
>>>[ 1.41436887  1.66425455]
>>>[ 1.41436887  1.66425455]
>>>[ 1.17185783  1.17571414]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

上述例子中,labels的每一行是一個概率分佈,而logits未經縮放(每行加起來不爲1),我們用定義法計算得到交叉熵result2,和套用tf.nn.softmax_cross_entropy_with_logits()得到相同的結果, 但是將縮放後的logits_scaled輸tf.nn.softmax_cross_entropy_with_logits(), 卻得到錯誤的結果,所以一定要注意,這個操作的輸入logits是未經縮放的

下面來看tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None)

這個函數與上一個函數十分類似,唯一的區別在於labels.

注意:對於此操作,給定標籤的概率被認爲是排他的。labels的每一行爲真實類別的索引

警告

1. 這個操作的輸入logits同樣是是未經縮放的,該操作內部會對logits使用softmax操作

2. 參數logits的形狀 [batch_size, num_classes] 和labels的形狀[batch_size]

返回值:長度爲batch_size的一維Tensor, 和label的形狀相同,和logits的類型相同

import tensorflow as tf

labels = [0,2]

logits = [[2,0.5,1],
          [0.1,1,3]]

logits_scaled = tf.nn.softmax(logits)

result1 = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits)

with tf.Session() as sess:
    print sess.run(result1)
>>>[ 0.46436879  0.17425454]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章