(已添加对此问题的更新。)
我是比利时根特大学的研究生;我的研究是关于深度卷积神经网络的情绪识别。我正在使用Caffe框架来实现 CNN。
最近我遇到了一个关于班级不平衡的问题。我正在使用大约 9216 个训练样本。5% 标记为阳性 (1),其余样本标记为阴性 (0)。
我正在使用SigmoidCrossEntropyLoss层来计算损失。训练时,即使经过几个 epoch,损失也会减少,准确率非常高。这是由于不平衡造成的:网络总是简单地预测负数(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 epochs 后的结果)
- 准确度约为。~70%(低于 ~97%);
- 精度约为。~20%(从 0% 上调);
- 召回是大约。~60%(从 0% 上调)。
这些数字是在大约 20 个 epoch 时达到的,之后没有显着变化。
!!上述结果只是一个概念证明,它们是通过在 10:1 不平衡数据集上训练一个简单的网络获得的。!!