【问题标题】:How can I implement a weighted cross entropy loss in tensorflow using sparse_softmax_cross_entropy_with_logits如何使用 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做同样的事情?

【问题讨论】:

    标签: python tensorflow deep-learning caffe cross-entropy


    【解决方案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()
    

    【讨论】:

    【解决方案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] 的张量。这将有效地衡量你的班级......优雅?没有。有效的是。
      猜你喜欢
      • 2018-06-06
      • 2019-08-08
      • 2017-11-11
      • 2018-02-05
      • 2021-02-03
      • 1970-01-01
      • 2018-06-10
      • 2018-05-31
      • 2019-06-19
      相关资源
      最近更新 更多