首先,我向你讲述我的问题和情况。 我想在chainer中做多标签分类,我的班级不平衡问题非常严重。
在这种情况下我必须切片向量以计算损失函数,例如,在多标签分类中,地面实况标签向量大多数元素为0,其中只有少数为1,在这种情况下,直接使用F. sigmoid_cross_entropy应用所有0/1元素可能导致训练不收敛,所以我决定使用[[xx,xxx,...,xxx]]切片(a是chainer。最后FC层的可变输出)来切片特定计算损失函数的元素。 在这种情况下,由于标签不平衡可能会导致罕见的低级分类性能,所以我想在反向传播期间设置罕见的gt标签变量高损失权重,但在反向传播期间设置主要标签(在gt中出现太多)可变低重量
我该怎么办?您对chainer中多标签失衡类问题培训的建议是什么?
答案 0 :(得分:0)
如果您正在进行多标签分类,那么如何使用softmax_crossentropy
丢失?
softmax_crossentropy可以通过指定class_weight
属性来考虑类不平衡。
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
答案 1 :(得分:0)
您可以使用sigmoid_cross_entropy()
无减少模式(通过传递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
之和求和。