1. 程式人生 > >tensorflow cross_entropy 四種交叉熵計算函式

tensorflow cross_entropy 四種交叉熵計算函式

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))