1

我正在编写一个使用 SVM 对某些图像(特别是这些图像)进行分类的应用程序。我的 Matlab 实现效果很好。使用 SIFT bag-of-words 方法,我能够通过线性内核获得接近 100% 的准确度。

出于速度/可移植性的原因,我需要在 C++ 中实现这一点,因此我尝试同时使用libsvmdlib。我尝试了多种 SVM 类型(c_svm、nu_svm、one_class)和多个内核(线性、多项式、rbf)。我能够达到的最好结果是大约 50% 的准确率——即使在我训练过的相同样本上也是如此。我已经确认我的特征生成器正在工作,因为当我将 c++ 生成的特征导出到 Matlab 并对其进行训练时,我能够再次获得近乎完美的结果。

Matlab 的 SVM 实现有什么神奇之处吗?是否有任何我可能会研究的常见陷阱或领域来解释我所看到的行为?我知道这有点含糊,但部分问题是我不知道该去哪里。如果我可以提供其他有用的信息,请在评论中告诉我。

4

2 回答 2

5

Matlab 版本的库并没有什么神奇之处,只是它在 Matlab 中运行,这使得自己更难自食其果。

检查清单:

  1. 您是否正在标准化您的数据,使所有值都位于 0 和 1 之间(或 -1 和 1 之间),无论是线性还是使用平均值和标准偏差?
  2. 您是否在参数搜索一个好的 C 值(或在 RBF 内核的情况下为 C 和 gamma)?进行交叉验证或保留集?
  3. 您确定您正在处理 NaN 和所有其他浮点问题吗?Matlab 非常擅长向您隐藏这一点,C++ 则不然。
  4. 可能是您错误地加载了数据,将“%s”读入了双精度数,还是向输入数据添加了噪音?
  5. 可能是 libsvm/dlib 期望数据以行主要顺序排列,而您将其发送到主要列(或相反)?再次,Matlab 使这几乎是不可能的,而 C++ 则不然。
  6. 32-64 位肮脏的库的一个版本,与另一个编译的可执行文件?

其他一些事情:

  1. 可能是在 Matlab 中你以某种方式将类 (y) 泄漏到预处理中吗?没有人故意这样做,但我已经看到它发生了。如果您将几乎任何 f(y) 设为功能,那么您每次都会获得几乎 100% 的收益。
  2. 有时,在使用 C++ 和 Matlab 进行训练之前,通过打印到文件来帮助验证所有内容在数值上是否相同。
于 2012-12-02T14:56:22.237 回答
1

我对使用 rbf 内核的 libsvm 非常满意。carlosdc 以正确的顺序指出了最常见的错误 :-)。对于 libsvm - 你是否使用了 libsvm 附带的 python 工具?如果不是,我建议这样做。将特征向量写入文件(来自 matlab 和/或 c++),并使用 easy.py 对 rbf 内核进行元训练。您将获得生成模型的参数和预测。如果这个预测没问题,请继续使用 c++。通过训练,您还可以获得一个缩放的特征文件(每个特征的最小/最大转换为 -1.0/1.0)。也将这些与您的 c++ 实现进行比较。

一些 libsvm 问题:一个讨厌的习惯是(如果我没记错的话)缩放文件中忽略缩放到 0(零)的值。在 grid.py 中是一个参数“nr_local_worker”,它定义了线程的数量。您可能希望增加它。

于 2012-12-02T15:51:20.093 回答