softmax計算loss時,注意錯誤 交叉熵實驗

2021-09-26 11:17:28 字數 3115 閱讀 1816

以下內容來自《深度學習之tensor flow入門、原理與高階實戰》學習

例項描述

下面一段**,假設有乙個標籤labels和乙個網路輸出值logits

進行一下實驗:

"""

created on tue jun 13 09:53:41 2017

@author: **醫生 注意原作者出處

@blog:

"""import tensorflow as tf

labels = [[0,0,1],[0,1,0]]

logits = [[2, 0.5,6],

[0.1,0, 3]]

logits_scaled = tf.nn.softmax(logits)

logits_scaled2 = tf.nn.softmax(logits_scaled)

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

result2 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits_scaled)

result3 = -tf.reduce_sum(labels*tf.log(logits_scaled),1)

with tf.session() as sess:

print ("scaled=",sess.run(logits_scaled))

print ("scaled2=",sess.run(logits_scaled2)) #經過第二次的softmax後,分布概率會有變化

print ("rel1=",sess.run(result1),"\n")#正確的方式

print ("rel2=",sess.run(result2),"\n")#如果將softmax變換完的值放進去會,就相當於算第二次softmax的loss,所以會出錯

print ("rel3=",sess.run(result3))

**# 對於softmax後的結果logits我們可以對其使用公式 -tf.reduce_sum(labels*tf.log(logits_scaled),1),就等同於

# softmax_cross_entropy_with_logits 得到的結果。**

#以下部分:輸入的標籤不是標準的one-hot,與one-hot標籤對比

#標籤總概率為1

labels = [[0.4,0.1,0.5],[0.3,0.6,0.1]]

result4 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)

with tf.session() as sess:

print ("rel4=",sess.run(result4),"\n")

#以下部分:sparse_softmax_cross_entropy_with_logits用法。

#sparse

labels = [2,1] #其實是0 1 2 三個類。等價 第一行 001 第二行 010

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

with tf.session() as sess:

print ("rel5=",sess.run(result5),"\n")

#注意!!!這個函式的返回值並不是乙個數,而是乙個向量,

#如果要求交叉熵loss,我們要對向量求均值,

#就是對向量再做一步tf.reduce_mean操作

loss=tf.reduce_mean(result1)

with tf.session() as sess:

print ("loss=",sess.run(loss))

labels = [[0,0,1],[0,1,0]]

loss2 = tf.reduce_mean(-tf.reduce_sum(labels * tf.log(logits_scaled),1) )

with tf.session() as sess:

print ("loss2=",sess.run(loss2))

結果:rel1=rel2

scaled= [[0.01791432 0.00399722 0.97808844]

[0.04980332 0.04506391 0.90513283]]

scaled2= [[0.21747023 0.21446465 0.56806517]

[0.2300214 0.22893383 0.5410447 ]]

rel1= [0.02215516 3.0996735 ]

rel2= [0.56551915 1.4743223 ]

rel3= [0.02215518 3.0996735 ]

rel4= [2.1721554 2.7696736]

rel5= [0.02215516 3.0996735 ]

loss= 1.5609143

loss2= 1.5609143

分析驗證:

1.logits裡面的值原本加和都是大於1的,但是經過sofmax之後,總和變成了1;

2.比較scaled 和scaled2可以看到,scaled才是真實轉化的softmax值;

3.對於已經用softmax轉換過的scaled,在計算loss時,就不能再用tensorflow裡面的softmax_cross_entropy_with_logits()了;

4.對於非one-hot編碼為標籤的資料進行交叉熵的計算,對比rel1和rel4,對於正確分類的交叉熵和錯誤分類的交叉熵,非one-hot編碼沒有標準one-hot那麼明顯;

5.sparse_softmax_cross_entropy_with_logits()區別於softmax_cross_entropy_with_logits(),其真實值與**值不需要one-hot編碼,但是分類的個數一定要從0開始。rel5=rel1;

6.可以分別從result1和logits_scaled得到loss。

全連線層 softmax的loss

這張圖的等號左邊部分就是全連線層做的事,w是全連線層的引數,我們也稱為權值,x是全連線層的輸入,也就是特徵。從圖上可以看出特徵x是n 1的向量,這是怎麼得到的呢?這個特徵就是由全連線層前面多個卷積層和池化層處理後得到的,假設全連線層前面連線的是乙個卷積層,這個卷積層的輸出是100個特徵 也就是我們常...

caffe反向傳播計算 softmax

loss layers.hpp ifndef caffe loss layer hpp define caffe loss layer hpp include include caffe blob.hpp include caffe layer.hpp include caffe proto caf...

如何用Python計算Softmax?

softmax函式,或稱歸一化指數函式,它能將乙個含任意實數的k維向量z 壓縮 到另乙個k維實向量 sigma 中,使得每乙個元素的範圍都在 0,1 之間,並且所有元素的和為1。該函式的形式通常按下面的式子給出 sigma frac e quad for j 1,k 輸入向量 1,2,3,4,1,2...