1. 程式人生 > >Tensorflow四種交叉熵函數計算公式:tf.nn.cross_entropy

Tensorflow四種交叉熵函數計算公式:tf.nn.cross_entropy

for owa its 一行 輸出 權重 true return src

Tensorflow交叉熵函數:cross_entropy

註意:tensorflow交叉熵計算函數輸入中的logits都不是softmax或sigmoid的輸出,而是softmax或sigmoid函數的輸入,因為它在函數內部進行sigmoid或softmax操作

tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, name=None)

argument:

_sentinel:本質上是不用的參數,不用填

logits:一個數據類型(type)是float32或float64;

shape:[batch_size,num_classes],單樣本是[num_classes]

labels:和logits具有相同的type(float)和shape的張量(tensor),

name:操作的名字,可填可不填

output:

loss,shape:[batch_size,num_classes]

Note:

它對於輸入的logits先通過sigmoid函數計算,再計算它們的交叉熵,但是它對交叉熵的計算方式進行了優化,使得結果不至於溢出

它適用於每個類別相互獨立但互不排斥的情況:例如一幅圖可以同時包含一條狗和一只大象

output不是一個數,而是一個batch中每個樣本的loss,所以一般配合tf.reduce_mea(loss)使用

計算公式:

技術分享圖片

Python 程序:

importtensorflowas tf
import numpy asnp

def sigmoid(x):
return 1.0/(1+np.exp(-x))

# 5個樣本三分類問題,且一個樣本可以同時擁有多類
y = np.array([[1,0,0],[0,1,0],[0,0,1],[1,1,0],[0,1,0]]

logits = np.array([[12,3,2],[3,10,1],[1,2,5],[4,6.5,1.2],[3,6,1]])
y_pred = sigmoid(logits)
E1 = -y*np.log(y_pred)-(1-y)*np.log(1-y_pred)
print(E1) # 按計算公式計算的結果

sess =tf.Session()
y = np.array(y).astype(np.float64) # labels是float64的數據類型
E2 = sess.run(tf.nn.sigmoid_cross_entropy_with_logits(labels=y,logits=logits))
print(E2)

輸出的E1,E2結果相同

tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)
argument:

_sentinel:本質上是不用的參數,不用填

logits:一個數據類型(type)是float32或float64;

shape:[batch_size,num_classes]

labels:和logits具有相同type和shape的張量(tensor),,是一個有效的概率,sum(labels)=1, one_hot=True(向量中只有一個值為1.0,其他值為0.0)

name:操作的名字,可填可不填

output:

loss,shape:[batch_size]

Note:

它對於輸入的logits先通過softmax函數計算,再計算它們的交叉熵,但是它對交叉熵的計算方式進行了優化,使得結果不至於溢出

它適用於每個類別相互獨立且排斥的情況,一幅圖只能屬於一類,而不能同時包含一條狗和一只大象

output不是一個數,而是一個batch中每個樣本的loss,所以一般配合tf.reduce_mean(loss)使用

計算公式:

技術分享圖片

Python程序:

importtensorflowas tf
import numpy asnp

def softmax(x):
sum_raw = np.sum(np.exp(x),axis=-1)
x1 = np.ones(np.shape(x))
for i inrange(np.shape(x)[0]):
x1[i] = np.exp(x[i])/sum_raw[i]
return x1

y = np.array([[1,0,0],[0,1,0],[0,0,1],[1,0,0],[0,1,0]])# 每一行只有一個1

logits =np.array([[12,3,2],[3,10,1],[1,2,5],[4,6.5,1.2],[3,6,1]])

y_pred =softmax(logits)
E1 = -np.sum(y*np.log(y_pred),-1)
print(E1)
sess = tf.Session()
y = np.array(y).astype(np.float64)
E2 = sess.run(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=logits))
print(E2)

輸出的E1,E2結果相同

tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None, name=None)

argument:

_sentinel:本質上是不用的參數,不用填

logits:一個數據類型(type)是float32或float64;

shape:[batch_size,num_classes]

labels: shape為[batch_size],labels[i]是{0,1,2,……,num_classes-1}的一個索引, type為int32或int64

name:操作的名字,可填可不填

output:

loss,shape:[batch_size]

Note:

它對於輸入的logits先通過softmax函數計算,再計算它們的交叉熵,但是它對交叉熵的計算方式進行了優化,使得結果不至於溢出
它適用於每個類別相互獨立且排斥的情況,一幅圖只能屬於一類,而不能同時包含一條狗和一只大象
output不是一個數,而是一個batch中每個樣本的loss,所以一般配合tf.reduce_mean(loss)使用
計算公式:

和tf.nn.softmax_cross_entropy_with_logits()一樣,只是要將labels轉換成tf.nn.softmax_cross_entropy_with_logits()中labels的形式

tf.nn.weighted_cross_entropy_with_logits(labels,logits, pos_weight, name=None)

計算具有權重的sigmoid交叉熵sigmoid_cross_entropy_with_logits()

argument:

_sentinel:本質上是不用的參數,不用填

logits:一個數據類型(type)是float32或float64;

shape:[batch_size,num_classes],單樣本是[num_classes]

labels:和logits具有相同的type(float)和shape的張量(tensor),

pos_weight:正樣本的一個系數

name:操作的名字,可填可不填

output:

loss,shape:[batch_size,num_classes]

Tensorflow四種交叉熵函數計算公式:tf.nn.cross_entropy