如何在tensorflow中使用sparse_softmax_cross_entropy_with_logits实现加权交叉熵损失?

14
我开始使用TensorFlow(从Caffe过来),并且正在使用损失函数。该函数接受标签,如0,1,...C-1,而不是onehot编码。现在,我想根据类别标签使用加权;如果我使用(one hot编码),则知道可以使用矩阵乘法来完成此操作。是否有任何方法可以在中实现相同的功能?
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()

请帮忙!我如何将“weights”传递给我的自定义模型?https://stackoverflow.com/questions/49312839/how-to-set-parts-of-positive-samples-weight-in-tensorflow-for-binary-classficati - user3151261

2
针对二元分类问题,有一个名为weighted_cross_entropy_with_logits的函数,可以计算加权softmax交叉熵。 SparseSoftmaxXentWithLogitsOp是专门用于高效的非加权操作(底层使用SparseXentEigenImpl),因此它不是“可插拔”的。
在多类情况下,你的选择要么切换到独热编码,要么以一种巧妙的方式使用tf.losses.sparse_softmax_cross_entropy损失函数,正如先前已经建议的那样,在其中你将不得不根据当前批次中的标签传递权重。

1
类别权重与logits相乘,因此对于sparse_softmax_cross_entropy_with_logits仍然有效。有关“Tensor flow中用于类不平衡二元分类器的损失函数”的解决方案,请参见这个解决方案
另外,您可以直接将权重传递给sparse_softmax_cross_entropy
tf.contrib.losses.sparse_softmax_cross_entropy(logits, labels, weight=1.0, scope=None)

这个方法是用于使用交叉熵损失的,保留HTML标记。
tf.nn.sparse_softmax_cross_entropy_with_logits.

权重作为损失函数的系数。如果提供了一个标量,则简单地将损失乘以给定的值。如果权重是大小为[batch_size]的张量,则损失权重适用于每个相应的样本。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Roger Trullo
3
我认为这个答案不正确。tf.contrib.losses.sparse_softmax_cross_entropy 中的权重是每个样本的,而不是每个类别的。 - andong777
这是正确的,只是有点烦人。你需要为每个更新传递一个权重,这取决于当前更新中所涉及的特定类别。因此,如果你有一个大小为3的批次,其中类别为1、1、2。如果你想将类别1的权重设置为50%,那么你可以使用这个损失函数,并将权重参数传递给一个张量,其值为[0.5,0.5,1.0]。这将有效地加权你的类别...优雅吗?不是。但是它是有效的。 - Matt S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接