tensorflow cross_entropy 四種交叉熵計算函式
阿新 • • 發佈:2018-12-31
Tensorflow交叉熵函式:cross_entropy
以下交叉熵計算函式輸入中的logits都不是softmax或sigmoid的輸出,因為它在函式內部進行了sigmoid或softmax操作
tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None)
_sentinel:本質上是不用的引數,不用填
labels:一個和logits具有相同的資料型別(type)和尺寸形狀(shape)的張量(tensor)
shape:[batch_size,num_classes],單樣本是[num_classes]
logits:一個數據型別(type)是float32或float64的張量
name:操作的名字,可填可不填
它對於輸入的logits先通過sigmoid函式計算,再計算它們的交叉熵,但是它對交叉熵的計算方式進行了優化,使得結果不至於溢位
它適用於每個類別相互獨立但互不排斥的情況:例如一幅圖可以同時包含一條狗和一隻大象
tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)
_sentinel:本質上是不用的引數,不用填
labels:每一行labels[i]必須是一個有效的概率分佈,one_hot=True(向量中只有一個值為1,其他值為0)
logits:labels和logits具有相同的資料型別(type)和尺寸(shape)
shape:[batch_size,num_classes],單樣本是[num_classes]
name:操作的名字,可填可不填
它對於輸入的logits先通過softmax函式計算
它適用於每個類別相互獨立且排斥的情況,一幅圖只能屬於一類,而不能同時包含一條狗和一隻大象
tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None)
_sentinel:本質上是不用的引數,不用填
labels:shape為[batch_size],labels[i]是[0,num_classes)的一個索引, type為int32或int64
logits:shape為[batch_size,num_classes],type為float32或float64
name:操作的名字,可填可不填
它適用於每個類別相互獨立且排斥的情況,一幅圖只能屬於一類,而不能同時包含一條狗和一隻大象
tf.nn.weighted_cross_entropy_with_logits(labels, logits, pos_weight, name=None)
計算具有權重的sigmoid交叉熵sigmoid_cross_entropy_with_logits()
_sentinel:本質上是不用的引數,不用填
labels:一個和logits具有相同的資料型別(type)和尺寸形狀(shape)的張量(tensor)
shape:[batch_size,num_classes],單樣本是[num_classes]
logits:一個數據型別(type)是float32或float64的張量
pos_weight:正樣本的一個係數
name:操作的名字,可填可不
計算公式: pos_weight*labels * -log(sigmoid(logits)) + (1 - labels) * -log(1 - sigmoid(logits))