主要内容

saveLearnerForCoder

在文件中保存模型对象进行代码生成

描述

为机器学习模型的目标函数生成C/ c++代码(包括预测随机knnsearchrangesearch.,增量学习功能),使用saveLearnerForCoderloadlearnerforcoder., 和Codegen.(MATLAB编码器).训练一个机器学习模型后,使用保存该模型saveLearnerForCoder.定义通过使用加载模型的入口点函数loadlearnerforcoder.并调用一个对象函数。然后使用Codegen.或者是MATLAB®编码器™app生成C/ c++代码。生成C/ c++代码需要Matlab编码器

该流程图显示了机器学习模型的对象功能的代码生成工作流程。使用saveLearnerForCoder为突出显示的步骤。

定点C / C ++代码生成需要一个附加步骤,该步骤定义预测所需的变量的定点数据类型。使用由生成的数据类型功能创建固定点数据类型结构generateLearnerDataTypeFcn,并将该结构用作的输入参数loadlearnerforcoder.在入口点函数中。生成定点C/ c++代码需要Matlab编码器和固定点设计器™。

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

例子

saveLearnerForCoder (MDL.文件名准备分类模型、回归模型或最近邻搜索器(MDL.)来生成代码,并将其保存在MATLAB格式的二进制文件(MAT-file)中文件名.你可以通过文件名loadlearnerforcoder.来重建模型对象文件名文件。

例子

全部折叠

训练一个机器学习模型后,使用保存该模型saveLearnerForCoder.定义通过使用加载模型的入口点函数loadlearnerforcoder.并调用预测训练模型的函数。然后使用Codegen.(MATLAB编码器)生成C/ c++代码。

此示例简要介绍了用于预测命令行的机器学习模型的代码生成工作流程。有关更多详细信息,请参阅命令行中计算机学习模型预测的代码生成.您还可以使用MATLAB编码器应用程序生成代码。看使用MATLAB编码器应用程序预测机器学习模型的代码生成获取详细信息。要了解使用最近邻居搜索器模型查找最近邻居的代码生成,请参见最近邻搜索器的代码生成

火车模型

载入费雪的虹膜数据集。去除所有观测到的虹膜数据,以便XY只包含两个类的数据。

负载fisheriris第1 = ~ strcmp(物种,“setosa”);x = meas(inds,:);Y =物种(INDS);

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

mdl = fitcsvm(x,y);

MDL.是一个ClassificationSVM模型。

保存模型

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

saveLearnerForCoder (Mdl'svmiris');

定义入口点函数

定义一个入口点函数名为classifyiris.它的作用如下:

  • 接受虹膜花测量与对应的列,并返回预测标签。

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

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

类型classifyIris.m%显示classifyiris.m文件的内容
% classifyIris使用文件SVMIris中的SVM %模型对X中的鸢尾花进行分类。Mat,然后返回label中的类标签。Mdl = loadLearnerForCoder(“SVMIris”);标签=预测(Mdl X);结尾

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

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

生成代码

使用生成入口点函数的代码Codegen.(MATLAB编码器).因为C和c++都是静态类型语言,所以必须在编译时确定入口点函数中所有变量的属性。通过X作为价值arg游戏选项指定生成的代码必须接受具有与培训数据相同数据类型和数组大小的输入X.如果观察次数在编译时未知,则还可以使用的方式将输入指定为可变大小Coder.typeof.(MATLAB编码器).有关详细信息,请参见指定代码生成的变量大小参数指定入口点函数输入的属性(MATLAB编码器)

Codegen.classifyiris.arg游戏{X}
代码成功。

Codegen.生成MEX函数classifyIris_mex与平台相关的扩展。

验证生成的代码

比较分类使用的标签预测classifyiris., 和classifyIris_mex

label1 =预测(Mdl X);label2 = classifyIris (X);label3 = classifyIris_mex (X);verify_label = isequal (label1 label2 label3)
verify_label =逻辑1

isequal返回逻辑1 (true),这意味着所有输入都是相等的。三种方法分类的标签都是一样的。

培训机器学习模型后,使用模型使用saveLearnerForCoder.对于定点代码生成,通过使用生成的数据类型函数指定进行预测所需变量的定点数据类型generateLearnerDataTypeFcn.然后,定义一个入口点函数,通过使用这两个函数来加载模型loadlearnerforcoder.指定的定点数据类型,并调用预测模型的功能。使用Codegen.(MATLAB编码器)为入口点函数生成定点C/ c++代码,然后验证生成的代码。

在使用代码之前使用Codegen.,你可以使用buildInstrumentedMex(定点设计师)showinstumastation.cresults.(定点设计师)优化定点数据类型以提高定点代码的性能。通过使用,记录命名变量和内部变量的最小值和最大值buildInstrumentedMex.使用showinstumastation.cresults.;然后,根据结果调优变量的定点数据类型属性。关于此可选步骤的详细信息请参见用于预测SVM的固定点代码生成

火车模型

加载电离层数据集,训练二值支持向量机分类模型。

负载电离层mdl = fitcsvm(x,y,'骨箱''高斯');

MDL.是一个ClassificationSVM模型。

保存模型

将SVM分类模型保存到文件中mymdl.mat通过使用saveLearnerForCoder

saveLearnerForCoder (Mdl“myMdl”);

定义定点数据类型

使用generateLearnerDataTypeFcn生成一个函数,定义支持向量机模型预测所需变量的定点数据类型。

generatelearnerdatatypefcn(“myMdl”, X)

generateLearnerDataTypeFcn生成myMdl_datatype函数。

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

T = myMdl_datatype (“固定”
T =结构体字段:XDatatype:[0x0 Embedded.fi] scoringatatype:[0x0嵌入式.fi] InnerProductDattype:[0x0嵌入式.FI]

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

T.XDataType
ans = [] DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 14 RoundingMethod: Floor OverflowAction: Wrap ProductMode: FullPrecision MaxProductWordLength: 128 SumMode: FullPrecision MaxSumWordLength: 128

定义入口点函数

定义一个入口点函数名为myFixedPointPredict它的作用如下:

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

  • 加载一个定点版本的训练支持向量机分类模型使用两者loadlearnerforcoder.和结构T

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

类型myFixedPointPredict.m%显示myfixedpointpredict.m文件的内容
功能[标签,分数] = myfixedpointpredict(x,t)%#codegen mdl = loadlearnerforcoder('mymdl','datatype',t);[标签,得分] =预测(MDL,x);结尾

笔记:如果单击该示例的右上角的按钮并在MATLAB®中打开示例,则MATLAB将打开示例文件夹。此文件夹包含入口点函数文件。

生成代码

XDataType结构场T指定预测器数据的定点数据类型。兑换X中指定的类型T.XDataType通过使用(定点设计师)函数。

x_fx = cast(x,“喜欢”, T.XDataType);

使用生成入口点函数的代码Codegen..指定X_FX.和持续的折叠T作为入口点函数的输入参数。

Codegen.myFixedPointPredictarg游戏{X_fx, coder.Constant (T)}
代码成功。

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

验证生成的代码

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

(标签、分数)=预测(Mdl X);[labels_fx, scores_fx] = myFixedPointPredict_mex (X_fx T);

比较输出预测myFixedPointPredict_mex

labels_fx verify_labels = isequal(标签)
verify_labels =逻辑1

isequal返回逻辑1 (true),这意味着标签labels_fx是相等的。如果标签不相等,可按如下方法计算标签分类错误的百分比。

sum (strcmp (labels_fx、标签)= = 0)/元素个数(labels_fx) * 100
ans = 0.

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

Reldiff_scores = max(abs(scors_fx.double(:,1)-scores(:,1))./ scores(:,1)))
Reldiff_scores = 0.0055.

如果您对比较结果不满意并希望提高生成的代码的精度,则可以调整固定点数据类型并重新生成代码。有关详细信息,请参见提示generateLearnerDataTypeFcn数据类型的函数, 和用于预测SVM的固定点代码生成

输入参数

全部折叠

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

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

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

延伸的文件名文件必须。垫.如果文件名没有扩展吗saveLearnerForCoder附加。垫

如果文件名不包括一个完整的路径,那么saveLearnerForCoder将文件保存到当前文件夹。

例子:'svmmdl'

数据类型:字符|字符串

算法

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

  • 对于具有相应紧凑型号的模型,该模型saveLearnerForCoder函数应用适当的紧凑的函数,然后保存模型。

  • 对于没有相应紧凑模型的模型,例如ClassificationKNN分类线性回归线性ExhaustiveSearcher, 和kdtreesearcher.,saveLearnerForCoder函数删除诸如Quand参数优化属性,培训求解器信息等的属性。

loadlearnerforcoder.加载保存的模型saveLearnerForCoder

替代功能

介绍了R2019b