https://www.cnblogs.com/guqiangjs/p/8202899.html
命名空間:tf.nn
函數(shù)作用說明
sigmoid_cross_entropy_with_logits計算 給定 logits 的S函數(shù)?交叉熵。測量每個類別獨立且不相互排斥的離散分類任務(wù)中的概率。(可以執(zhí)行多標(biāo)簽分類,其中圖片可以同時包含大象和狗。)
weighted_cross_entropy_with_logits計算加權(quán)交叉熵。
softmax_cross_entropy_with_logits計算 logits 和 labels 之間的?softmax?交叉熵。測量類別相互排斥的離散分類任務(wù)中的概率(每個條目恰好在一個類別中)。(有一個且只有一個標(biāo)簽:圖像可以是狗或卡車,但不能同時為兩個。)
注意: 每行l(wèi)abels[i]必須是有效的概率分布。如果不是,梯度的計算將是不正確的。
警告:此操作期望未縮放的logits,因為它softmax 在logits內(nèi)部執(zhí)行效率。不要用這個輸出來調(diào)用這個op softmax,因為它會產(chǎn)生不正確的結(jié)果。
lables的數(shù)據(jù)必須經(jīng)過One-Hot Encoding(tf.one_hot)
sparse_softmax_cross_entropy_with_logits計算 logits 和 labels 之間的?稀疏softmax?交叉熵。測量類別相互排斥的離散分類任務(wù)中的概率(每個條目恰好在一個類別中)。(有一個且只有一個標(biāo)簽:圖像可以是狗或卡車,但不能同時為兩個。)
注意: 對于此操作,給定標(biāo)簽的概率被認(rèn)為是獨占的。也就是說,不允許使用軟類,并且labels向量必須為每個logits(每個minibatch條目)的每一行的真類提供單個特定索引 。對于每個條目的概率分布的軟softmax分類,請參閱?softmax_cross_entropy_with_logits。
警告:此操作期望未縮放的logits,因為它softmax 在logits內(nèi)部執(zhí)行效率。不要用這個輸出來調(diào)用這個op softmax,因為它會產(chǎn)生不正確的結(jié)果。
softmax計算?softmax?激活。相當(dāng)于?softmax = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), dim)
log_softmax計算 對數(shù)?softmax激活。logsoftmax = logits - log(reduce_sum(exp(logits), dim))
tf.nn.sigmoid_cross_entropy_with_logits
該函數(shù)計算的是 logits 與 lables 的每一個對應(yīng)維度上對應(yīng)元素的損失值。數(shù)值越小,表示損失值越小。
importtensorflowastf_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)withtf.Session()assess:? ? 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 的拓展版,輸入?yún)?shù)和實現(xiàn)和后者差不多,可以多支持一個 pos_weight 參數(shù),目的是可以增加或者減小正樣本在算 Cross Entropy 時的 Loss 。
通常的交叉熵成本定義為:targets * -log(sigmoid(logits)) + (1 - targets) * -log(1 - sigmoid(logits))
這個 pos_weight 被用作積極目標(biāo)的乘數(shù):targets * -log(sigmoid(logits)) * pos_weight + (1 - targets) * -log(1 - sigmoid(logits))
tf.nn.softmax_cross_entropy_with_logits
該函數(shù)與 sigmoid_cross_entropy_with_logits 的區(qū)別在于,sigmoid_cross_entropy_with_logits 中的labels 中每一維可以包含多個?1?,而 softmax_cross_entropy_with_logits ,只能包含一個?1。
用 mnist 數(shù)據(jù)舉例,如果是目標(biāo)值是3,那么 label 就是[0,0,0,1,0,0,0,0,0,0],除了第4個值為1,其他全為0。(數(shù)據(jù)必須經(jīng)過 One-Hot Encoding 編碼)
該函數(shù)把一個維度上的 labels 作為一個整體判斷,結(jié)果給出整個維度的損失值。(而 sigmoid_cross_entropy_with_logits 是每一個元素都有一個損失值)
如果是多目標(biāo)問題,經(jīng)過softmax就不會得到多個和為1的概率,而且label有多個1也無法計算交叉熵,因此這個函數(shù)只適合單目標(biāo)的二分類或者多分類問題。
這個函數(shù)傳入的 logits 是 unscaled 的,既不做 sigmoid 也不做 softmax ,因為函數(shù)實現(xiàn)會在內(nèi)部更高效得使用 softmax 。
importtensorflowastf_logits = [[0.3,0.2,0.2], [0.5,0.7,0.3], [0.1,0.2,0.3]]_labels = [0,1,2]withtf.Session()assess:# Softmax本身的算法很簡單,就是把所有值用e的n次方計算出來,求和后算每個值占的比率,保證總和為1,一般我們可以認(rèn)為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 進(jìn)行降維處理,返回每一維的合計# [1.? 1.? 0.99999994]print(sess.run(tf.reduce_sum(tf.nn.softmax(_logits),1)))# 傳入的 lables 需要先進(jìn)行 獨熱編碼 處理。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
獨熱編碼
importtensorflowastfwithtf.Session()assess:? ? _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 的易用版本,除了輸入?yún)?shù)不同,作用和算法實現(xiàn)都是一樣的。
區(qū)別是:softmax_cross_entropy_with_logits 要求傳入的 labels 是經(jīng)過 one_hot encoding 的數(shù)據(jù),而 sparse_softmax_cross_entropy_with_logits 不需要。
importtensorflowastf_logits = [[0.3,0.2,0.2], [0.5,0.7,0.3], [0.1,0.2,0.3]]_labels = [0,1,2]withtf.Session()assess:# loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=_logits, labels=_labels)# 結(jié)果與 softmax_cross_entropy_with_logits 相同,區(qū)別就是 labels 傳入?yún)?shù)時不需要做 one_hot encoding。# [ 1.03306878? 0.91190147? 1.00194287]print(sess.run(loss))
softmax
softmax 公式:
Softmax本身的算法很簡單,就是把所有值用e的n次方計算出來,求和后算每個值占的比率,保證總和為1,一般我們可以認(rèn)為Softmax出來的就是confidence也就是概率
該功能執(zhí)行相當(dāng)于?softmax = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), dim)
importtensorflowastfwithtf.Session()assess:? ? _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.0print(sess.run(tf.reduce_sum(tf.nn.softmax(_v))))
log_softmax
該功能執(zhí)行相當(dāng)于?logsoftmax = logits - log(reduce_sum(exp(logits), dim))
內(nèi)容來源:
TensorFlow四種Cross Entropy算法實現(xiàn)和應(yīng)用