主要内容

saveLearnerForCoder

将模型对象保存到文件中以供代码生成

描述

为机器学习模型的目标函数生成C/C++代码(包括预测,随机的,knnsearch,rangesearch,增量学习函数),使用saveLearnerForCoder,loadLearnerForCoder,codegen(MATLAB编码器).训练机器学习模型后,使用saveLearnerForCoder.定义一个入口点函数,通过使用loadLearnerForCoder并调用一个对象函数。然后使用codegen或者MATLAB®编码员™用于生成C/C++代码的应用程序。生成C/C++代码需要MATLAB编码器

该流程图展示了机器学习模型对象函数的代码生成流程。使用saveLearnerForCoder对于突出显示的步骤。

一个机器学习模型的目标函数的代码生成工作流。第一步:训练模特。步骤2(突出显示):保存模型。步骤3:定义一个入口点函数。步骤4:生成代码。步骤5:验证生成的代码。

定点C/ c++代码生成需要一个额外的步骤,定义预测所需变量的定点数据类型。通过使用生成的数据类型函数创建定点数据类型结构generateLearnerDataTypeFcn,并将该结构用作的输入参数loadLearnerForCoder在入口点函数中。生成定点C/C++代码需要MATLAB编码器和定点设计器™.

此流程图显示了的定点代码生成工作流预测机器学习模型的功能。使用saveLearnerForCoder对于突出显示的步骤。

定点代码生成工作流。第一步:训练模特。步骤2(突出显示):保存模型。步骤3:定义定点数据类型。步骤4:定义一个入口点函数。步骤5(可选):优化定点数据类型。步骤6:生成代码。步骤7:验证生成的代码。

实例

saveLearnerForCoder(Mdl,文件名)准备分类模型、回归模型或最近邻搜索器(Mdl)用于代码生成,并将其保存在名为文件名.你可以通过文件名loadLearnerForCoder从中重建模型对象的步骤文件名文件。

例子

全部崩溃

训练机器学习模型后,使用saveLearnerForCoder.定义一个入口点函数,通过使用loadLearnerForCoder打电话给预测训练模型的函数。然后使用codegen(MATLAB编码器)生成C/ c++代码。

这个例子简要解释了在命令行预测机器学习模型的代码生成工作流。有关详细信息,请参见基于命令行的机器学习模型预测代码生成.你也可以使用MATLAB Coder应用程序生成代码基于MATLAB编码器的机器学习模型预测代码生成获取详细信息。要了解使用最近邻居搜索器模型查找最近邻居的代码生成,请参见最近邻搜索器的代码生成

火车模型

加载Fisher虹膜数据集。删除所有观察到的setosa虹膜数据,以便XY仅包含两个类的数据。

负载鱼腥草inds=~strcmp(物种,“塞托萨”);X =量(第1:);Y =物种(第1);

使用处理后的数据金宝app集训练支持向量机(SVM)分类模型。

Mdl = fitcsvm (X, Y);

Mdl是一个ClassificationSVM模型。

保存模型

将SVM分类模型保存到文件中SVMIris.mat利用saveLearnerForCoder

saveLearnerForCoder(Mdl,“SVMIris”);

定义入口点函数

定义一个名为分类虹膜这样做的目的如下:

  • 接受鸢尾花的测量与相应的列,并返回预测的标签。

  • 加载一个训练好的SVM分类模型。

  • 使用虹膜花测量的加载分类模型预测标签。

类型分类虹膜%显示classifyIris.m文件的内容
function label=classifyIris(X)%#codegen%classifyIris使用SVM模型对虹膜物种进行分类%classifyIris使用文件SVMIris.mat中的SVM%模型对X中的虹膜花测量值进行分类,然后在label.Mdl=loadLearnerForCoder('SVMIris');label=predict(Mdl,X);end

添加% # codegen编译器指令(或pragma)到函数签名后的入口点函数,以指示您打算为MATLAB算法生成代码。添加此指令将指示MATLAB代码分析器帮助您诊断和修复在代码生成期间可能导致错误的违规。

注意:如果您点击位于此示例右上角部分的按钮,并在MATLAB®中打开此示例,则MATLAB®将打开示例文件夹。这个文件夹包括入口点函数文件。

生成代码

使用为入口点函数生成代码codegen(MATLAB编码器)因为C和C++是静态类型的语言,所以必须在编译时确定入口点函数中所有变量的属性。X作为-args选项指定生成的代码必须接受与训练数据具有相同数据类型和数组大小的输入X.如果在编译时观察值的数量未知,还可以使用coder.typeof(MATLAB编码器)。有关详情,请参阅指定用于代码生成的可变大小参数指定入口点函数输入的属性(MATLAB编码器)

codegen分类虹膜-args{X}
代码生成成功。

codegen生成MEX函数分类虹膜与平台相关的扩展。

验证生成的代码

比较使用预测,分类虹膜,分类虹膜

label1 =预测(Mdl X);label2 = classifyIris (X);label3 = classifyIris_mex (X);verify_label = isequal (label1 label2 label3)
验证\u标签=必然的1.

等质量返回逻辑1(true),这意味着所有输入都相等。三种方式分类的标签相同。

训练机器学习模型后,使用saveLearnerForCoder.对于定点代码生成,使用生成的数据类型函数指定预测所需变量的定点数据类型generateLearnerDataTypeFcn。然后,定义一个入口点函数,该函数通过使用loadLearnerForCoder和指定的定点数据类型,并调用预测模型的功能。使用codegen(MATLAB编码器)为入口点函数生成定点C/C++代码,然后验证生成的代码。

