主要内容

生成代码

使用编码器配置程序生成C / C ++代码

描述

在训练一个机器学习模型之后,使用Learnercoderconfigurer.修改配置程序的属性以指定代码生成选项。然后使用生成代码预测更新机器学习模型的功能。生成C/ c++代码需要MATLAB®编码器™

此流程图显示了使用编码器配置器的代码生成工作流。使用生成代码对于突出的步骤。

例子

generateCode (配置程序生成MEX(MATLAB可执行)功能预测更新一个机器学习模型的功能配置程序. 这个generated MEX function is namedoutputfilename.,它是存储在outputfilename.财产配置程序

要生成MEX功能,生成代码首先生成在当前文件夹中生成代码所需的以下MATLAB文件:

  • 预测update.m,initialize.m-预测update.m入口点函数是什么预测更新分别为机器学习模型的功能,以及这两个函数调用initialize.m

  • 一个包含机器学习模型信息的mat文件生成代码使用saveLearnerForCoder函数将机器学习模型信息保存在mat -文件中,该文件的文件名存储在outputfilename.编码器配置程序的属性。initialize.m文件加载保存的mat -文件loadLearnerForCoder功能。

生成必要的matlab文件后,生成代码创建MEX函数和MEX功能的代码codegen\mex\outputfilename.文件夹并将MEX函数复制到当前文件夹。

例子

generateCode (配置程序CFG.使用由指定的构建类型生成C / C ++代码CFG.

例子

generateCode (___“OutputPath”,输出路径除了先前语法中的任何输入参数外,还指定输出文件的文件夹路径。生成代码在指定的文件夹中生成MATLAB文件输出路径并在文件夹中生成C/ c++代码输出路径\ codegen \类型\outputfilename.在哪里类型是由构建类型指定的CFG.

例子

全部折叠

训练机器学习模型,然后为预测更新通过使用编码器配置器来实现模型的功能。

加载carsmall数据集和培训支持向量机(SVM)回归模型。金宝app

加载carsmallX =(功率、重量);Y = MPG;Mdl = fitrsvm (X, Y);

Mdl是一个回归对象。

为应用程序创建编码器配置器回归模型通过使用Learnercoderconfigurer.指定预测器数据X. 这个Learnercoderconfigurer功能使用输入X属性的编码器属性预测功能输入。

X配置= learnerCoderConfigurer (Mdl)
配置属性= RegressionSVMCoderConfigurer:更新输入:α:[1 x1 LearnerCoderInput] SupportVectors: [1 x1 LearnerCoderInpu金宝appt]: [1 x1 LearnerCoderInput]偏见:[1 x1 LearnerCoderInput]预测输入:X: [1 x1 LearnerCoderInput]代码生成参数:NumOutputs: 1 OutputFileName:“RegressionSVMModel”属性,方法

配置程序是一个RegressionSVMCoderConfigurer对象的编码配置器回归对象。

要生成C/ c++代码,您必须访问配置正确的C/ c++编译器。MATLAB编码器定位并使用一个受支持的、安装的编译器。金宝app您可以使用墨西哥人设置查看和更改默认编译器。有关详细信息,请参见改变默认的编译器

为此生成代码预测更新SVM回归模型的功能(Mdl)使用默认设置。

generateCode(配置)
GenerateCode在输出文件夹中创建这些文件:'Initialize.m','predict.m','update.m','回归vmmodel.mat'代码生成成功。

生成代码函数完成以下操作:

  • 生成生成代码所需的MATLAB文件,包括两个入口点函数预测update.m为了预测更新功能Mdl, 分别。

  • 创建一个名为RegressionSVMModel对于两个入口点函数。

  • 创建MEX函数的代码codegen \墨西哥人\ RegressionSVMModel文件夹中。

  • 将MEX函数复制到当前文件夹。

显示该内容预测update.m,initialize.m文件,使用类型功能。

类型预测
函数varargout = predict(x,varargin)%#codegen%by matlab,23-feb-2021 19:18:25 [varargout {1:nargout}] =初始化('predict',x,varargin {:});结尾
类型update.m
function update(varargin) %#codegen % Autogenerated by MATLAB, 23- 2 -2021 19:18:25 initialize('update',varargin{:});结尾
类型initialize.m
function [varargout] = initialize(command,varargin) %#codegen % Autogenerated by MATLAB, 23- 2 -2021 19:18:25 coder.inline('always') persistent model if isempty(model) model = loadLearnerForCoder('RegressionSVMModel.mat');end switch(command) case 'update' % update struct fields: Alpha % 金宝appSupportVectors % Scale % Bias model = update(model,varargin{:});case 'predict' %预测输入:X X = varargin{1};if nargout == 2 [varargout{1:nargout}] = predict(model,X);else PVPairs = cell(1,nargin-2);for i = 1:nargin-2 PVPairs{1,i} = varargin{i+1};end [varargout{1:nargout}] = predict(model,X,PVPairs{:});结束结束结束

训练机器学习模型并使用训练模型的编码器配置器生成代码。生成代码时,请使用代码生成配置对象指定生成类型和其他配置选项。

加载电离层数据集和培训二进制支持向量机(SVM)分类模型。金宝app

加载电离层Mdl = fitcsvm (X, Y);

Mdl是一个分类VM.对象。

为应用程序创建编码器配置器分类VM.模型通过使用Learnercoderconfigurer.指定预测器数据X. 这个Learnercoderconfigurer功能使用输入X属性的编码器属性预测功能输入。

配置= learnerCoderConfigurer (Mdl X);

配置程序是一个ClassificationSVMCoderConfigurer对象的编码配置器分类VM.对象。

使用。创建代码生成配置对象coder.config(MATLAB编码器).指定“dll”要生成动态库并指定GenerateReport.财产真正的启用代码生成报告。

cfg = coder.config(“dll”);cfg.generateReport = true;

要生成C/ c++代码,您必须访问配置正确的C/ c++编译器。MATLAB编码器定位并使用一个受支持的、安装的编译器。金宝app您可以使用墨西哥人设置查看和更改默认编译器。有关详细信息,请参见改变默认的编译器

使用生成代码和配置对象CFG.生成的代码。另外,指定输出文件夹路径。

generateCode (cfg配置,'输出路径'“testPath”
指定的文件夹不存在。文件夹已创建。generateCode在输出文件夹中创建这些文件:米”、“预测。米”、“更新。米”、“ClassificationSVMModel。代码生成成功:查看报告,打开('codegen/dll/ClassificationSVMModel/html/report.mldatx')。

生成代码创建指定的文件夹。该函数还生成生成代码所需的MATLAB文件,并将其存储在文件夹中。然后生成代码在中生成C代码testPath \ \ ClassificationSVMModel codegen \ dll文件夹中。

使用支持向量机二进制学习器训练纠错输出码(ECOC)模型,并为该模型创建编码器配置器。使用编码器配置器的属性来指定ECOC模型参数的编码器属性。使用编码器配置器的对象函数生成C代码,用于预测新的预测数据的标签。然后使用不同的设置重新训练模型,并在不重新生成代码的情况下更新生成代码中的参数。

火车模型

加载Fisher的虹膜数据集。

加载fisheririsX=多边环境协定;Y=物种;

创建SVM二进制学习者模板以使用高斯内核功能并标准化预测器数据。

t=模板SVM(“KernelFunction”“高斯”“标准化”,真正的);

使用模板训练多牌ecoc模型T.

Mdl = fitcecoc (X, Y,'学习者',t);

Mdl是一个ClassificationECOC对象。

创建编码器配置器

为应用程序创建编码器配置器ClassificationECOC模型通过使用Learnercoderconfigurer.指定预测器数据X. 这个Learnercoderconfigurer功能使用输入X属性的编码器属性预测功能输入。此外,将输出的数量设置为2,以便生成的代码返回第一个输出预测功能,是预测标签和否定平均二进制损失。

配置= learnerCoderConfigurer (Mdl X,“NumOutputs”,2)
configurer=ClassificationeCoderConfigurer with properties:更新输入:BinaryLearners:[1x1 ClassificationVMCoderConfigurer]Previor:[1x1 LearnerCoderInput]成本:[1x1 LearnerCoderInput]预测输入:X:[1x1 LearnerCoderInput]代码生成参数:numoutput:2输出文件名:“ClassificationeCodel”属性、方法

配置程序是一个ClassificationECOCCoderConfigurer对象的编码配置器ClassificationECOC对象。的可调参数预测更新XBinaryLearners之前,成本

指定参数的编码器属性

的编码器属性预测参数(预测器数据和名称-值对参数'解码'“BinaryLoss”)及更新参数(支持向量机学习器金宝app的支持向量),以便您可以使用这些参数作为的输入参数预测更新在生成的代码中。

首先,指定编码器属性X这样生成的代码就可以接受任意数量的观察。修改秘诀杂色金属依赖项属性。这秘诀属性指定预测器数据大小的上限,而杂色金属依赖项属性指定预测器数据的每个维度是否具有可变大小或固定大小。

[Inf 4];configurer.X.VariableDimensions = [true false];

第一个维度的大小是观测的次数。在本例中,代码指定大小的上限为Inf而且大小是可变的,这意味着X可以有任意数量的观察结果。如果您在生成代码时不知道观察的数量,那么这个规范很方便。

第二个维度的大小是预测变量的数量。对于机器学习模型,这个值必须是固定的。X包含4个预测因子,所以第二个值秘诀属性必须为4,并且是杂色金属依赖项属性必须错误的

接下来,修改的编码器属性二进制数解码使用“BinaryLoss”'解码'生成的代码中的名称-值对参数。的编码属性二进制数

configur.binaryloss.
ans=EnumeratedInput,属性为:值:“铰链”SelectedOption:“内置”内置选项:{1x7单元}IsConstant:1可调性:0

要在生成的代码中使用非默认值,必须在生成代码之前指定该值。指定价值的属性二进制数作为“指数”

configurer.BinaryLoss.Value =“指数”;configur.binaryloss.
ans = EnumeratedInput与属性:值:'指数' SelectedOption: '内置' BuiltInOptions: {1x7 cell} IsConstant: 1可调性:1

如果在以下情况下修改属性值:可调性错误的(逻辑0),软件设置可调性真正的(逻辑1)。

的编码属性解码

configurer.decoding.
ans=EnumeratedInput,属性为:Value:'LossWighted'SelectedOption:'Buildin'内置选项:{'LossWighted''lossbased'}IsConstant:1可调性:0

指定IsConstant的属性解码作为错误的这样您就可以使用所有可用值BuiltInOptions在生成的代码中。

configurer.Decoding.IsConstant = false;configurer.decoding.
ANS = eNumerateDupput使用属性:value:[1x1 LearnerCoderInput] SelectedOption:'不可置位'内置选项:{'lockwuighted''丢失备用'} iSononstant:0可调性:1

软件改变了价值的属性解码LearnercoderInpul.对象使您可以使用两者“lossweighted”“lossbased的价值'解码'.此外,软件设置选择选项“非常数的”可调性真正的

最后,修改的编码器属性金宝appSupportVectorsBinaryLearners.的编码属性金宝appSupportVectors

configurer.BinaryLearners.金宝appSupportVectors
ans=LearnerCoderInput,属性为:SizeVector:[54 4]VariableDimensions:[1 0]数据类型:“double”可调性:1

的默认值杂色金属依赖项[真假]因为每个学习者都有不同数量的支持向量。金宝app如果您使用新的数据或不同的设置重新训练ECOC模型,SVM学习器中的支持向量的数量可能会有所不同。金宝app因此,增大支持向量数目的上界。金宝app

configurer.BinaryLearners.金宝appSupportVectors.SizeVector = [150 4];
Alpha的SizeVector属性已修改以满足配置约束。SupportVectorLabels的SizeVector属性已修改以满足配置约束。金宝app

如果修改编码器属性金宝appSupportVectors,然后软件修改的编码器属性α金宝appSupportVectorLabels满足配置约束。如果一个参数的编码器属性的修改需要随后的改变对其他从属参数来满足配置约束,则软件改变了从属参数的编码器属性。

显示编码器配置器。

配置程序
configurer = ClassificationCocoderConfigurer具有属性:更新输入:BinaryLearners:[1x1 scresisificsvmcoderConfigurer]之前:[1x1 LearnercoderInput]预测输入:x:[1x1 inumerateDute] Binaryloss:[1x1 enumerateInput]解码:[1x1 enumerateInput]代码生成参数:NUMOUTPUTS:2 OUTPUTFILENAME:'ClassificationCocModel'属性,方法

现在显示器包括二进制数解码

生成代码

要生成C/ c++代码,您必须访问配置正确的C/ c++编译器。MATLAB编码器定位并使用一个受支持的、安装的编译器。金宝app您可以使用墨西哥人设置查看和更改默认编译器。有关详细信息,请参见改变默认的编译器

为此生成代码预测更新ECOC分类模式的功能(Mdl).

generateCode(配置)
generateCode在输出文件夹中创建这些文件:米”、“预测。米”、“更新。米”、“ClassificationECOCModel。代码生成成功。

生成代码函数完成以下操作:

  • 生成生成代码所需的MATLAB文件,包括两个入口点函数预测update.m为了预测更新功能Mdl, 分别。

  • 创建一个名为classificationcocmodel.对于两个入口点函数。

  • 创建MEX函数的代码codegen\mex\ClassificationeCOModel文件夹中。

  • 将MEX函数复制到当前文件夹。

验证生成的代码

通过一些预测数据来验证是否预测功能Mdl预测MEX函数中的函数返回相同的标签。要在具有多个入口点的MEX函数中调用入口点函数,请将函数名指定为第一个输入参数。因为你指定了'解码'作为可调参数,通过更改IsConstant在生成代码之前的属性,您还需要在对MEX函数的调用中指定它,即使“lossweighted”是的默认值'解码'

[标签,dropsа] =预测(mdl,x,“BinaryLoss”“指数”); [label\u-mex,NegLoss\u-mex]=分类模型(“预测”,X,“BinaryLoss”“指数”'解码'“lossweighted”);

比较标签label_mex通过使用是平等的

isequal(标签,标签)
ans =逻辑1

是平等的返回逻辑1(真正的)如果所有输入相等。比较证实了预测功能Mdl预测MEX函数中的函数返回相同的标签。

NegLoss_mex可能包括舍入差异与NegLoss.在这种情况下,比较NegLoss_mexNegLoss,允许有一个小的公差。

查找(abs(NegLoss-NegLoss_mex)>1e-8)
Ans = 0x1空双列向量

比较证实了NegLossNegLoss_mex在公差内是相等的吗1e–8

重新训练模型并更新生成代码中的参数

使用不同的设置重新培训模型。指定“内核尺度”作为'汽车'因此,该软件采用启发式的方法选择合适的比例因子。

t_new = templateSVM (“KernelFunction”“高斯”“标准化”,真的,“内核尺度”'汽车');RetrowingMDL = FitCecoc(X,Y,'学习者', t_new);

通过使用提取要更新的参数validatedUpdateInputs.此功能检测到修改的模型参数retrainedMdl并验证修改后的参数值是否满足参数的编码器属性。

params = validatedUpdateInputs(配置、retrainedMdl);

更新生成代码中的参数。

ClassificationECOCModel (“更新”params)

验证生成的代码

的输出比较预测功能retrainedMdl预测函数。

[label,NegLoss]=预测(重新训练的DMDL,X,“BinaryLoss”“指数”'解码'“lossbased”); [label\u-mex,NegLoss\u-mex]=分类模型(“预测”,X,“BinaryLoss”“指数”'解码'“lossbased”); isequal(标签,标签)
ans =逻辑1
查找(abs(NegLoss-NegLoss_mex)>1e-8)
Ans = 0x1空双列向量

比较证实了标签label_mex是相等的,NegLossNegLoss_mex在公差范围内是相等的。

输入参数

全部折叠

编码器配置机器学习模型的编码器,指定为使用的编码器配置程序对象Learnercoderconfigurer

模型 编码器配置对象
用于多类分类的二叉决策树 ClassificationTreeCoderConfigurer
单级和二进制分类的SVM ClassificationSVMCoderConfigurer
二进制分类的线性模型 分类线性代码配置器
支持向量机的多分类模型和线性模型 ClassificationECOCCoderConfigurer
二叉决策树的回归 RegressionTreeCoderConfigurer
金宝app支持向量机回归 RegressionSVMCoderConfigurer
线性回归 RegentionLinearcoderConfigurer

生成类型,指定为'mex'“dll”'lib',或由创建的代码生成配置对象coder.config(MATLAB编码器)

生成代码使用以下构建类型之一生成C / C ++代码。

  • 'mex'-生成具有平台相关扩展的MEX函数。MEX函数是可从命令窗口执行的C/C++程序。在生成用于部署的C/C++库之前,请生成一个MEX函数,以验证生成的代码是否提供了正确的功能。

  • “dll”-生成动态的C/ c++库。

  • 'lib'-生成一个静态C/C++库。

  • 代码生成配置对象创建coder.config(MATLAB编码器)-使用代码生成配置对象生成C/C++代码,以自定义代码生成选项。可以使用对象指定生成类型和其他配置选项。例如,修改GenerateReport.参数以启用代码生成报告,并修改targetlang.参数生成C++代码。的默认值targetlang.参数是“C”,生成C代码。

    cfg = coder.config('mex'); cfg.GenerateReport=true;cfg.TargetLang=“c++”;
    具体操作请参见配置选择codegen(MATLAB编码器)coder.config(MATLAB编码器),配置构建设置(MATLAB编码器)

生成代码在文件夹中生成C/ c++代码输出路径\ codegen \类型\outputfilename.哪里类型生成类型是否由CFG.参数,outputfilename.文件名是否存储在outputfilename.财产配置程序

输出文件的文件夹路径生成代码,指定为字符向量或字符串数组。

指定的文件夹路径可以是当前文件夹路径的绝对路径,也可以是相对路径。

  • 路径不能包含空格,因为在某些操作系统配置中,空格可能导致代码生成失败。

  • 路径也不能包含非7位ASCII字符,例如日语字符。

如果指定的文件夹不存在,则生成代码创建文件夹。

生成代码在指定的文件夹中搜索四个MATLAB文件:预测update.minitialize.m,以及一个包含机器学习模型信息的mat文件。如果文件夹中不存在这四个文件,则生成代码生成的文件。否则,生成代码不会生成任何MATLAB文件。

生成代码在文件夹中生成C/ c++代码输出路径\ codegen \类型\outputfilename.哪里类型生成类型是否由CFG.参数,outputfilename.文件名是否存储在outputfilename.财产配置程序

例子:'c:\ myfiles'

数据类型:烧焦|字符串

限制

选择功能

  • 如果您想修改MATLAB文件(预测update.m,initialize.m)根据您的代码生成工作流,然后使用生成菲尔斯生成这些文件并使用codegen(MATLAB编码器)生成的代码。

在R2018B中介绍