损失函数设计,为假阳性和假阴性结合不同的权重

Posted

技术标签:

【中文标题】损失函数设计,为假阳性和假阴性结合不同的权重【英文标题】:loss function design to incorporate different weight for false positive and false negative 【发布时间】:2017-06-30 16:32:34 【问题描述】:

我正在尝试解决语义分割问题。按照真实的约束条件,假阳性的标准和假阴性的标准是不同的。例如,如果一个像素被错误校正为前景不如一个像素被错误校正为背景。如何在设置损失函数时处理这种约束。

【问题讨论】:

目前我只是使用binary_corrsentropy作为损失函数,好奇是否可以为不同的类标签添加权重。 【参考方案1】:

您可以使用model.fitclass_weight 参数对您的类进行加权,因此,根据类对错误分类进行不同的惩罚。

class_weight:可选字典将类索引(整数)映射到权重(浮点数),以在训练期间应用于该类样本的模型损失。这对于告诉模型“更加关注”来自代表性不足的类的样本很有用。

例如:

out = Dense(2, activation='softmax')
model = Model(input=..., output=out)
model.fit(X, Y, class_weight=0: 1, 1: 0.5)

这样对第二类的惩罚会比对第一类的惩罚少。

【讨论】:

有没有办法明智地做到这一点?我可以简单地对 binary_cross 熵的输出进行相应的加权吗?如果真阳性的权重也应与真阴性的权重不同(而不仅仅是答案中的阳性)怎么办? 最后,您可以将任何您喜欢的项与损失函数的输出相乘,但为了做到这一点,您需要编写自己的损失函数(即提供一个采用 y_predy_true,计算你的损失并乘以你的权重向量)。 但是二进制交叉熵函数不会总是产生 0 到 1 之间的损失(0.5 意味着 y_true==y_pred)。缩放不会扭曲损失函数吗? 谁能提供更多关于 class_weight 工作原理的数学知识吗? @AmanDalmia 基本上:weights[class[i]] * loss(y_true[i], y_pred[i]) 其中class 是样本索引到相应类的映射。 weights 是类到权重的映射。因此,损失会根据样本的类别重新加权。【参考方案2】:

查看 keras-contrib 中的 jaccard 距离(或 IOU)损失函数:

当图像中的像素数量不平衡时,此损失很有用 因为它赋予所有类别同等的权重。然而,事实并非如此 图像分割的标准。 例如,假设您试图预测每个像素是猫、狗还是背景。 你有 80% 的背景像素、10% 的狗和 10% 的猫。如果模型预测 100% 背景 应该是 80% 正确(如分类交叉熵)还是 30%(有此损失)?

来源: https://github.com/keras-team/keras-contrib/blob/master/keras_contrib/losses/jaccard.py

【讨论】:

以上是关于损失函数设计,为假阳性和假阴性结合不同的权重的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法用已知的真阳性、真阴性、假阳性和假阴性来绘制混淆矩阵?

Python深度学习之路-3.1性能评价指标

Python深度学习之路-3.1性能评价指标

Python深度学习之路-3.1性能评价指标

在命名实体识别中计算精度和召回率

每个示例具有不同权重的 Keras 自定义损失函数