预测阶段如何处理训练集未包含的标签?以人脸识别任务为例
解决未知类别人脸分类的实用方案
这个问题在现实场景的分类任务里太常见了——毕竟训练集不可能覆盖所有可能的情况!下面分享几个落地性强的方案,帮你的模型学会识别“陌生面孔”:
1. 基于置信度阈值过滤
这是最直接的思路:模型对已知类别的预测通常会有较高的置信度,而对未知类别的置信度会明显偏低。
- 操作步骤:训练完5类分类器后,测试时获取模型
softmax输出的最大概率值(也就是置信度)。 - 判断规则:提前设定一个合理阈值(比如0.7,具体需要用含未知样本的验证集调优),如果最大置信度低于阈值,就判定为“未知”;反之则归为对应类别。
- 注意:阈值不能设得太高或太低——太高会把部分已知类样本误判为未知,太低则起不到过滤作用。
2. 把“未知”当作一类来训练(开放集分类)
直接让模型主动学习区分已知类和未知类:
- 准备未知类样本:收集训练集之外的其他人脸数据,或者用GAN等生成模型合成不属于5类的人脸样本。
- 调整训练流程:把这些样本标记为“未知”类别,和原有的5类数据一起训练分类器。这样模型在测试时就能直接输出“未知”这个类别。
- 小技巧:如果未知样本数量不足,可以用半监督学习或对比学习的思路——让模型先学习已知类的特征分布,再把偏离这个分布的样本归为未知。
3. 基于特征距离的检测
利用人脸特征的相似度来判断样本是否属于已知类:
- 训练阶段:为每个已知类别计算特征中心(比如该类所有样本特征的平均值)并存储。
- 测试阶段:提取待检测人脸的特征,计算它和每个已知类特征中心的距离(常用余弦距离、欧氏距离)。
- 判断规则:如果最小距离超过设定阈值,说明该样本特征不在任何已知类的分布范围内,判定为“未知”;否则归为距离最近的类别。
4. 专门的开放集分类算法
如果基础方法满足不了精度要求,可以试试针对开放集问题优化的算法:
- 比如OpenMax:它是Softmax的扩展,能把未知类的概率分配到一个额外的“未知”类别中,通过统计已知类的特征分布来动态调整概率输出。
- 或者CosFace/ArcFace的开放集变种:这类人脸特征提取模型本身就擅长刻画人脸特征的相似度,结合距离阈值能很好地识别陌生人脸。
最后小提醒
不管用哪种方法,一定要用包含未知样本的测试集来验证效果——确保模型在准确识别已知人脸的同时,不会把陌生人硬塞进已有的5类里。
内容的提问来源于stack exchange,提问作者JTCrafter




