对于一个只有A和B的的训练集,采用什么演算法训练模型,即让它能判断出A和B,也能判断出不是A和B的图片?
训练数据有大概五六千张图像,每个图像中只有一个图像,要么是A类形状,要么是B类图像,其实训练一个二元分类模型,在测试集中判断出A类还是B类不是很难,就是既要判断出A类,也要判断出B类,还要判断出不是A类也不是B类的图片。这个应该是异常检测,请问各位大神有什么好的方法解决这个问题?或者对于这个问题有什么思路能指点一下我,先说声谢谢了
补充:这里只有A类和B类样本的数据,没有第三类的数据,但是要判断出不是A类,也不是B类的图片,
相当于检测out of distribution的数据,你可以参考uncertainty measure的方法,去年nips专门有专题解决uncertainty measure的问题。
A Baseline for Detecting Misclassified and Out-of-Distribution Examples in Neural Networks?arxiv.org以及:
NeurIPS 2019 Schedule?nips.cc你的意思难道不是一个三分类吗?
单纯通过输出的概率大小部分可行,但概率阈值是不太好定的。
建议采用基于卷积的自编码试试看。
可以用生成模型去做。
P(x)=aP1(x)+bP2(x)
假设A中的数据由P1(x)生成,B中的数据由P2(x)生成,a和b为混合系数,a+b=1,a &> 0,b &> 0。
最大化训练集由P(x)生成的对数概率log P(x)。
在推断时,设置一个阈值,当P(x)小于阈值时,认为不属于A,B两类。否则比较P1(x)和P2(x)的大小来确定属于A还是B。
搞一个CGAN生成器
将AB两个域图像作为输入映射到自己定义的响应模式上
(譬如学习的目标是一张单通道图像,A左侧响应1,右侧全0,反之反之)
根据生成的小图左右像素比判断AB类别
训练好后如果遇到与AB分布差异大图像,输出的图像分布模式会有很大差异。
根据观察写个函数判断为其它类即可。
「不是某分类」也是一个概念来的,你不教它,它怎么知道。人为扩展一些图片吧,用triplet loss 训练。可以参考一下FaceNet的方法。
给图片加噪音,做三分类吧,人为修改图片扩充数据集。
做三分类,由于没有负样本,为了提高泛化能力,可以使用对抗生成网路,随机自动生成新的样本
个人觉得想办法生成第三类数据比较实用,没必要增加自己的实践难度。如果是想发paper就当我没说
谢邀。
这是个好问题。题主应该是想只用现有的A、B两类,实现类似编程的if-else if-else的判断流程。
这是个很直接的想法,很好,很程序员。
我也曾有类似的想法,后来我发现,模型训练的本质是拟合,目前只能根据特征进行,不存在的数据,也就是本该写入的else这部分,模型是没法学习的。
建议的方法:
随机收集真实环境的其它一些图片作为第三个类C加入数据集,也就等同于是让模型进行A、B、C的三分类训练。目前都是用这种方法来解决else的问题。
或许未来会有更好的方法吧。
举个栗子,当预测为A的概率为0.9则判断为A,B亦同,如果预测A B的概率都较低(<0.5自定义)就判断为不是A B
推荐阅读: