(已添加此问题的更新。)
我是比利时根特大学的研究生;我的研究是关于深度卷积神经网络的情感识别。我正在使用Caffe框架来实现CNN。
最近,我遇到了有关类(class)不平衡的问题。我使用的是9216个训练样本。 5%标记为正面(1),其余 sample 标记为负面(0)。
我正在使用SigmoidCrossEntropyLoss层来计算损失。训练时,即使经过几个纪元,损失也会减少,并且准确性非常高。这是由于不平衡造成的:网络仅总是预测负数(0)。 (精确度和召回率均为零,支持此主张)
为了解决这个问题,我想根据预测真相组合(严重惩罚假阴性)来扩展对损失的贡献。我的导师/教练还建议我在通过随机梯度下降(sgd)向后传播时,使用比例因子:该因子将与批次中的不平衡相关。仅包含阴性 sample 的批次根本不会更新重量。
我仅在Caffe中添加了一个定制层:报告其他指标,例如精度和召回率。我对Caffe代码的经验有限,但是我在编写C++代码方面有很多专业知识。
任何人都可以帮助我或为我指出正确的方向,如何调整SigmoidCrossEntropyLoss和Sigmoid图层以适应以下更改:
提前致谢!
更新资料
我已经按照InfogainLossLayer 的建议合并了 Shai。我还添加了另一个自定义层,该层基于当前批次中的不平衡量来构建信息增益矩阵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个纪元后的结果)
这些数字在大约20个纪元时就达到了,此后没有明显变化。
!!上述结果只是概念上的证明,它们是通过在10:1的不平衡数据集上训练简单网络而获得的。 !!
最佳答案
您为什么不使用InfogainLoss层来弥补训练集中的不平衡?
使用权重矩阵H
(在您的情况下为2×2)定义信息增益损失,其含义是
[cost of predicting 1 when gt is 0, cost of predicting 0 when gt is 0
cost of predicting 1 when gt is 1, cost of predicting 0 when gt is 1]
因此,您可以设置H
的条目以反射(reflect)预测0或1时错误之间的差异。您可以在this thread中找到如何为咖啡定义矩阵
H
。关于样本权重,您可能会发现this post很有趣:它显示了如何修改 SoftmaxWithLoss 层以考虑样本权重。
最近,Tsung-Yi Lin, Priya Goyal, Ross Girshick, Kaiming He, Piotr Dollár Focal Loss for Dense Object Detection, (ICCV 2017)提出了对交叉熵损失的修改。
焦点损失背后的想法是,根据预测该示例的相对难度(而不是根据类(class)人数等)为每个示例分配不同的权重。从我开始尝试这种损失的短暂时间起,它感觉优于具有类大小权重的
"InfogainLoss"
。