我应该使用这种多类多标签(?)问题的哪种损失函数?
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 个预测的二元分类问题。以上是关于我应该使用这种多类多标签(?)问题的哪种损失函数?的主要内容,如果未能解决你的问题,请参考以下文章
对于 tensorflow.keras.models.Sequential.predict 中的多类多标签问题,是不是可能只得到 0 和 1?