主要内容

loadLearnerForCoder

从保存的模型中重构模型对象以生成代码

描述

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

对于支持单精度C/ c++代码生成的函数,请使用saveLearnerForCoderloadLearnerForCoder,codegen(MATLAB编码器);指定名称-值参数“数据类型”、“单”当你打电话给loadLearnerForCoder函数。

此流程图显示了机器学习模型的对象函数的代码生成流程。使用loadLearnerForCoder对于高亮显示的步骤。

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

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

的定点代码生成工作流预测机器学习模型的功能。使用loadLearnerForCoder对于高亮显示的步骤。

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

例子

Mdl= loadLearnerForCoder (文件名重构模型(Mdl)从模型中存储在MATLAB格式化的二进制文件(MAT-file)中命名文件名.您必须创建文件名文件的使用saveLearnerForCoder

例子

Mdl= loadLearnerForCoder (文件名“数据类型”,“单”)重构单精度模型(Mdl)从模型中存储在MATLAB格式化的二进制文件(MAT-file)中命名文件名

例子

Mdl= loadLearnerForCoder (文件名“数据类型”,T返回存储在中的模型的定点版本文件名.结构T控件所需的变量的定点数据类型预测模型的功能。创建T所生成的函数generateLearnerDataTypeFcn

在入口点函数中使用此语法,并使用codegen为入口点函数生成定点代码。您只能在生成代码时使用此语法。

例子

全部折叠

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

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

火车模型

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

负载fisheriris第1 = ~ strcmp(物种,“setosa”);X =量(第1:);Y =物种(第1);

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

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编码器)

codegenclassifyIrisarg游戏{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.定义一个入口点函数,它通过使用loadLearnerForCoder并调用预测训练模型的功能。然后使用codegen(MATLAB编码器)生成C/ c++代码。

这个示例简要解释了在命令行预测机器学习模型的单精度代码生成工作流。有关更多细节,请参见命令行机器学习模型预测的代码生成.您也可以使用MATLAB Coder应用程序生成代码基于MATLAB Coder App的机器学习模型预测代码生成获取详细信息。

火车模型

加载fisheriris数据集。创建X作为一个数字矩阵,其中包含了150个鸢尾的四个花瓣的测量值。创建Y作为包含相应虹膜种类的字符向量的单元数组。

负载fisheririsX =量;Y =物种;

使用预测器训练朴素贝叶斯分类器X和类标签Y

Mdl = fitcnb (X, Y);

Mdl是一个培训ClassificationNaiveBayes分类器。

保存模型

将朴素贝叶斯分类模型保存到文件中naiveBayesIris.mat通过使用saveLearnerForCoder

saveLearnerForCoder (Mdl“naiveBayesIris”);

定义入口点函数

定义一个名为classifyIrisSingle它的作用如下:

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

  • 加载训练过的朴素贝叶斯分类模型。

  • 使用单精度加载分类模型对虹膜花测量进行标签预测。

类型classifyIrisSingle.m
% classifyIrisSingle使用文件naiveBayesIris中的%单精度朴素贝叶斯模型对X中的鸢尾花测量值进行分类。Mat, %然后返回label中预测的标签。Mdl = loadLearnerForCoder(“naiveBayesIris”、“数据类型”、“单”);标签=预测(Mdl X);结束

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

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

生成代码

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

Xpred =单(X);codegenclassifyIrisSinglearg游戏Xpred
代码生成成功。

codegen生成MEX函数classifyIrisSingle_mex使用一个平台相关的扩展。

验证生成的代码

比较标签分类使用预测classifyIrisSingle,classifyIrisSingle_mex

label1 =预测(Mdl X);label2 = classifyIrisSingle (X);label3 = classifyIrisSingle_mex (Xpred);verify_label = isequal (label1 label2 label3)
verify_label =逻辑1

isequal返回逻辑1 (true),这意味着所有输入都相等。三种方法分类的标签是一样的。如果生成了MEX函数classifyIrisSingle_mex和功能预测不产生相同的分类结果,可以计算出标签分类错误的百分比。

sum (strcmp (label3 label1) = = 0) /元素个数(label1) * 100
ans = 0

训练一个机器学习模型后,保存使用的模型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生成一个函数,该函数定义SVM模型预测所需变量的定点数据类型。

generateLearnerDataTypeFcn (“myMdl”, X)

generateLearnerDataTypeFcn生成myMdl_datatype函数。

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

T = myMdl_datatype (“固定”
T =结构体字段:XDataType: [0 x0嵌入。fi] ScoreDataType: [0x0 embedded.fi] InnerProductDataType: [0x0 embedded.fi]

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

T.XDataType
ans = [] DataTypeMode: Fixed-point: binary -point scaling sign度: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);(标签,分数)=预测(Mdl X);结束

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

生成代码

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

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

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

codegenmyFixedPointPredictarg游戏{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 (scores_fx.double(: 1)分数(:1))。/分数(:1)))
relDiff_scores = 0.0055

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

输入参数

全部折叠

包含表示模型对象的结构数组的mat文件的名称,指定为字符向量或字符串标量。您必须创建文件名文件使用saveLearnerForCoderloadLearnerForCoder对象中存储的模型文件名文件在编译时。

的扩展文件名文件必须.mat.如果文件名没有分机吗loadLearnerForCoder附加.mat

如果文件名不包括完整的路径,那么loadLearnerForCoder从当前文件夹加载文件。

下表显示了您可以保存使用的模型saveLearnerForCoder以及每个模型是否支持定点和单精度代码生成。

例子:“Mdl”

数据类型:字符|字符串

定点数据类型,指定为结构。此参数用于定点C/ c++代码生成。

创建T使用由生成的函数generateLearnerDataTypeFcn.了解生成的函数和结构的详细信息T,请参阅generateLearnerDataTypeFcn而且数据类型的函数

的模型时,可以使用此参数文件名文件是一个支持向量机模型,一个决策树模型,一个决策树的集合。

数据类型:结构体

限制

  • MdlCompactLinearModel- - - - - -假设你训练一个线性模型使用fitlm并指定“RobustOpts”作为具有匿名函数句柄的结构RobustWgtFun字段中,使用saveLearnerForCoder保存模型,然后使用loadLearnerForCoder加载模型。在这种情况下,loadLearnerForCoder不能恢复健壮的属性放入MATLAB工作区。然而,loadLearnerForCoder可以在编译时在入口点函数中加载模型以生成代码。

  • MdlCompactClassificationSVMCompactClassificationECOC- - - - - -如果你使用saveLearnerForCoder保存用于预测后验概率的模型,并使用loadLearnerForCoder然后加载模型loadLearnerForCoder不能恢复ScoreTransform属性放入MATLAB工作区。然而,loadLearnerForCoder可以加载模型,包括ScoreTransform属性中的入口点函数,以便在编译时生成代码。

提示

  • 对于高斯过程回归(GPR)模型或支持向量机(SVM)模型的单精度代码生成,通过指定使用标准化数据“标准化”,真的当你训练模型时。

算法

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

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

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

loadLearnerForCoder加载保存的模型saveLearnerForCoder

选择功能

扩展功能

版本历史

介绍了R2019b

Baidu
map