如何在chainer中设定减重?

时间:2017-10-09 12:55:41

标签: python chainer

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

在这种情况下我必须切片向量以计算损失函数,例如,在多标签分类中,地面实况标签向量大多数元素为0,其中只有少数为1,在这种情况下,直接使用F. sigmoid_cross_entropy应用所有0/1元素可能导致训练不收敛,所以我决定使用[[xx,xxx,...,xxx]]切片(a是chainer。最后FC层的可变输出)来切片特定计算损失函数的元素。 在这种情况下,由于标签不平衡可能会导致罕见的低级分类性能,所以我想在反向传播期间设置罕见的gt标签变量高损失权重,但在反向传播期间设置主要标签(在gt中出现太多)可变低重量

我该怎么办?您对chainer中多标签失衡类问题培训的建议是什么?

2 个答案:

答案 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之和求和。