TF:tf.losses.sparse_softmax_cross_entropy

tf.losses.sparse_softmax_cross_entropy(logits=logits, labels=labels)等價與

tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels) 加 tf.reduce_mean。

它們的參數維度:

logits: [batch_size, num_classes]
labels: [batch_size,]

計算過程:

batch_size=1
num_classes=3
logits = tf.constant([3,1,-3], shape=[batch_size, num_classes], dtype=tf.float32)
labels = tf.constant([2], shape=[batch_size,], dtype=tf.int32)


logits是二維列表,labels是一維列表。batch_size爲1時,輸入x得到x對應3個類別的logit是[3,1,-3],x的實際標籤是2。

求交叉熵可以分爲兩步:

1、求softmax:
 

softmax = tf.nn.softmax(logits)#[[0.87887824 0.11894324 0.00217852]]

其中,tf.nn.softmax的計算步驟是,對列表[3,1,-3],

2、對得到的列表每個元素求對數再求相反數

得到[0.1291089166980569, 2.1291089016197424, 6.1291089069914575]。

log_soft = [-math.log(i) for i in softmax.eval()[0]]#[0.1291089166980569, 2.1291089016197424, 6.1291089069914575]
cross_entropy = log_soft[2]#-log(0.00217852) = 6.12910890699


由於標籤是2,所以交叉熵取第3個數6.12910890699。

對一個輸入爲x的3分類結果,logits=[3,1,-3]的意義是x對應標籤1、2、3的logit(可以理解爲代價)分別爲3、1、-3。因爲logit表示代價不直觀,所以轉化爲log_soft。從log_soft可以看出x對應標籤1的代價最小(0.129),對應標籤2的代價最大(6.129)。labels給出的實際標籤是2,所以代價就是6.129。

完整代碼:

import tensorflow as tf
import math
 
sess = tf.InteractiveSession()
 
batch_size=1
num_classes=3
logits = tf.constant([3,1,-3], shape=[batch_size, num_classes], dtype=tf.float32)
labels = tf.constant([2], shape=[batch_size,], dtype=tf.int32)
 
softmax = tf.nn.softmax(logits)
print"\n--softmax:",softmax.eval()
log_soft = [-math.log(i) for i in softmax.eval()[0]]
print"--1:",log_soft[2]
 
print"--2:",tf.losses.sparse_softmax_cross_entropy(logits=logits, labels=labels).eval()
 
temp = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels)
print"--3:",tf.reduce_mean(temp).eval()


版權聲明:本文爲CSDN博主「共產主義建設者」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_26697045/article/details/89434710

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