如何从scikits中提取信息.学习分类器,然后在C代码中使用



我已经使用scikits训练了一堆RBF svm。在Python中学习,然后pickle结果。这些是用于图像处理任务的,我想做的一件事是在一些测试图像的每个像素上运行每个分类器。也就是说,从以像素(i,j)为中心的窗口中提取特征向量,在该特征向量上运行每个分类器,然后移动到下一个像素并重复。这对于Python来说太慢了。

澄清:当我说"这太慢了…"我的意思是,即使是Libsvm的底层代码。学用太慢。我实际上是在为GPU编写一个手动决策函数,这样每个像素的分类都是并行进行的。

我是否可以用Pickle加载分类器,然后抓取描述如何从特征向量计算决策的某种属性,然后将该信息传递给我自己的C代码?在线性支持向量机的情况下,我可以提取权向量和偏置向量并将它们作为输入添加到C函数中。但是对于RBF分类器,等价的事情是什么,我如何从scikit中获得信息。学习对象?

添加:第一次尝试解决方案。

看起来分类器对象具有属性support_vectors_,它包含支持向量作为数组的每一行。还有属性dual_coef_,它是一个1 × len(support_vectors_)的系数数组。从非线性支持向量机的标准教程来看,似乎应该这样做:

  • 从被测数据点计算特征向量v。这将是一个与support_vectors_的行长度相同的向量。
  • 对于support_vectors_中的每一行i,计算该支持向量与v之间的欧几里德距离d[i]的平方。
  • 计算t[i]gamma * exp{-d[i]},其中gamma为RBF参数
  • dual_coef_[i] * t[i]与所有i相加。添加scikits的intercept_属性值。学习分类器到这个和。
  • 如果和为正,则分类为1。否则归类为0。

添加:在这个文档链接的编号第9页,它提到分类器的intercept_属性确实包含偏差项。我已经更新了上面的步骤来反映这一点。

是的,你的解决方案看起来不错。要将numpy数组的原始内存直接传递给C程序,您可以使用numpy中的ctypes帮助程序,或者使用cython包装C程序,并通过传递numpy数组直接调用它(有关详细信息,请参阅http://cython.org的文档)。

然而,我不确定在GPU上加速预测是最简单的方法:众所周知,内核支持向量机在预测时速度很慢,因为它们的复杂性直接取决于支持向量的数量,对于高度非线性(多模态)问题,支持向量的数量可能很高。

在预测时更快的替代方法包括神经网络(可能比只有2个超参数C和gamma的支持向量机更复杂或更慢)或使用基于到原型的距离的非线性变换来转换数据+阈值+图像区域的最大池化(仅用于图像分类)。

  • 对于第一种方法,你可以在深度学习教程

  • 中找到很好的文档
  • 第二次阅读Adam Coates最近的论文,看看这个页面关于kmeans特征提取

最后,您还可以尝试使用NuSVC模型,其正则化参数nu对拟合模型中的支持向量数量有直接影响:更少的支持向量意味着更快的预测时间(尽管检查准确性,最终将在预测速度和准确性之间进行权衡)。

相关内容

最新更新