MATLAB是美国MathWorks公司出品的商业数学软件,为算法开发、数据可视化、数据分析以及数值计算等提供了高级计算语言和交互式环境。随着人工智能的崛起,MATLAB也添加了自己的机器学习工具包,只需要很少的代码或命令就能完成模型训练和测试的过程,训练好的模型也能方便的导出,供VC等调用。本文主要介绍模型训练、导出和调用的整个过程。
软件版本:
VC2015,matlab2018a
1,数据准备。
随机生成一组训练数据,格式如下:
x,y,label
x,y为坐标,label为标签
我生成的数据总量为3000,格式如下:
前1500:x>0, y>0, label=1 x,y落在坐标系的第一象限
后500 :x<0, y>0, label=0 x,y落在坐标系的第二象限
后500 :x<0, y<0, label=0 x,y落在坐标系的第三象限
后500 :x>0, y<0, label=0 x,y落在坐标系的第四象限
数据存为csv格式,如下图所示:
2,模型训练
(1)打开matlab,将工作目录设置在cvs文件所在目录,点开APPS选项卡,点击Classification Learner
(2)点击菜单:New Session,选择From File
(3)选择我们生成的训练数据文件后,matlab显示出了文件内容,点击Insert Selection导入文件
(4)数据设置,前两列为训练数据,第三列为标签,点击Start Session
数据导入后,分类器显示数据点的分布情况,可以看到:标签为1的样本显示为红色,分布在第一象限;标签为0的样本显示为蓝色,分布在二三四象限。
(5)开始训练,此时分类器默认选择的模型为Fine Tree,我们可以直接使用这个模型进行训练,也可以选择ALL,让所有的模型都进行训练,从而根据训练结果选择最好的模型,这里我们直接点击Train进行训练。训练完成后显示Fine Tree模型对于当前样本的识别率为100%(matlab将导入的样本分为两份,一份训练,一份测试,100%是对测试样本集测试后得出的结果)。
3,模型导出及使用
选择训练好的Fine Tree模型,点击Export Model,选择Export compact model,导出训练好的模型
模型导出后,在matlab的变量列表里,出现了导出的模型:Trained model
双击Trained model,可以看到模型的内部结构
使用命令,将模型里的分类器导出为mat文件:
saveCompactModel(trainedModel.ClassificationTree, 'ClassificationTree')
命令执行成功后,工作目录出现ClassificationTree.mat文件
此mat文件无法被VC直接使用,可以在matlab里封装一个函数,函数里使用此分类器进行分类,然后将此函数导出C/C++代码或dll供VC使用。
function label = treemodel(input)
model = loadCompactModel('ClassificationTree.mat');
label = predict(model,input);
end
在matlab命令行里输入coder,打开代码转换工具,将封装的matlab函数导出为C/C++代码
点击...选择刚才封装好的.m文件, 点击下一步,进入输入参数定义界面
点击let me enter input or global types directly,定义输入参数:
输入类型为double类型的x,y坐标,所以选择double,类型为1*2(选择1xn,n的位置输入2)
选择下一步,点击Generate生成代码
生成成功后,matlab工作目录出现codegen文件夹,里边是生成的文件
将图中所有的.c和.h文件导入VC工程(.c文件去掉预编译头选项),然后打开examples文件夹,查看示例文件main.h和main.c,仿照其示例调用分类函数进行分类测试(注意:头文件包含使用extern "C"方式)
最后一步,输入任意数据进行测试
至此,所有流程全部完成。