如何使用 sparse_softmax_cross_entropy_with_logits 在张量流中实现加权交叉熵损失
Posted
技术标签:
【中文标题】如何使用 sparse_softmax_cross_entropy_with_logits 在张量流中实现加权交叉熵损失【英文标题】:How can I implement a weighted cross entropy loss in tensorflow using sparse_softmax_cross_entropy_with_logits 【发布时间】:2017-03-05 01:07:44 【问题描述】:我开始使用 tensorflow(来自 Caffe),我正在使用损失 sparse_softmax_cross_entropy_with_logits
。该函数接受 0,1,...C-1
之类的标签,而不是 onehot 编码。现在,我想根据类标签使用权重;我知道如果我使用softmax_cross_entropy_with_logits
(一种热编码),这可以通过矩阵乘法来完成,有没有办法用sparse_softmax_cross_entropy_with_logits
做同样的事情?
【问题讨论】:
【参考方案1】: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
传递给 my_custom_model?***.com/questions/49312839/…【参考方案2】:
专门针对二元分类,有weighted_cross_entropy_with_logits
,它计算加权softmax交叉熵。
sparse_softmax_cross_entropy_with_logits
用于高效的非加权运算(请参阅SparseSoftmaxXentWithLogitsOp
,它在后台使用SparseXentEigenImpl
),因此它不是“可插入的”。
在多类情况下,您的选择是切换到 one-hot 编码或以一种 hacky 方式使用 tf.losses.sparse_softmax_cross_entropy
损失函数,正如已经建议的那样,您必须根据当前标签中的标签传递权重批处理。
【讨论】:
【参考方案3】:类权重乘以 logits,因此仍然适用于 sparse_softmax_cross_entropy_with_logits。 “张量流中类不平衡二元分类器的损失函数”参考this solution。
附带说明,您可以将权重直接传递给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] 的张量,则损失权重适用于每个对应的样本。
【讨论】:
我想知道是否有办法避免一个热标签;因为在提供的链接中,仍然需要将一个热标签的矩阵与权重向量相乘。另一种方法是直接使用长度batchsize的权重向量,但是我必须为每个批次计算这个向量;我如何定义它(因为它取决于标签)而不必计算 onehot 标签矩阵? 我认为这个答案不正确。tf.contrib.losses.sparse_softmax_cross_entropy
中的权重是按样本计算的,而不是按类别计算的。
没错,就是烦人。您将为每次更新传递一个权重,这取决于当前更新中的特定类。因此,如果您有一批尺寸为 3 且类别为 1、1、2 的批次。并且您希望将类 1 的权重设为 50%,然后您将使用此损失函数并将权重参数传递为值为 [0.5,0.5,1.0] 的张量。这将有效地衡量你的班级......优雅?没有。有效的是。以上是关于如何使用 sparse_softmax_cross_entropy_with_logits 在张量流中实现加权交叉熵损失的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]
如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?