如何在Matlab中训练模型,将其保存到磁盘,并加载C++程序?

And*_*ein 5 c++ matlab machine-learning libsvm

我使用libsvm版本3.16.我在Matlab做过一些训练,并创建了一个模型.现在我想将此模型保存到磁盘并在我的C++程序中加载此模型.到目前为止,我发现了以下替代方案:

  1. 这个答案解释了如何从C++中保存模型,这是基于这个网站.不完全是我需要的,但可以适应.(这需要开发时间).
  2. 我可以在Matlab中找到最好的训练参数(内核,C),并用C++重新训练一切.(每次更改参数时都需要使用C++进行培训.它不可扩展).

因此,这两种选择都不令人满意,

有没有人有想法?

use*_*913 1

选项1实际上是相当合理的。如果通过 matlab 将模型保存为 libsvm 的 C 格式,则可以使用 libsvm 提供的函数在 C/C++ 中直接使用模型。尝试在 C++ 中处理 matlab 格式的数据可能会困难得多。

main“svm-predict.c”(位于 libsvm 包的根目录)中的函数可能包含您需要的大部分内容:

if((model=svm_load_model(argv[i+1]))==0)
{
    fprintf(stderr,"can't open model file %s\n",argv[i+1]);
    exit(1);
}
Run Code Online (Sandbox Code Playgroud)

x例如,要使用模型预测标签,您可以运行

int predict_label = svm_predict(model,x);
Run Code Online (Sandbox Code Playgroud)

其中最棘手的部分是将数据传输为 libsvm 格式(除非您的数据采用 libsvm 文本文件格式,在这种情况下您可以只使用predict“svm-predict.c”中的函数)。

libsvm 向量是表示稀疏数据数组的x数组。struct svm_node每个 svm_node 都有一个索引和一个值,并且向量必须以设置为 -1 的索引终止。例如,要对向量 进行编码[0,1,0,5],您可以执行以下操作:

struct svm_node *x = (struct svm_node *) malloc(3*sizeof(struct svm_node));
x[0].index=2; //NOTE: libsvm indices start at 1
x[0].value=1.0;
x[1].index=4;
x[1].value=5.0;
x[2].index=-1;
Run Code Online (Sandbox Code Playgroud)

对于分类器 (C_SVC) 以外的 SVM 类型,请查看predict“svm-predict.c”中的函数。