我在使用Caffe框架进行CNN训练。我的目标是进行几个基本对象类别的简单对象识别。由于预训练网络不适用于我的预定用途,我准备了自己的训练和测试集,每个类别(比如椅子和汽车)大约有1000张图片。
结果相当不错。如果我展示一张未见过的椅子图片,它很可能被分类为椅子,同样的,汽车图片也是如此。我的问题是,当处理那些不显示这些类别的杂项图片时,往往会对随机一个类别显示出非常高的置信度(=1),这对于单边训练数据来说并不奇怪,但对我的应用来说是个问题。我考虑了一些不同的解决方案:
1) 添加第三个类别,大约1000个负面示例,这些示例显示除了椅子和汽车之外的任何对象。
2) 总体上增加更多的对象类别,只是为了让网络能够将其他对象分类为相应的类别,而不是椅子或汽车(当然这需要更多的努力)。也许更广泛的预测结果会在负面图像上显示出更均匀的分布,使得可以基于阈值来评估目标对象的存在?
因为从互联网上获取随机图像作为负面示例并不费时,我已经用大约1200个负面示例测试了我的第一个解决方案。这确实有所帮助,但问题依然存在,可能是因为示例数量太少?我的担忧是,如果我增加负面示例的数量,每个类别的示例数量不平衡会导致对原始类别的检测准确性下降。经过一些研究,我发现有一个人遇到了类似的问题,但没有解决方案:使用Caffe和负面图像的卷积神经网络
我的问题是:是否有人遇到过相同的问题,并且知道如何处理?您会推荐哪种方法,增加更多的负面示例还是更多的对象类别,或者您有其他建议吗?
回答:
这个问题不仅仅限于Caffe或卷积神经网络。任何机器学习技术都存在这种风险。最终,所有分类器都接受输入空间中的一个向量(通常是非常高维的),这意味着它们划分了那个输入空间。你提供了两个划分的例子,这有助于估计这两个划分之间的边界,但仅限于那个边界。两个划分都有非常非常大的边界,正是由于输入空间的高维度。
卷积神经网络确实试图通过使用相当小的卷积核来处理图像数据的高维性。现实的负面数据有助于训练这些卷积核,标签并不重要。你甚至可以在训练卷积核时使用输入图像作为目标(即作为自编码器进行训练)。
一般来说,你不希望将所有反例混为一谈的一个原因是因为它们可能过于多样化。如果你有一个类别A,其某个特征值在某个尺度上从[-1,+1]范围内,反例B在[-2,-1]范围内,反例C在[+1,+2]范围内,将B和C混合在一起会为反例创建一个[-2,+2]的范围,这个范围与实际范围重叠。给定足够的数据和足够强大的分类器,这并不是致命的,但例如SVM在这个问题上可能会表现得很差。