我开始使用 tensorflow(来自 Caffe),并且正在使用 loss sparse_softmax_cross_entropy_with_logits
。该函数接受标签,0,1,...C-1
而不是 onehot 编码。现在,我想根据类标签使用权重;我知道如果我使用(一种热编码),这可以通过矩阵乘法来完成softmax_cross_entropy_with_logits
,有没有办法做同样的事情sparse_softmax_cross_entropy_with_logits
?
问问题
18668 次
3 回答
24
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()
于 2017-10-28T00:02:04.113 回答
2
特别是对于二元分类,有weighted_cross_entropy_with_logits
计算加权 softmax 交叉熵。
sparse_softmax_cross_entropy_with_logits
用于高效的非加权操作(请参阅引擎盖下的SparseSoftmaxXentWithLogitsOp
用途),因此它不是“可插入的”。SparseXentEigenImpl
在多类情况下,您的选择是切换到 one-hot 编码或tf.losses.sparse_softmax_cross_entropy
以一种 hacky 方式使用损失函数,正如已经建议的那样,您必须根据当前批次中的标签传递权重。
于 2017-10-10T12:10:23.243 回答
1
类权重乘以 logits,因此仍然适用于 sparse_softmax_cross_entropy_with_logits。有关“张量流中类不平衡二元分类器的损失函数”,请参阅此解决方案。
作为旁注,您可以将权重直接传递给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] 的张量,则损失权重适用于每个相应的样本。
于 2016-10-24T00:33:30.020 回答