0

首先,我向您讲述我的问题和情况。我想在chainer中做多标签分类,我的类不平衡问题非常严重。

在这种情况下,我必须对向量进行切片才能计算损失函数,例如,在多标签分类中,ground truth label vector大多数元素为0,只有少数为1,这种情况下,直接使用F.sigmoid_cross_entropy来申请所有的 0/1 元素都可能导致训练不收敛,所以我决定使用 a[[xx,xxx,...,xxx]] 切片(a is chainer.Variable output by last FC layer)对特定元素进行切片计算损失函数。在这种情况下,由于标签不平衡可能导致稀有类低分类性能,所以我想在反向传播期间设置稀有 gt-label 变量高损失权重,但在反向传播期间设置主要标签(在 gt 中出现太多)变量低权重.

我该怎么做?你对chainer中的多标签不平衡类问题训练有什么建议?

4

2 回答 2

0

如果您从事多标签分类,那么使用softmax_crossentropy损失如何?

class_weightsoftmax_crossentropy 可以通过指定属性 来考虑类不平衡。https://github.com/chainer/chainer/blob/v3.0.0rc1/chainer/functions/loss/softmax_cross_entropy.py#L57

https://docs.chainer.org/en/stable/reference/generated/chainer.functions.softmax_cross_entropy.html

于 2017-10-10T00:15:47.363 回答
0

您可以使用sigmoid_cross_entropy()no-reduce 模式(通过传递reduce='no')获得每个空间位置的损失值和average加权平均函数。

sigmoid_cross_entropy()首先计算每个空间位置和批次维度上的每个数据的损失值,然后在空间维度和批次维度上取平均值或求和(取决于normalize选项)。您可以通过传递来禁用缩减部分reduce='no'。如果你想做加权平均,你应该指定它,以便你可以得到每个位置的损失值并自己减少它们。

之后,手动进行加权平均的最简单方法是使用average(),它可以接受weight指示平均权重的参数。它首先使用输入 和 进行加权求和weight,然后将结果除以 的总和weight。您可以传递与输入具有相同形状的适当权重数组,并将其average()与通过sigmoid_cross_entropy(..., reduce='no'). 也可以手动乘以权重数组并进行求和,例如F.sum(score * weight)适当weight缩放(例如求和1)。

于 2017-10-10T01:54:04.037 回答