我应该使用这种多类多标签(?)问题的哪种损失函数?

Posted

技术标签:

【中文标题】我应该使用这种多类多标签(?)问题的哪种损失函数?【英文标题】:What sort of loss function should I use this multi-class multi-label(?) problem? 【发布时间】:2020-03-14 11:02:03 【问题描述】:

在我的实验中,我试图训练一个神经网络来检测患者是否表现出症状 A、B、C、D。我的数据包括每位患者的不同角度照片以及他们是否有症状 A、B、 C,D。

现在,pytoch,我正在使用 MSELoss 并将我的测试错误计算为分类总数中正确分类的总数。我猜这太天真了,甚至不合适。

测试错误计算的示例如下: 假设我们有 2 位患者,他们每人有两张图像。然后将有 16 个总分类(1 表示患者 1 是否有照片 1 中的症状 A、B、C、D 等)。如果模型正确预测照片 1 中患者 1 表现出症状 A,那么这将使正确分类的总数增加 1。

【问题讨论】:

【参考方案1】:

我建议在多类多标签分类中使用binary-crossentropy。这对于多标签分类来说似乎违反直觉,但请记住,这里的目标是将每个输出标签视为一个独立的分布(或类)。

pytorch 中,您可以使用torch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduction='mean')。这将创建一个衡量目标和输出之间的二元交叉熵的标准。

【讨论】:

值得一提的是输出层应该有 sigmoid 激活。或者,不使用激活和 BCEWithLogitsLoss,它具有内置的 sigmoid,并且在数值上更稳定。 但是 OP 说它是多类的,所以我们不想要常规的交叉熵吗?不是二进制的。 @jchaykow OP 正试图按照二元类 A、B、C、D 对一名患者进行分类,这是一个具有 4 个预测的二元分类问题。

以上是关于我应该使用这种多类多标签(?)问题的哪种损失函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 Keras 中构建自定义损失函数

Python scikit 学习多类多标签性能指标?

用于不平衡多类多标签分类的神经网络

为多类多标签分类构建混淆矩阵

错误:分类指标无法处理多类多输出和多标签指标目标的混合

对于 tensorflow.keras.models.Sequential.predict 中的多类多标签问题,是不是可能只得到 0 和 1?