簡體   English   中英

如何使用sparse_softmax_cross_entropy_with_logits在tensorflow中實現加權交叉熵損失

[英]How can I implement a weighted cross entropy loss in tensorflow using sparse_softmax_cross_entropy_with_logits

我開始使用tensorflow(來自Caffe),我正在使用丟失sparse_softmax_cross_entropy_with_logits 該函數接受標簽,如0,1,...C-1而不是onehot編碼。 現在,我想根據類標簽使用加權; 我知道如果我使用softmax_cross_entropy_with_logits (一個熱編碼),可以用矩陣乘法來完成,有沒有辦法用sparse_softmax_cross_entropy_with_logits做同樣的sparse_softmax_cross_entropy_with_logits

import  tensorflow as tf
import numpy as np

np.random.seed(123)
sess = tf.InteractiveSession()

# let's say we have the logits and labels of a batch of size 6 with 5 classes
logits = tf.constant(np.random.randint(0, 10, 30).reshape(6, 5), dtype=tf.float32)
labels = tf.constant(np.random.randint(0, 5, 6), dtype=tf.int32)

# specify some class weightings
class_weights = tf.constant([0.3, 0.1, 0.2, 0.3, 0.1])

# specify the weights for each sample in the batch (without having to compute the onehot label matrix)
weights = tf.gather(class_weights, labels)

# compute the loss
tf.losses.sparse_softmax_cross_entropy(labels, logits, weights).eval()

具體地,對於二進制分類,存在weighted_cross_entropy_with_logits ,其計算加權softmax交叉熵。

sparse_softmax_cross_entropy_with_logits是高效非加權操作的SparseSoftmaxXentWithLogitsOp (請參閱SparseSoftmaxXentWithLogitsOp ,它在引擎蓋下使用SparseXentEigenImpl ),因此它不是“可插入的”。

在多類情況下,您可以選擇切換到單熱編碼或以hacky方式使用tf.losses.sparse_softmax_cross_entropy損失函數,如已建議的那樣,您必須根據當前批次中的標簽傳遞權重。

類權重乘以logits,因此仍適用於sparse_softmax_cross_entropy_with_logits。 請參閱此解決方案,了解“Tensor流中的類不平衡二進制分類器的損失函數”。

作為旁注,您可以將權重直接傳遞給sparse_softmax_cross_entropy

tf.contrib.losses.sparse_softmax_cross_entropy(logits, labels, weight=1.0, scope=None)

該方法用於交叉熵損失

tf.nn.sparse_softmax_cross_entropy_with_logits.

權重作為損失的系數。 如果提供了標量,那么損失將簡單地按給定值進行縮放。 如果權重是大小的張量[batch_size],則損失權重適用於每個相應的樣本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM