Supprt Vector Machine 在 matlab 中工作,在 c++ 中不起作用
Supprt Vector Machine works in matlab, doesn't work in c++
我正在编写一个应用程序,它使用SVM对一些图像(特别是这些图像)进行分类。我的Matlab实现非常好。使用SIFT单词袋方法,我能够用线性内核获得接近100%的准确率。
出于速度/可移植性的原因,我需要在C++中实现这一点,因此我尝试使用libsvm和dlib。我尝试了多种SVM类型(c_SVM、nu_SVM、one_class)和多个内核(线性、多项式、rbf)。我所能达到的最好成绩是50%左右的准确率,即使是在我训练过的相同样本上也是如此。我已经确认我的特征生成器正在工作,因为当我将c++生成的特征导出到Matlab并进行训练时,我能够再次获得近乎完美的结果。
Matlab的SVM实现有什么神奇之处吗?是否有任何常见的陷阱或领域可以解释我所看到的行为?我知道这有点模糊,但问题的一部分是我不知道该去哪里。如果我能提供其他有用的信息,请在评论中告诉我。
除了在Matlab中运行之外,Matlab版本的库没有什么神奇之处,这会让你更难开枪。
检查清单:
- 是否对数据进行标准化,使所有值都在0和1之间(或在-1和1之间),线性或使用平均值和标准偏差
- 你是在参数搜索中寻找一个好的C值吗RBF核的情况)?进行交叉验证还是在搁置集上
- 你确定你在处理NaN和所有其他浮点肮脏?Matlab非常善于向你隐藏这一点,C++则不然很多
- 可能是你加载数据不正确,读取了将"%s"转换为双精度或其他会给您的输入添加噪声的东西数据
- 可能是libsvm/dlib期望数据按行主顺序排列你是在专栏专业(或者反过来)发的?再次,Matlab使这几乎是不可能的,C++没有那么多
- 32-64位肮脏的一个版本的库,可执行编译和另一个
其他一些东西:
- 可能是在Matlab中以某种方式将类(y)泄漏到预处理?没有人故意这么做,但我亲眼目睹了这种情况的发生。如果你把几乎任何一个f(y)作为一个特征,你会得到几乎100%每次
- 有时,验证一切都是数字的会有所帮助在C++和Matlab
我对使用rbf内核的libsvm非常满意。carlosdc按照正确的顺序指出了最常见的错误:-)。对于libsvm,您使用了libsvm附带的python工具吗?如果不是,我建议这样做。将特征向量写入一个文件(来自matlab和/或c++),并使用easy.py对rbf内核进行元训练。您可以获得生成模型的参数和预测。如果这个预测是可以的,那么继续使用c++。通过训练,您还可以获得一个缩放的特征文件(每个特征的min/max转换为-1.0/1.0)。将它们与您的c++实现进行比较。
一些libsvm问题:一个讨厌的习惯是(如果我没记错的话)在缩放文件中忽略缩放到0(零)的值。在grid.py中有一个参数"nr_local_worker",它定义了线程数。你可能希望增加它。
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- 我正在开发服务器,ip作为参数传递不起作用