首先,我告诉你我的问题和情况。我想在链子中做多标签分类,我的班级不平衡问题很严重。
在这种情况下,为了计算损失函数,我必须对向量进行切片,例如,在多标签分类中,地面真值标号向量多数为0,其中只有少数元素是1,在这种情况下,直接使用F.sigmoid_cross_entropy应用所有的0/1元素可能导致训练不收敛,所以我决定使用[xx,xxx,.,xxx]片(a是最后一个FC层输出的chainer.Variable )切片特定元素来计算损失函数。在这种情况下,由于标签的不平衡可能会导致稀有类的低分类性能,所以我想在反向传播过程中设置稀有gt-标签变量高的丢失权,但是设置主标签(在gt中出现的太多)变量在反向传播过程中的低权重。
我怎么发动汽车呢?你对链子中的多标签不平衡类问题培训有什么建议?
发布于 2017-10-10 01:54:04
您可以使用非缩减模式的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) (例如,加总到1),那么手动乘权数组并采取类似于weight的求和也是可以的。
发布于 2017-10-10 00:15:47
如果您从事多标签分类,那么使用softmax_crossentropy丢失如何?
softmax_crossentropy可以通过指定class_weight属性来考虑类的不平衡。entropy.py#L57
https://stackoverflow.com/questions/46647044
复制相似问题