如何使用 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 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?