【问题标题】:Tensorflow: Weighted sparse_softmax_cross_entropy for inbalanced classes across a single imageTensorflow:单个图像中不平衡类的加权 sparse_softmax_cross_entropy
【发布时间】:2019-04-15 03:27:39
【问题描述】:

我正在处理一个二元语义分割任务,其中一个类在任何输入图像中的分布都非常小,因此只有几个像素被标记。使用sparse_softmax_cross_entropy时 忽略此类时,总体错误很容易减少。现在,我正在寻找一种方法来通过一个系数对类进行加权,该系数可以惩罚与其他类相比更高的特定类的错误分类。

损失函数的文档说明:

权重作为损失的系数。如果提供了标量,则损失只是按给定值缩放。如果 weights 是一个形状为 [batch_size] 的张量,则损失 weights 适用于每个对应的样本。

如果我理解正确,它表示批次中特定样本的权重与其他样本不同。但这实际上不是我想要的。有谁知道如何实现这个损失函数的加权版本,其中权重衡量特定类而不是样本的重要性?

【问题讨论】:

  • 首先,你确定你需要softmax_cross_entropy,而不是sigmoid_cross_entropy?
  • 您错过了一个事实,即没有(据我所知)sigmoid_cross_entropy 的稀疏版本。因此,我必须将标签表示为单热编码。在我的例子中,输出由两个通道组成,每个通道代表一个类。 softmax 交叉熵的稀疏版本跨维度计算 softmax,因此像素(在 argmax 之后)为 1 或 0。
  • 你的输出(logits)和标签的确切形状是什么?
  • logits 的形状是 (?,214, 214, 2),标签的形状是 (?, 214, 214, 1)。在哪里 ?取决于批量大小。

标签: python tensorflow deep-learning conv-neural-network


【解决方案1】:

回答我自己的问题:

U-Net paper 的作者使用预先计算的权重图来处理不平衡的类。

苏黎世联邦理工学院天文学研究所提供了一个Tensorflow-based U-Net package,其中包含一个加权版本的 Softmax 函数(不是稀疏的,但它们首先将标签和 logits 展平):

class_weights = tf.constant(np.array(class_weights, dtype=np.float32))
weight_map = tf.multiply(flat_labels, class_weights)
weight_map = tf.reduce_sum(weight_map, axis=1)
loss_map = tf.nn.softmax_cross_entropy_with_logits_v2(logits=flat_logits, labels=flat_labels)
weighted_loss = tf.multiply(loss_map, weight_map)    
loss = tf.reduce_mean(weighted_loss)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2018-09-27
    • 2018-06-09
    • 2019-01-22
    相关资源
    最近更新 更多