注意:tensorflow交叉熵計(jì)算函數(shù)輸入中的logits都不是softmax或sigmoid的輸出适贸,而是softmax或sigmoid函數(shù)的輸入,因?yàn)樗诤瘮?shù)內(nèi)部進(jìn)行sigmoid或softmax操作
?tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,
labels=None, logits=None, name=None)
argument:
_sentinel:本質(zhì)上是不用的參數(shù),不用填
logits:一個(gè)數(shù)據(jù)類型(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:
它對(duì)于輸入的logits先通過(guò)sigmoid函數(shù)計(jì)算,再計(jì)算它們的交叉熵尘惧,但是它對(duì)交叉熵的計(jì)算方式進(jìn)行了優(yōu)化康栈,使得結(jié)果不至于溢出
它適用于每個(gè)類別相互獨(dú)立但互不排斥的情況:例如一幅圖可以同時(shí)包含一條狗和一只大象
output不是一個(gè)數(shù),而是一個(gè)batch中每個(gè)樣本的loss,所以一般配合tf.reduce_mea(loss)使用
Python程序:
import tensorflow as tf
import numpy as np
def sigmoid(x):
??? return1.0/(1+np.exp(-x))
#5個(gè)樣本三分類問題喷橙,且一個(gè)樣本可以同時(shí)擁有多類
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)#按計(jì)算公式計(jì)算的結(jié)果
sess= tf.Session()
y = np.array(y).astype(np.float64)# labels是float64的數(shù)據(jù)類型
E2=sess.run(tf.nn.sigmoid_cross_entropy_with_logits(labels=y,logits=logits))print(E2)
輸出的E1啥么,E2結(jié)果相同
tf.nn.softmax_cross_entropy_with_logits(_sentinel=None,
labels=None, logits=None, dim=-1, name=None)
argument:
_sentinel:本質(zhì)上是不用的參數(shù),不用填
logits:一個(gè)數(shù)據(jù)類型(type)是float32或float64;
shape:[batch_size,num_classes]
labels:和logits具有相同type和shape的張量(tensor)贰逾,,是一個(gè)有效的概率悬荣,sum(labels)=1,one_hot=True(向量中只有一個(gè)值為1.0,其他值為0.0)
name:操作的名字疙剑,可填可不填
output:
loss氯迂,shape:[batch_size]
Note:
它對(duì)于輸入的logits先通過(guò)softmax函數(shù)計(jì)算,再計(jì)算它們的交叉熵言缤,但是它對(duì)交叉熵的計(jì)算方式進(jìn)行了優(yōu)化嚼蚀,使得結(jié)果不至于溢出
它適用于每個(gè)類別相互獨(dú)立且排斥的情況,一幅圖只能屬于一類轧简,而不能同時(shí)包含一條狗和一只大象
output不是一個(gè)數(shù)驰坊,而是一個(gè)batch中每個(gè)樣本的loss,所以一般配合tf.reduce_mean(loss)使用
Python程序:
import tensorflow as tf
import numpy as np
def softmax(x):
????????????? sum_raw = np.sum(np.exp(x),axis=-1)
????????????? x1 = np.ones(np.shape(x))
?????????????? for i in range(np.shape(x)[0]):
????????????????????????? x1[i] = np.exp(x[i])/sum_raw[i]
?????????????? returnx1
y= np.array([[1,0,0],[0,1,0],[0,0,1],[1,0,0],[0,1,0]])#每一行只有一個(gè)1
logits =np.array([[12,3,2],[3,10,1],[1,2,5],[4,6.5,1.2],[3,6,1]])
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結(jié)果相同
tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None,labels=None,
logits=None, name=None)
argument:
_sentinel:本質(zhì)上是不用的參數(shù)哮独,不用填
logits:一個(gè)數(shù)據(jù)類型(type)是float32或float64;
shape:[batch_size,num_classes]
labels:shape為[batch_size],labels[i]是{0,1,2,……,num_classes-1}的一個(gè)索引,type為int32或int64
name:操作的名字,可填可不填
output:
loss察藐,shape:[batch_size]
Note:
它對(duì)于輸入的logits先通過(guò)softmax函數(shù)計(jì)算皮璧,再計(jì)算它們的交叉熵,但是它對(duì)交叉熵的計(jì)算方式進(jìn)行了優(yōu)化分飞,使得結(jié)果不至于溢出
它適用于每個(gè)類別相互獨(dú)立且排斥的情況悴务,一幅圖只能屬于一類,而不能同時(shí)包含一條狗和一只大象
output不是一個(gè)數(shù),而是一個(gè)batch中每個(gè)樣本的loss,所以一般配合tf.reduce_mean(loss)使用
計(jì)算公式:
和tf.nn.softmax_cross_entropy_with_logits()一樣讯檐,只是要將labels轉(zhuǎn)換成tf.nn.softmax_cross_entropy_with_logits()中l(wèi)abels的形式
tf.nn.weighted_cross_entropy_with_logits(labels,
logits, pos_weight, name=None)
計(jì)算具有權(quán)重的sigmoid交叉熵sigmoid_cross_entropy_with_logits()
argument:
_sentinel:本質(zhì)上是不用的參數(shù)羡疗,不用填
logits:一個(gè)數(shù)據(jù)類型(type)是float32或float64;
shape:[batch_size,num_classes],單樣本是[num_classes]
labels:和logits具有相同的type(float)和shape的張量(tensor),
pos_weight:正樣本的一個(gè)系數(shù)
name:操作的名字别洪,可填可不填
output:
loss叨恨,shape:[batch_size,num_classes]