在生成代码之前使用codegen,你可以使用buildInstrumentedMex(定点设计器)showInstrumentationResults(定点设计器)优化定点数据类型以提高定点代码的性能。使用buildInstrumentedMex.使用showInstrumentationResults;然后,根据结果调优变量的定点数据类型属性。关于此可选步骤的详细信息请参见支持向量机预测的定点代码生成

火车模型

加载电离层数据集和训练二元SVM分类模型。

负载电离层Mdl = fitcsvm (X, Y,“KernelFunction”,“高斯”);

Mdl是一个ClassificationSVM模型。

保存模型

将SVM分类模型保存到文件中myMdl.mat利用saveLearnerForCoder

saveLearnerForCoder(Mdl,“myMdl”);

定义定点数据类型

使用generateLearnerDataTypeFcn生成定义SVM模型预测所需变量的定点数据类型的函数。

generateLearnerDataTypeFcn (“myMdl”, X)

generateLearnerDataTypeFcn生成myMdl_数据类型函数。

创建一个结构T通过使用定义定点数据类型myMdl_数据类型

T=myMdl_数据类型(“固定的”)
T=带字段的结构:XDataType: [0 x0嵌入。fi] ScoreDataType: [0x0 embedded.fi] InnerProductDataType: [0x0 embedded.fi]

结构T包括运行所需的命名变量和内部变量的字段预测函数。每个字段包含一个定点对象,由fi(定点设计器)。定点对象指定定点数据类型属性,例如字长和分数长度。例如,显示预测器数据的定点数据类型属性。

T.XDataType
ans=[]数据类型模式:固定点:二进制点缩放符号性:符号字长:16分形长度:14舍入方法:楼层溢出操作:换行ProductMode:FullPrecision MaxProductWordLength:128总和模式:FullPrecision MaxSumWordLength:128

定义入口点函数

定义一个名为myFixedPointPredict这样做的目的如下:

  • 接受预测数据X和定点数据类型结构T

  • 使用这两种方法加载经过训练的SVM分类模型的定点版本loadLearnerForCoder和结构T

  • 使用加载的模型预测标签和分数。

类型myFixedPointPredict.m%显示myFixedPointPredict.m文件的内容
function [label,score] = myFixedPointPredict(X,T) %#codegen Mdl = loadLearnerForCoder('myMdl','DataType',T);(标签,分数)=预测(Mdl X);结束

注意:如果您点击位于此示例右上角部分的按钮,并在MATLAB®中打开示例,则MATLAB将打开示例文件夹。这个文件夹包括入口点函数文件。

生成代码

这个XDataType结构域T指定预测器数据的定点数据类型。转换X到中指定的类型T.XDataType通过使用铸造(定点设计器)函数。

X_fx=铸造(X,“喜欢”, T.XDataType);

使用为入口点函数生成代码codegen具体说明X_fx并不断折叠T作为入口点函数的输入参数。

codegenmyFixedPointPredict-args{X_fx,编码器常数(T)}
代码生成成功。

codegen生成MEX函数myFixedPointPredict_mex与平台相关的扩展。

验证生成的代码

将预测数据传递给预测myFixedPointPredict_mex比较输出结果。

[labels,scores]=predict(Mdl,X);[labels_-fx,scores_-fx]=myFixedPointPredict_-mex(X_-fx,T);

比较预测myFixedPointPredict_mex

验证标签是否相等(标签、标签)
验证\u标签=必然的1.

等质量返回逻辑1 (true),这意味着标签标签(外汇)相等。如果标签不相等,可以按如下方式计算分类错误标签的百分比。

总和(strcmp(标签数量,标签数量)=0)/numel(标签数量)*100
ans = 0

找出分数输出之间的最大相对差异。

relDiff_scores = max (abs (scores_fx.double(: 1)分数(:1))。/分数(:1)))
relDiff_scores = 0.0055

如果您对比较结果不满意,并且希望提高生成代码的精度,那么可以调优定点数据类型并重新生成代码。有关详细信息,请参见提示在里面generateLearnerDataTypeFcn,数据类型函数,支持向量机预测的定点代码生成

输入参数

全部崩溃

机器学习模型,指定为完整或紧凑的模型对象,如以下支持的模型表所示。这些表还显示了每个模型是否支持定点代码生成。金宝app

文件名,指定为字符向量或字符串标量。

如果文件名文件存在,那么saveLearnerForCoder覆盖该文件。

延伸文件名文件必须.mat.如果文件名那就没有分机了saveLearnerForCoder附加.mat

如果文件名不包括完整路径,则saveLearnerForCoder将文件保存到当前文件夹。

例子:“SVMMdl”

数据类型:烧焦|一串

算法

saveLearnerForCoder准备一个机器学习模型(Mdl)以生成代码。该函数删除了一些不必要的属性。

  • 对于具有相应紧凑模型的模型,则saveLearnerForCoder函数应用适当的契约在保存模型之前,将函数复制到模型。

  • 对于没有相应紧凑模型的模型,例如分类KNN,ClassificationLinear,RegressionLinear,穷举搜索器,KDTreeSearcher这个saveLearnerForCoder函数删除了超参数优化属性、训练求解器信息等属性。

loadLearnerForCoder加载由保存的模型saveLearnerForCoder

选择功能

在R2019b中引入