如何在chainer中设置减肥?
How to set loss weight in chainer?
首先我向您介绍一下我的问题和情况。
我想在 chainer 中进行多标签 class 化,我的 class 不平衡问题非常严重。
在这种情况下,我必须对向量进行切片才能计算损失函数,例如,在多标签 classification 中,ground truth 标签向量大多数元素为 0,只有少数元素为 1,在这种情况,直接用F.sigmoid_cross_entropy套用所有的0/1元素可能会导致训练不收敛,所以我决定用a[[xx,xxx,...,xxx]] slice( a is chainer.Variable 最后一个 FC 层的输出)对特定元素进行切片以计算损失函数。
在这种情况下,因为label不平衡可能会导致rare class low classification performance,所以我想设置rare gt-label variable high loss weight during back propagation, but set major label(occur too many在 gt 中)反向传播过程中可变的低权重。
我应该怎么做?您对 chainer 中的多标签不平衡 class 问题训练有何建议?
如果你处理多标签class化,使用softmax_crossentropy
损失怎么样?
softmax_crossentropy 可以通过指定 class_weight
属性来考虑 class 不平衡。
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
可以使用sigmoid_cross_entropy()
的no-reduce模式(通过reduce='no'
) to obtain a loss value at each spatial location and the average
函数进行加权平均。
sigmoid_cross_entropy()
首先计算每个空间位置和每个数据沿batch维度的损失值,然后在空间维度和batch维度上取均值或求和(取决于normalize
选项)。您可以通过传递 reduce='no'
来禁用缩减部分。如果要做加权平均,要指定,这样可以得到每个位置的损失值,自己减去。
之后,最简单的手动加权平均的方法是使用average()
,它可以接受weight
参数,表示平均的权重。它首先使用输入和 weight
进行加权求和,然后将结果除以 weight
的求和。您可以传递与输入具有相同形状的适当权重数组,并将其与 sigmoid_cross_entropy(..., reduce='no')
获得的原始(未减少的)损失值一起传递给 average()
。如果 weight
被适当地缩放(例如,总和为 1
),也可以手动乘以权重数组并像 F.sum(score * weight)
那样求和。
首先我向您介绍一下我的问题和情况。 我想在 chainer 中进行多标签 class 化,我的 class 不平衡问题非常严重。
在这种情况下,我必须对向量进行切片才能计算损失函数,例如,在多标签 classification 中,ground truth 标签向量大多数元素为 0,只有少数元素为 1,在这种情况,直接用F.sigmoid_cross_entropy套用所有的0/1元素可能会导致训练不收敛,所以我决定用a[[xx,xxx,...,xxx]] slice( a is chainer.Variable 最后一个 FC 层的输出)对特定元素进行切片以计算损失函数。 在这种情况下,因为label不平衡可能会导致rare class low classification performance,所以我想设置rare gt-label variable high loss weight during back propagation, but set major label(occur too many在 gt 中)反向传播过程中可变的低权重。
我应该怎么做?您对 chainer 中的多标签不平衡 class 问题训练有何建议?
如果你处理多标签class化,使用softmax_crossentropy
损失怎么样?
softmax_crossentropy 可以通过指定 class_weight
属性来考虑 class 不平衡。
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
可以使用sigmoid_cross_entropy()
的no-reduce模式(通过reduce='no'
) to obtain a loss value at each spatial location and the average
函数进行加权平均。
sigmoid_cross_entropy()
首先计算每个空间位置和每个数据沿batch维度的损失值,然后在空间维度和batch维度上取均值或求和(取决于normalize
选项)。您可以通过传递 reduce='no'
来禁用缩减部分。如果要做加权平均,要指定,这样可以得到每个位置的损失值,自己减去。
之后,最简单的手动加权平均的方法是使用average()
,它可以接受weight
参数,表示平均的权重。它首先使用输入和 weight
进行加权求和,然后将结果除以 weight
的求和。您可以传递与输入具有相同形状的适当权重数组,并将其与 sigmoid_cross_entropy(..., reduce='no')
获得的原始(未减少的)损失值一起传递给 average()
。如果 weight
被适当地缩放(例如,总和为 1
),也可以手动乘以权重数组并像 F.sum(score * weight)
那样求和。