我在处理过的实际问题中看到了一个反复出现的主题,问题看起来像“构建一个识别 A、B 和 C 类的图像分类器,但如果输入不是这些类,则不识别它”。这不时出现在其他问题中,特别是这里、这里和这里;但是,我很难找到一个通用的解决方案来解决这个似乎很常见的问题。
到目前为止,我看到的方法似乎大致分为两类:
- 将其视为不平衡的类别问题。数据集平衡、欠采样/过采样和类权重的常用技巧都适用于此。然而,“其他”类往往是广泛而多样的,本质上使 CNN 尝试对网络中“其他”的所有信息进行编码。虽然这对于某些问题“足够好”,但我看到它表现不佳,通常它看起来像是圆孔中的方形钉。
- 基于一类分类/异常值检测的方法。特别是,siamese 和triplet 网络的使用与尝试更清晰地分离图像特征向量的思路相似。我看到的大多数研究都倾向于关注图像相似性搜索或验证,而不是直接应用于多类+负类问题。然而,对比或三元组损失的概念将更严格定义的类与其他所有类分开似乎是一种更合理的方法。也许像训练特征向量然后使用一类SVM或类似的东西?
是否有针对这种情况的一般策略,例如微调 CNN 以进行正常分类?似乎存在一些与微调非常相似的通用解决方案以及特征向量层的某种对比损失,但我只是不知道。