使用卷积神经网络作为二元分类器
Posted
技术标签:
【中文标题】使用卷积神经网络作为二元分类器【英文标题】:Using Convolution Neural network as Binary classifiers 【发布时间】:2015-09-06 21:33:13 【问题描述】:给定任何图像,我希望我的分类器判断它是否是向日葵。我怎样才能开始创建第二类?保留所有可能图像的集合 - 第二类中的 向日葵 是一种矫枉过正。有没有这方面的研究?目前我的分类器在最后一层使用神经网络。我基于以下教程:
https://github.com/torch/tutorials/tree/master/2_supervised
我正在拍摄以 254x254 为输入的图像。 SVM 对最后一层有帮助吗?我也愿意使用任何其他可能对我有帮助的分类器/功能。
【问题讨论】:
您应该使用的“反例”取决于您将让分类器看到的数据类型。如果只是其他花,请使用其余的花。如果是植物,你也需要这个领域的例子。 我想涵盖整个域。在这种情况下,我应该如何采样我的负面例子?那么,在这种情况下,来自 image-net 数据库中的每个同义词集的单个图像就足够了吗? 【参考方案1】:ML 中的标准方法是:
1) 构建模型 2) 尝试用正例\负例训练一些数据(从训练集中的 50\50 个 pos\neg 开始) 3) 在测试集上验证它(再次,在测试集中尝试 50\50 个 pos\neg 示例) 如果结果不好: a) 尝试不同的模型? b) 获取更多数据
对于案例#b,在决定您需要哪些额外数据时,对我很有效的经验法则是: 1)如果分类器给出了很多误报(告诉这是向日葵,而实际上它根本不是向日葵) - 得到更多的负面例子 2)如果分类器给出了很多假阴性(告诉这不是向日葵,而实际上它是向日葵) - 获得更多的正面例子
通常,从一些合理数量的数据开始,检查结果,如果训练集或测试集的结果不好 - 获取更多数据。当您获得最佳结果时,停止获取更多数据。
您需要考虑的另一件事是,如果您的当前数据和当前分类器的结果不好,您需要了解问题是高偏差(好吧,训练集和测试集的结果不佳)还是高方差问题(在训练集上的结果很好,但在测试集上的结果很差)。如果您有高偏差问题 - 更多数据或更强大的分类器肯定会有所帮助。如果你有一个高方差问题 - 不需要更强大的分类器并且你需要处理泛化 - 引入正则化,也许从你的 ANN 中删除几层。对抗高方差的另一种可能方法是获取更多、更多更多数据。
所以总结一下,你需要使用迭代的方法,并尝试逐步增加数据量,直到你得到好的结果。没有魔术棒分类器,也没有关于您应该使用多少数据的简单答案。
【讨论】:
我对拥有一个类分类器更感兴趣,这样就完全不需要对负样本进行采样了。我应该怎么做呢? 对不起,我不明白你的问题。要训练一个好的二元分类器(它只返回 1 表示正例,返回 0 表示负例——向日葵\不是向日葵),您必须提供正例和负例的例子。并且您应该尝试尽可能地涵盖您的问题域以获得最佳结果 我的意思是,我假设您不想完全采样问题域,但您需要“以某种方式”对其进行采样。在不对问题域的负样本进行抽样的情况下制作一个好的分类器是不可能的。【参考方案2】:最好使用 CNN 作为特征提取器,剥离原来用于分类的全连接层并添加一个新的分类器。这也被称为在深度学习研究社区中广泛使用的迁移学习技术。对于您的问题,使用一类 SVM 作为添加的分类器是一个不错的选择。
具体来说,
可以在大型数据集上训练一个好的 CNN 特征提取器,例如图像网, 然后可以使用您的“向日葵”数据集训练一类 SVM。解决问题的关键部分是实现一类 SVM,也称为异常检测或新奇检测。您可以参考http://scikit-learn.org/stable/modules/outlier_detection.html 了解有关该方法的一些见解。
【讨论】:
以上是关于使用卷积神经网络作为二元分类器的主要内容,如果未能解决你的问题,请参考以下文章