TF-1

透明的胡蘿蔔發表於2019-03-12

https://www.zhihu.com/question/54513728

name_scope, variable_scope等如何理解

交叉熵

tensorflow-損失函式詳解

交叉熵刻畫的是兩個概率分佈之間的距離,是分類問題中使用比較廣泛的損失函式之一。給定兩個概率分佈p和q,通過交叉熵計算的兩個概率分佈之間的距離為:

H(X=x) = -\sum_{x}p(x)logq(x)

我們通過softmax迴歸將神經網路前向傳播得到的結果變成交叉熵要求的概率分佈得分。
T

Tensorflow中定義的交叉熵函式如下:

def softmax_cross_entropy_with_logits(_sentinel=None,  # pylint: disable=invalid-name
                                      labels=None, logits=None,
                                      dim=-1, name=None):
    """Computes softmax cross entropy between `logits` and `labels`."""
  • logits: 神經網路的最後一層輸出,如果有batch的話,它的大小為[batch_size, num_classes], 單樣本的話大小就是num_classes
  • labels: 樣本的實際標籤,大小與logits相同。且必須採用labels=y_,logits=y的形式將引數傳入。

具體的執行流程大概分為兩步,第一步首先是對網路最後一層的輸出做一個softmax,這一步通常是求取輸出屬於某一類的概率,對於單樣本而言,就是輸出一個num_classes大小的向量[Y1,Y2,Y3,....],其中Y1,Y2,Y3Y1,Y2,Y3分別表示屬於該類別的概率, softmax的公式為:


 

第二步是對softmax輸出的向量[Y1,Y2,Y3,...]和樣本的時機標籤做一個交叉熵,公式如下:

其中y′i指代實際標籤向量中的第i個值,yi就是softmax的輸出向量[Y1,Y2,Y3,...]中的第i個元素的值。
顯而易見。預測yi越準確,結果的值就越小(前面有負號),最後求一個平均,就得到我們想要的loss了

這裡需要注意的是,這個函式返回值不是一個數,而是一個向量,如果要求交叉熵,我們要在做一步tf.resuce_sum操作,就是對向量裡面的所有元素求和, 最後就能得到Hy′(y),如果要求loss,則需要做一步tf.reduce_mean操作,對向量求均值.

warning:

  • Tenosrflow中整合的交叉熵操作是施加在未經過Softmax處理的logits上, 這個操作的輸入logits是未經縮放的, 該操作內部會對logits使用Softmax操作。
  • 引數labels,ligits必須有相同的shape,如:[batch_size, num_classes]和相同的型別, 如:[(float16, float32, float64)中的一種]。