损失函数设计,为假阳性和假阴性结合不同的权重
Posted
技术标签:
【中文标题】损失函数设计,为假阳性和假阴性结合不同的权重【英文标题】:loss function design to incorporate different weight for false positive and false negative 【发布时间】:2017-06-30 16:32:34 【问题描述】:我正在尝试解决语义分割问题。按照真实的约束条件,假阳性的标准和假阴性的标准是不同的。例如,如果一个像素被错误校正为前景不如一个像素被错误校正为背景。如何在设置损失函数时处理这种约束。
【问题讨论】:
目前我只是使用binary_corrsentropy作为损失函数,好奇是否可以为不同的类标签添加权重。 【参考方案1】:您可以使用model.fit
的class_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_pred
和y_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
【讨论】:
以上是关于损失函数设计,为假阳性和假阴性结合不同的权重的主要内容,如果未能解决你的问题,请参考以下文章