LibSVM 在大特征向量上失败 (SEGFAULT)

Posted

技术标签:

【中文标题】LibSVM 在大特征向量上失败 (SEGFAULT)【英文标题】:LibSVM fails (SEGFAULT) on large feature vector 【发布时间】:2016-01-16 12:25:17 【问题描述】:

我正在为使用 LibSVM 的 android 构建一个 NDK 应用程序。我在 XCode(C++)中为我的 mac 构建了一个等价物

我发现 Mac 可以处理我给它的非常大的特征向量,速度和准确度很高(~16800 个特征),用于训练和分类

在 Android 上(非常相似的代码)我可以成功地训练/学习 150 个功能,但是当我尝试我的全部 16800 个功能时会出现以下段错误(即使它在 Mac 上运行良好)。只有分类(svm_predict 虽然。训练总是很好。

你可以看到它在 LibSVM 使用的“点”函数上失败了

0-16 23:28:41.084 30997-31028/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xaf000000 in tid 31028 (GLThread 17147)
10-16 23:28:41.190 27393-27393/? I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
10-16 23:28:41.191 27393-27393/? I/DEBUG: Build fingerprint: 'google/hammerhead/hammerhead:5.1.1/LMY48M/2167285:user/release-keys'
10-16 23:28:41.191 27393-27393/? I/DEBUG: Revision: '11'
10-16 23:28:41.191 27393-27393/? I/DEBUG: ABI: 'arm'
10-16 23:28:41.191 27393-27393/? I/DEBUG: pid: 30997, tid: 31028, name: GLThread 17147  >>> cc.openframeworks.androidEmptyExample <<<
10-16 23:28:41.191 27393-27393/? I/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xaf000000
10-16 23:28:41.202 27393-27393/? I/DEBUG:     r0 aef3e000  r1 aef5ed10  r2 00000001  r3 af000000
10-16 23:28:41.202 27393-27393/? I/DEBUG:     r4 aec29eb8  r5 00000001  r6 b4b2c608  r7 12d090c0
10-16 23:28:41.202 27393-27393/? I/DEBUG:     r8 12d15660  r9 b4a39400  sl 00000000  fp af37d824
10-16 23:28:41.202 27393-27393/? I/DEBUG:     ip b6e417dc  sp af37d810  lr a301ff78  pc a301ff04  cpsr 000f0010
10-16 23:28:41.202 27393-27393/? I/DEBUG:     #00 pc 00167f04  /data/app/cc.openframeworks.androidEmptyExample-1/lib/arm/libOFAndroidApp.so (Kernel::dot(svm_node const*, svm_node const*)+192)

关于这里发生了什么的任何想法?

我正在使用以下参数:

  mSvm.setSvmType(C_SVC);
  mSvm.setKernelType(LINEAR);
  mSvm.setCost(1);
  mSvm.setGamma(1/16800);
  mSvm.setCoef0(0);
  mSvm.setCachesize(40);
  mSvm.setEpsilon(0.001);
  mSvm.setShrinking(false);

  mSvm.setDegree(1);
  mSvm.setNu(0.5);

【问题讨论】:

你能用g标志编译并在valgrind下运行吗?这将帮助您发现内存泄漏和无效指针。 【参考方案1】:

根据以下行,您似乎从 LIBSVM 的点积操作中得到了错误:

10-16 23:28:41.202 27393-27393/? I/DEBUG: #00 pc 00167f04 /data/app/cc.openframeworks.androidEmptyExample-1/lib/arm/libOFAndroidApp.so (Kernel::dot(svm_node const*, svm_node const*)+192)

这个程序经常被大量用户疯狂测试,所以我怀疑错误是否存在。

您是否 100% 确定您的指针是有效的?您是否有可能碰巧在 mac 版本上遇到未定义的行为?我的意思是,您提供的指针是否有可能在所有平台上始终无效,但恰好在 mac 版本上仍然有效?当您在多个平台上工作时,这种给人正常工作错觉的错误并不少见。

【讨论】:

如果有帮助,这里是来源:github.com/arnaudsj/libsvm/blob/master/svm.cpp#L293. 指针可能无效——我正在使用多个线程在后台进行学习,同时进行可视化。我正在使用这个库与我的代码进行交互:github.com/TatsuyaOGth/ofxSvm 我可以成功地使用addData()train(),但似乎predict(vector&lt;double&gt;) 中的mModelnode 正在抛弃点积。我怀疑我的模型 var 正在以某种方式被处理掉——如果有任何明显的错误/可能的冲突,查看上面的包装有什么想法吗?【参考方案2】:

我在 'dot' 函数中遇到了类似的问题,我通过不将 '0' 作为 svm_nodes 的值来解决。该函数需要一个索引“-1”和一个值“0”来标记 svm_nodes(训练向量)列表的结尾。

肯定对你来说有点晚了,但希望它能帮助未来的 libsvm 用户:)

【讨论】:

以上是关于LibSVM 在大特征向量上失败 (SEGFAULT)的主要内容,如果未能解决你的问题,请参考以下文章

使用 libsvm 进行情绪分类

java中使用LibSVM的一个例子

如果我的权重向量本质上是二进制的,是不是需要在 SVM 中缩放数据?

R中的支持向量机特征选择示例

libsvm liblinear 如何使用直方图交集/卡方内核

OpenCV + HOG +SVM:SVM 单特征向量需要帮助