Des*_*wal 8 keras tensorflow loss-function tf.keras tensorflow2.0
Tensorflow 中给出的焦点损失用于类别不平衡。对于二元类分类,有很多可用的代码,但对于多类分类,帮助很少。我运行了包含 250 个类的目标变量的代码One Hot Encoded,它给出的结果没有任何错误。
y = pd.get_dummies(df['target']) # One hot encoded target classes
model.compile(
optimizer="adam", loss=tfa.losses.SigmoidFocalCrossEntropy(), metrics= metric
)
Run Code Online (Sandbox Code Playgroud)
我只是想知道谁编写了这段代码,或者对这段代码有足够了解的人,它可以用于多类分类吗?如果没有,那为什么它没有给我错误,反而比CrossEntropy. 此外,在像这样的其他实现中alpha,必须为每个类给出 的值,但在 Tensorflow 的实现中只给出一个值。
使用这个的正确方法是什么?
Yao*_*ang 10
首先是一些基础知识。
分类交叉熵旨在激励模型 100% 预测正确的标签。它专为预测单标签多类分类的模型而设计,例如 CIFAR10 或 Imagenet。通常这些模型在具有多个输出的密集层中完成。
二元交叉熵旨在激励模型在标签为 1 时预测 100%,或者在标签为零时预测 0%。通常这些模型在密集层中完成,只有一个输出。
当您将二元交叉熵应用于单标签多类分类问题时,您正在做一些在数学上有效但定义略有不同的任务:您正在激励单标签分类模型不仅获得正确的真实标签,而且还可以最大限度地减少虚假标签。
例如,如果您的目标是狗,并且您的模型预测 60% 的狗,则 CCE 并不关心您的模型预测 20% 的猫和 20% 的圆号,还是 40% 的猫和 0% 的圆号。因此,这与 top-1 准确度概念是一致的。
但是,如果您采用相同的模型并应用 BCE,并且您的模型预测 60% 的狗,则 BCE 会关心您的模型预测 20%/20% 的猫/法国号,还是 40%/0% 的猫/法国号。用精确的术语来说,前者更加“校准”,因此它有一些额外的善良衡量标准。然而,这与 top-1 准确率几乎没有相关性。
当您使用 BCE 时,大概您正在浪费模型的能量来专注于校准,而牺牲了 top-1 acc。但正如您可能已经看到的,事情并不总是这样。有时 BCE 会给你带来更好的结果。我不知道对此有明确的解释,但我假设额外的信号(在 Imagenet 的情况下,你实际上会获得多 1000 倍的信号)以某种方式创建更平滑的损失值,这可能有助于平滑梯度你收到。
焦点损失的 alpha 值还会对非常错误的预测进行惩罚,如果模型预测的结果接近正确答案,则可以减轻惩罚——例如,如果基本事实是猫,则预测 90% 是猫。这将是对 CCE 最初定义的转变,它基于最大似然估计理论……重点是校准……与大多数 ML 从业者关心的正常指标:top-1 精度。
焦点损失最初是为二元分类而设计的,因此原始公式只有一个 alpha 值。您指出的存储库将焦点损失的概念扩展到单标签分类,因此有多个 alpha 值:每个类一个。然而,根据我的阅读,它失去了 BCE 额外可能的平滑效果。
Net net,为了获得最佳结果,您需要对 CCE、BCE、二元焦点损失(TFA 和原始论文中的)以及您在该存储库中找到的单标签多类焦点损失进行基准测试。一般来说,这些 alpha 值的发现是通过猜测和检查或网格搜索来完成的。
不幸的是,机器学习中有大量的手动猜测和检查。
| 归档时间: |
|
| 查看次数: |
2676 次 |
| 最近记录: |