使用卷积神经网络作为二元分类器

Using Convolution Neural network as Binary classifiers

给定任何图像,我希望我的 classifier 判断它是否是向日葵。我该如何着手创建第二个 class ?保留所有可能图像的集合 - 第二个 class 中的 {Sunflower} 是一种矫枉过正。有这方面的研究吗?目前我的 classifier 在最后一层使用神经网络。我基于以下教程:

https://github.com/torch/tutorials/tree/master/2_supervised

我正在使用 254x254 作为输入拍摄图像。 SVM 对最后一层有帮助吗?我也愿意使用任何其他可能对我有帮助的classifier/features。

ML 中的标准方法是:

1) 构建模型 2) 尝试使用 positive\negative 个示例对一些数据进行训练(从训练集中 pos\neg 的 50 开始) 3) 在测试集上验证它(再次尝试在测试集中 pos\neg 个示例中的 50 个) 如果结果不好: a) 尝试不同的模型? b) 获取更多数据

对于案例 #b,在决定您需要哪些额外数据时,适合我的经验法则是: 1) 如果分类器给出很多误报(告诉它这是向日葵,而实际上它根本不是向日葵)——得到更多的负面例子 2) 如果分类器给出大量假阴性(告诉这不是向日葵,而实际上它是向日葵)- 获得更多正面示例

通常,从一些 合理数量的数据开始,检查结果,如果训练集或测试集的结果不好 - 获取更多数据。当您获得最佳结果时停止获取更多数据。

你需要考虑的另一件事是,如果你的当前数据和当前分类器的结果不好,你需要了解问题是否是高偏差(好吧,训练集和测试集的糟糕结果)或者如果这是一个高方差问题(训练集上的结果不错,但测试集上的结果不好)。如果你有高偏差问题——更多的数据或更强大的分类器肯定会有帮助。如果你有一个高方差问题 - 不需要更强大的分类器并且你需要考虑泛化 - 引入正则化,也许从你的 ANN 中删除几个层。对抗高方差的另一种可能方法是获取 多很多 的数据。

所以综上所述,您需要使用迭代的方法并尝试逐步增加数据量,直到获得良好的结果。没有魔术棒分类器,也没有关于应该使用多少数据的简单答案。

最好使用 CNN 作为特征提取器,剥离用于 classification 的原始全连接层并添加新的 classifier。这也称为迁移学习技术,已在深度学习研究社区中广泛使用。对于您的问题,使用 one-class SVM 作为添加的 classifier 是一个不错的选择。

具体来说,

  • 一个好的 CNN 特征提取器可以在大型数据集上训练,例如ImageNet,
  • 然后可以使用您的 'sunflower' 数据集训练一个 class SVM。

解决问题的关键部分是实施 one-class SVM,也称为异常检测或新颖性检测。您可以参考 http://scikit-learn.org/stable/modules/outlier_detection.html 了解有关该方法的一些见解。