TensorFlow JS单类KNN分类器如何获取准确率及实现有效分类
单类别图像分类(区分已知/未知)的实现方案
针对你用TensorFlow JS KNN分类器单类别训练时置信度恒为1的问题,这里提供几个实用解决思路:
1. 补充"未知类"负样本,适配KNN多类逻辑
KNN的置信度计算依赖多类样本的对比,单类别场景下无法区分匹配度差异。你可以:
- 收集一批不属于目标类的图像(比如随机风景、其他物体),标记为"unknown"类别;
- 训练时同时喂入目标类(如"target")和"unknown"类的样本;
- 推理时,若"target"类的置信度远高于"unknown"(比如差值超过0.6,或"target"置信度>0.8),则判定为已知类,否则归为未知。
2. 基于特征相似度阈值做判断(绕开KNN多类限制)
直接用预训练模型提取图像特征,通过对比特征相似度来区分已知/未知:
- 用
mobilenet.load()加载预训练特征提取模型,去掉顶层分类层; - 训练阶段:提取所有目标类样本的特征,计算平均特征向量;
- 推理阶段:提取输入图像的特征,和平均特征计算余弦相似度(或欧氏距离):
// 计算余弦相似度 function cosineSimilarity(vecA, vecB) { const dot = tf.sum(tf.multiply(vecA, vecB)); const normA = tf.norm(vecA); const normB = tf.norm(vecB); return dot.div(normA.multiply(normB)).dataSync()[0]; } - 设定阈值(如相似度>0.75),超过则判定为已知类,否则为未知。
3. 自定义KNN的置信度计算逻辑
如果一定要用KNN分类器,修改其输出逻辑,基于目标类的匹配准确率判断:
- 训练时仍用单类别,但推理时,获取输入样本与KNN中所有目标类训练样本的相似度;
- 计算这些相似度的平均值,或统计相似度超过某阈值的样本占比;
- 用这个统计值作为"匹配准确率",而非KNN默认的单类置信度,再设定阈值区分已知/未知。
内容的提问来源于stack exchange,提问作者engageub
相关产品推荐
相关产品推荐

