[英]NaN from sparse_softmax_cross_entropy_with_logits in 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.