【问题标题】:Weighted sparse categorical cross entropy加权稀疏分类交叉熵
【发布时间】:2021-03-19 04:09:37
【问题描述】:

我正在处理一个语义分割问题,其中我感兴趣的两个类(除了背景)在图像像素中完全不平衡。由于训练掩码的编码方式,我实际上使用稀疏分类交叉熵作为损失。有没有考虑到班级权重的版本?我一直没能找到,连sparse_categorical_cross_entropy的原始源代码都没有。我以前从未探索过 tf 源代码,但从 API 页面到源代码的链接似乎并没有链接到损失函数的真实实现。

【问题讨论】:

  • 也许this 可以适应细分工作。我对 python 和 keras 都没有经验来做这样的事情。也许它已经起作用了(?)但是,当我将一个具有类权重的数组传递给它时,它会出现“尺寸问题”。

标签: python tensorflow keras image-segmentation cross-entropy


【解决方案1】:

据我所知,您可以在 model.fit 中为任何损失函数使用类权重。我已经将它与 categorical_cross_entropy 一起使用并且它有效。它只是用类权重对损失进行加权,所以我认为它没有理由不适用于 sparse_categorical_cross_entropy。

【讨论】:

  • 使用 class_weight 适合它说class_weight not supported for 3+ dimensional targets.
  • 不适用于分段。他们甚至有一个weighted_sparse_categorical_crossentropy 损失on GitHub。但是,它不会起作用。 tf.keras 期望标签是整数值,而不是分段掩码。无论如何,我只是发表评论,希望有一天能回答这个问题,因为我也非常需要这个损失函数来进行语义分割。
  • 显然 sparse_categorical_crossentropy 和 weighted_categorical_crossentropy 在幕后的行为非常不同。正如@Vitto 指出的那样,我发现在使用 scce 时添加 class_weights 不起作用
【解决方案2】:

我认为this 是在 Keras 中称重 sparse_categorical_crossentropy 的解决方案。 他们使用以下内容将“第二个掩码”(包含掩码图像的每个类别的权重)添加到数据集中。

def add_sample_weights(image, label):
  # The weights for each class, with the constraint that:
  #     sum(class_weights) == 1.0
  class_weights = tf.constant([2.0, 2.0, 1.0])
  class_weights = class_weights/tf.reduce_sum(class_weights)

  # Create an image of `sample_weights` by using the label at each pixel as an 
  # index into the `class weights` .
  sample_weights = tf.gather(class_weights, indices=tf.cast(label, tf.int32))

  return image, label, sample_weights


train_dataset.map(add_sample_weights).element_spec

然后他们只使用tf.keras.losses.SparseCategoricalCrossentropy 作为损失函数并像这样拟合:

weighted_model.fit(
    train_dataset.map(add_sample_weights),
    epochs=1,
    steps_per_epoch=10)

【讨论】:

    猜你喜欢
    • 2019-12-18
    • 2021-02-15
    • 2019-05-23
    • 1970-01-01
    • 2017-12-26
    • 2016-09-18
    • 2020-09-10
    • 2021-03-19
    • 2020-10-12
    相关资源
    最近更新 更多