(此问题已进行更新。)
我是比利时根特大学的研究生,我的研究方向是使用深度卷积神经网络进行情感识别。我正在使用Caffe框架实现卷积神经网络。
最近我遇到了一个类别不平衡的问题。我使用了9216个训练样本,大约5%被标记为正(1),其余的样本都被标记为负(0)。
我正在使用SigmoidCrossEntropyLoss层来计算损失。在训练过程中,损失下降,准确率在几次迭代之后就非常高。这是由于数据不平衡造成的:网络总是预测负(0)。 (准确率和召回率都为零,支持此说法)
为了解决这个问题,我想根据预测结果和真实结果的组合,调整对损失的贡献度(重罚假阴性)。我的导师建议我在随机梯度下降(sgd)反向传播时使用缩放因子:该因子与批次中的数据不平衡有关。如果批次只包含负样本,则不更新权重。
我只向Caffe添加了一个自定义层,用于报告其他指标,如精度和召回率。我的Caffe代码经验有限,但我在编写C++代码方面有很多专业知识。
请问有人能帮助我或指导我如何调整SigmoidCrossEntropyLoss和Sigmoid层以适应以下更改:
- 根据预测结果和真实结果的组合来调整每个样本对总损失的贡献度(真阳性、假阳性、真阴性、假阴性)。
- 根据批次中的正负样本不平衡来缩放随机梯度下降所执行的权重更新。
提前感谢!
更新
我已按照Shai的建议,加入了InfogainLossLayer。我还添加了另一个自定义层,基于当前批次中的不平衡性构建信息增益矩阵H
。
目前,矩阵的配置如下:
H(i, j) = 0 if i != j
H(i, j) = 1 - f(i) if i == j (with f(i) = the frequency of class i in the batch)
我计划未来尝试不同的矩阵配置。
我已经在10:1的不平衡数据集上进行了测试。结果显示,网络现在正在学习有用的东西:(30个epoch之后的结果)
- 准确率约为70%(从97%下降);
- 精确度约为20%(从0%上升);
- 召回率约为60%(从0%上升)。
这些数字在大约20个epoch时达到,并且此后没有显着变化。
!!以上结果仅是概念证明,是通过在10:1不平衡的数据集上训练简单的网络得到的。!!
H
的吗? - ShaiH
。每个类别的频率是基于标签计算的,然后根据更新中提到的公式填充矩阵(我不声称那是唯一有效的公式,我计划尝试不同的值)。 - Maarten Bamelis