交叉熵
交叉熵可在神經網絡(機器學習)中作爲損失函數,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]