softmax回歸處理
神經網路的原始輸出不是乙個概率值,實質上只是輸入的數值做了複雜的加權和與非線性處理之後的乙個值而已,那麼如何將這個輸出變為概率分布?
這就是softmax層的作用,假設神經網路的原始輸出為y1,y2,….,yn,那麼經過softmax回歸處理之後的輸出為:
很顯然的是:
而單個節點的輸出變成的乙個概率值,經過softmax處理後結果作為神經網路最後的輸出。
交叉熵的原理
交叉熵刻畫的是實際輸出(概率)與期望輸出(概率)的距離,也就是交叉熵的值越小,兩個概率分布就越接近。假設概率分布p為期望輸出,概率分布q為實際輸出,h(p,q)為交叉熵,則:
這個公式如何表徵距離呢,舉個例子:
假設n=3,期望輸出為p=(1,0,0),實際輸出q1=(0.5,0.2,0.3),q2=(0.8,0.1,0.1),那麼:
很顯然,q2與p更為接近,它的交叉熵也更小。
除此之外,交叉熵還有另一種表達形式,還是使用上面的假設條件:
其結果為:
以上的所有說明針對的都是單個樣例的情況,而在實際的使用訓練過程中,資料往往是組合成為乙個batch來使用,所以對用的神經網路的輸出應該是乙個m*n的二維矩陣,其中m為batch的個數,n為分類數目,而對應的label也是乙個二維矩陣,還是拿上面的資料,組合成乙個batch=2的矩陣:
所以交叉熵的結果應該是乙個列向量(根據第一種方法):
而對於乙個batch,最後取平均為0.2。
在tensorflow中實現交叉熵
在tensorflow可以採用這種形式:
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
其中y_表示期望的輸出,y表示實際的輸出(概率值),*為矩陣元素間相乘,而不是矩陣乘。
上述**實現了第一種形式的交叉熵計算,需要說明的是,計算的過程其實和上面提到的公式有些區別,按照上面的步驟,平均交叉熵應該是先計算batch中每乙個樣本的交叉熵後取平均計算得到的,而利用tf.reduce_mean函式其實計算的是整個矩陣的平均值,這樣做的結果會有差異,但是並不改變實際意義。
除了tf.reduce_mean函式,tf.clip_by_value函式是為了限制輸出的大小,為了避免log0為負無窮的情況,將輸出的值限定在(1e-10, 1.0)之間,其實1.0的限制是沒有意義的,因為概率怎麼會超過1呢。
由於在神經網路中,交叉熵常常與sorfmax函式組合使用,所以tensorflow對其進行了封裝,即:
cross_entropy = tf.nn.sorfmax_cross_entropy_with_logits(y_ ,y)
tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=none,labels=none,logits=none,name=none) 函式是將softmax和cross_entropy放在一起計算,對於分類問題而言,最後一般都是乙個單層全連線神經網路,比如softmax分類器居多,對這個函式而言,tensorflow神經網路中是沒有softmax層,而是在這個函式中進行softmax函式的計算。這裡的logits通常是最後的全連線層的輸出結果,labels是具體哪一類的標籤,這個函式是直接使用標籤資料的,而不是採用one-hot編碼形式。
MNIST在TensorFlow中的實現及解釋摘要
交叉熵及其在tensorflow中的表示 回歸問題一般用均方誤差作成本函式,而對於分類問題,常用的成本函式是交叉熵 cross entropy 定義為 其中y是我們 的概率分布,y 是實際的分布。交叉熵可以看做反映 不匹配的指標,或者說該指標反映實際情況出乎預料的程度。注意交叉熵是非對稱的。在ten...
使用TensorFlow在瀏覽器中實現神經網路
什麼是神經網路 neural network 神經網路技術是通過電腦程式來從資料中學習,它是基於人類大腦學習的過程建立的。首先,建立神經元,然後鏈結在一起,互相傳送訊息 其次,網路是用來解決問題的,每次加強通往成功的鏈結,減弱通往失敗的鏈結。更詳細的神經網路介紹可以前往michael nielsen...
syncbn在TensorFlow中的實現
在syncbn之前我們先簡單介紹一下bn層以及多卡機制 bn層介紹 bn層中有兩個可訓練引數 beta,gamma 以及兩個統計引數 moving mean,moving variance 訓練過程和測試過程,bn層計算方式是不同的。訓練過程,beta和gamma與卷積層中的weight是一樣參與訓...