主要内容

saveLearnerForCoder

将模型对象保存在文件中,以便代码生成

描述

为机器学习模型的对象函数生成C/ c++代码预测随机knnsearchrangesearchisanomaly,和增量学习函数),使用saveLearnerForCoderloadLearnerForCoder,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)进行代码生成,并将其保存在MATLAB格式的二进制文件(MAT-file)中命名文件名.你可以通过文件名loadLearnerForCoder方法重新构造模型对象文件名文件。

例子

全部折叠

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

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

火车模型

加载费雪的虹膜数据集。删除所有观察到的鸢尾花数据,以便X而且Y只包含两个类的数据。

负载fisheririsInds = ~strcmp(种,“setosa”);X = meas(inds,:);Y = species(inds);

利用处理后的数据万博1manbetx集训练支持向量机分类模型。

Mdl = fitcsvm(X,Y);

Mdl是一个ClassificationSVM模型。

保存模型

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

saveLearnerForCoder (Mdl“SVMIris”);

定义入口点函数

定义名为classifyIris它的作用如下:

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

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

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

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

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

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

生成代码

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

codegenclassifyIrisarg游戏{X}
代码生成成功。

codegen生成MEX函数classifyIris_mex使用依赖于平台的扩展。

验证生成的代码

比较使用分类的标签预测classifyIris,classifyIris_mex

label1 = predict(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(定点设计师)而且showInstrumentationResults(定点设计师)优化定点数据类型,以提高定点代码的性能。记录命名变量和内部变量的最小值和最大值,以便使用buildInstrumentedMex.使用查看检测结果showInstrumentationResults;然后,根据结果调优变量的定点数据类型属性。有关此可选步骤的详细信息,请参见支持向量机预测的定点代码生成

火车模型

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

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

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嵌入式。fi] ScoreDataType: [0x0 embedded.fi] InnerProductDataType: [0x0 embedded.fi]

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

T.XDataType
ans = [] DataTypeMode: Fixed-point: binary point scaling signdness: Signed WordLength: 16 FractionLength: 14 RoundingMethod: Floor OverflowAction: Wrap ProductMode: FullPrecision MaxProductWordLength: 128 SumMode: 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);[label,score] = predict(Mdl,X);结束

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

生成代码

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

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

生成入口点函数的代码codegen.指定X_fx常数折叠T作为入口点函数的输入参数。

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

codegen生成MEX函数myFixedPointPredict_mex使用依赖于平台的扩展。

验证生成的代码

将预测器数据传递给预测而且myFixedPointPredict_mex比较输出。

[labels,scores] = predict(Mdl,X);[labels_fx,scores_fx] = myFixedPointPredict_mex(X_fx,T);

比较下面的输出预测而且myFixedPointPredict_mex

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

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

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

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

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

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

输入参数

全部折叠

机器学习模型,指定为完整或紧凑的模型对象,如下表所示的支持模型。万博1manbetx表格还显示了每个模型是否支持定点代码生成。万博1manbetx

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

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

扩展文件名文件必须是.mat.如果文件名那么没有分机了saveLearnerForCoder附加.mat

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

例子:“SVMMdl”

数据类型:字符|字符串

算法

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

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

  • 对于没有相应紧凑模型的模型,例如ClassificationKNNClassificationLinearRegressionLinearExhaustiveSearcherKDTreeSearcher,IsolationForest,saveLearnerForCoder函数删除属性,如超参数优化属性、训练求解器信息等。

loadLearnerForCoder加载保存的模型saveLearnerForCoder

选择功能

版本历史

R2019b引入