主要内容

增量学习的代码生成

这个例子展示了如何为二进制线性分类生成实现增量学习的代码。为了达到这个目的,可以考虑训练一个可穿戴设备,根据设备读取的感官特征来确定佩戴者是在空闲还是在运动。

生成的代码执行以下任务,定义在入口点函数中:

  1. 加载在命令行创建的已配置的增量学习模型模板。

  2. 跟踪来自数据流的传入数据批的性能指标。这个例子跟踪错误分类率和铰链损失。

  3. 通过将增量模型拟合到数据批中来更新模型。

  4. 预测数据批的标签。

本示例从MATLAB®命令行生成代码,但您可以使用MATLAB®Coder™应用程序来生成代码。详情请参见利用MATLAB编码器应用程序生成机器学习模型预测的代码

所有用于二进制线性分类(以及线性回归)的增量学习对象函数都支持代码生成。金宝app为了准备为增量学习生成的代码,对象函数需要适当配置的增量学习模型对象,但是arg游戏选择codegen(MATLAB编码器)不接受这些对象。要解决此限制,请使用saveLearnerForCoder而且loadLearnerForCoder功能。

此流程图显示了线性模型的增量学习对象函数的代码生成工作流。

流程图显示了两个不同但合并的工作流程。

  • 工作流开始于训练模型>转换模型需要数据,在这种情况下,您可以在生成用于增量学习的代码之前执行交叉验证来执行特征选择或优化模型。

  • 工作流开始于配置模型不需要数据。相反,您必须手动配置增量学习模型对象。

有关工作流之间差异的详细信息,以及决定使用哪个工作流的帮助,请参见配置增量学习模型

无论你选择哪种工作流程,最终的增量学习模型必须具备以下所有品质:

  • NumPredictors属性反映增量学习期间预测器数据中的预测器数量。

  • 有关分类,请参阅一会属性必须包含增量学习期间预期的所有类名。

如果你选择训练模型>转换模型工作流和您拟合模型到包含所有已知类的数据,该模型被配置为代码生成。

在您准备了一个增量学习模型之后,通过使用保存模型对象saveLearnerForCoder.然后,定义一个入口点函数,通过使用加载保存的模型loadLearnerForCoder,并通过调用对象函数来执行增量学习。或者,您可以定义多个入口点函数,分别执行增量学习的各个阶段(本例使用此工作流)。然而,当更新的模型对象是另一个入口点函数的输入时,这个工作流需要特殊处理。例如,您编写了以下三个入口点函数:

  • 一个接受当前模型和一批数据的函数,调用updateMetrics,并返回一个具有更新的性能指标的模型。

  • 一个接受更新的模型和数据批的函数,调用适合,并返回一个系数更新后的模型。

  • 接受进一步更新的模型和批预测器数据的函数,调用预测,并返回预测的标签。

最后,通过使用生成入口点函数的代码codegen,并验证生成的代码。

加载和预处理数据

加载人类活动数据集。随机打乱数据。

负载humanactivityrng (1);%用于再现性N = numel(actid);P = size(壮举,2);Idx = randsample(n,n);X = feat(idx,:);Actid = Actid (idx);

关于数据集的详细信息,请输入描述在命令行。

回答可以分为五类:坐着、站着、走着、跑着或跳舞。通过识别主题是否空闲,将响应一分为二(actid<= 2).存储唯一的类名。创建分类数组。

Classnames = categorical([“空闲”“NotIdle”]);Y = repmat(classnames(1),n,1);Y(actid > 2) = classnames(2);

配置增量学习模型

为了生成增量式分类的代码,必须为增量式学习适当地配置二进制分类线性模型incrementalClassificationLinear

为增量学习创建一个二元分类(SVM)模型。通过指定所有预期的类名和预测变量的数量来完全配置代码生成的模型。此外,指定跟踪误分类率和铰链损失。为了重现性,本例关闭了尺度不变求解器的观察变换。

度量= [“classiferror”“枢纽”];增量mdl =增量分类线性(“类名”一会,“NumPredictors”、磷、...“洗牌”假的,“指标”、指标)
IncrementalMdl = incrementalClassificationLinear IsWarm: 0 Metrics: [2x2 table] ClassNames: [Idle NotIdle] ScoreTransform: 'none' Beta: [60x1 double]偏差:0学习者:'svm'属性,方法

Mdl是一个incremenalClassificationLinear为代码生成而配置的模型对象。MdlMdl。IsWarm0),因为它没有处理数据——系数是0

或者,由于数据是可用的,您可以使用其中一种方法将SVM模型拟合到数据中fitcsvmfitclinear,然后将得到的模型转换为增量学习模型incrementalLearner.得到的模型是温暖的因为它处理过数据,所以系数可能是非零的。

使用保存模型saveLearnerForCoder

将增量学习模型保存到文件中InitialMdl.mat通过使用saveLearnerForCoder

saveLearnerForCoder (IncrementalMdl“InitialMdl”);

saveLearnerForCoder将增量学习模型保存到MATLAB二进制文件中SVMClassIncrLearner.mat作为当前文件夹中的结构数组。

定义入口点函数

一个入口点函数,也称为顶级主要的函数,是为代码生成而定义的函数。因为您不能在顶层使用codegen,您必须定义一个入口点函数来调用启用代码生成的函数,并通过使用为入口点函数生成C/ c++代码codegen.入口点函数中的所有函数都必须支持代码生成。金宝app

在当前文件夹中定义四个单独的入口点函数,执行以下操作:

  • myInitialModelIncrLearn.m-通过使用加载保存的模型loadLearnerForCoder,并返回相同形式的模型用于代码生成。这个入口点函数便于使用由入口点函数返回的模型,作为另一个入口点函数的输入。

  • myUpdateMetricsIncrLearn.m-测量当前模型在传入数据批上的性能,并将性能指标存储在模型中。该函数接受当前模型、预测器和响应数据,并返回更新后的模型。

  • myFitIncrLearn.m-拟合当前模型与输入的数据批次,并将更新后的系数存储在模型中。该函数接受当前模型、预测器和响应数据,并返回更新后的模型。

  • myPredictIncrLearn.m-使用当前模型预测传入数据批的标签。该函数接受当前模型和预测器数据,并返回标签和类分数。

有关为多个入口点函数生成代码的详细信息,请参见为多个入口点函数生成代码(MATLAB编码器)

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

或者,您可以访问中的函数高钙/ /统计/主要例子,在那里高钙的值matlabroot

显示每个函数的主体。

类型myInitialModelIncrLearn.m
函数incrementalModel = myInitialModelIncrLearn() %#codegen % myInitialModelIncrLearn加载并返回配置的线性模型%二进制分类InitialMdl incrementalModel = loadLearnerForCoder('InitialMdl');结束
类型myUpdateMetricsIncrLearn.m
函数incrementalModel = myUpdateMetricsIncrLearn(incrementalModel,X,Y) %#代码源% myUpdateMetricsIncrLearn在新数据上测量模型性能指标incrementalModel = updateMetrics(incrementalModel,X,Y);结束
类型myFitIncrLearn.m
函数incrementalModel = myFitIncrLearn(incrementalModel,X,Y) %#codegen % myFitIncrLearn拟合模型到新数据incrementalModel = Fit (incrementalModel,X,Y);结束
类型myPredictIncrLearn.m
function [labels,scores] = myPredictIncrLearn(incrementalModel,X) %#codegen % myPredictIncrLearn预测新数据上的标签和分类分数[labels,scores] = Predict (incrementalModel,X);结束

生成代码

设置编译器

要生成C/ c++代码,您必须能够访问配置正确的C/ c++编译器。MATLAB Coder定位并使用支持的,已安装的编译器。金宝app你可以使用墨西哥人设置查看和更改默认编译器。详情请参见更改默认编译器

构建类型

MATLAB Coder可以为以下构建类型生成代码:

  • MEX (MATLAB可执行)函数

  • 独立的C/ c++代码

  • 编译成静态库的独立C/ c++代码

  • 编译成动态链接库的独立C/ c++代码

  • 编译成可执行文件的独立C/ c++代码

属性指定生成类型配置选择codegen(MATLAB编码器).有关设置代码生成选项的详细信息,请参见配置选择codegen(MATLAB编码器)而且配置生成设置(MATLAB编码器)

默认情况下,codegen生成一个MEX函数。MEX函数是一个C/ c++程序,可在MATLAB中执行。您可以使用MEX函数来加速MATLAB算法,并测试生成的代码的功能和运行时问题。详细信息请参见MATLAB算法加速(MATLAB编码器)而且为什么在MATLAB中测试MEX函数?(MATLAB编码器)

使用生成代码codegen

因为C和c++是静态类型语言,所以必须在编译时在入口点函数中指定所有变量的属性。指定以下所有项:

predictorData =编码器。类型of(X,[],[true false]); responseData = coder.typeof(Y,[],true); IncrMdlOutputType = coder.OutputType(“myInitialModelIncrLearn”);

生成入口点函数的代码codegen(MATLAB编码器).对于每个入口点函数参数,使用arg游戏标记,以指定变量的编码器表示形式。指定输出的MEX函数名myIncrLearn_mex

codegen- omyIncrLearn_mex...myInitialModelIncrLearn...myUpdateMetricsIncrLearnarg游戏{IncrMdlOutputType, predictorData, responseData}中...myFitIncrLearnarg游戏{IncrMdlOutputType, predictorData, responseData}中...myPredictIncrLearnarg游戏{IncrMdlOutputType, predictorData}报告
要查看报告,打开('codegen/mex/myIncrLearn_mex/html/report.mldatx')

要帮助调试代码生成问题,请单击查看生成的C/ c++代码查看报告(见代码生成报告(MATLAB编码器)).

验证生成的代码

测试MEX函数,以验证生成的代码提供与原始MATLAB代码相同的功能。要执行此测试,请使用与运行原始MATLAB代码相同的输入运行MEX函数,然后比较结果。在生成独立代码之前在MATLAB中运行MEX函数还使您能够检测和修复难以在生成的独立代码中诊断的运行时错误。详情请参见为什么在MATLAB中测试MEX函数?(MATLAB编码器)

使用生成的MEX函数和直接使用对象函数进行增量学习。指定批处理

%预先配置numObsPerChunk = 50;nchunk = floor(n/numObsPerChunk);Ce = array2table(0 (nchunk,2),“VariableNames”,[“累积”“窗口”]);铰链= ce;ceCG = ce;hingeCG = ce;增量mdlcg = myIncrLearn_mex(“myInitialModelIncrLearn”);分数= 0 (n,2);scoresCG = 0 (n,2);%增量拟合j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1);iend = min(n,numObsPerChunk*j);Idx = ibegin:iend;IncrementalMdl = updateMetrics(增量mdl,X(idx,:),Y(idx));ce{j,:} = IncrementalMdl。指标{“ClassificationError”,:};hinge{j,:} = IncrementalMdl。指标{“HingeLoss”,:};增量mdlcg = myIncrLearn_mex(“myUpdateMetricsIncrLearn”IncrementalMdlCG,...X (idx:), Y (idx));ceCG{j,:} = IncrementalMdlCG。指标{“ClassificationError”,:};hingeCG{j,:} = IncrementalMdlCG。指标{“HingeLoss”,:};IncrementalMdl = fit(增量mdl,X(idx,:),Y(idx));增量mdlcg = myIncrLearn_mex(“myFitIncrLearn”IncrementalMdlCG X (idx:), Y (idx));:[~,分数(idx)] =预测(IncrementalMdl X (idx:));[~,scoresCG(idx,:)] = myIncrLearn_mex(“myPredictIncrLearn”IncrementalMdlCG X (idx:));结束

比较分类的累计指标和分数闲置由对象函数和MEX函数返回。

idx = all(~isnan(ce.Variables),2);areCEsEqual = norm(ce.Cumulative(idx) - ceCG.Cumulative(idx))
areCEsEqual = 8.9904e-18
idx = all(~isnan(hinge.Variables),2);areHingeLossesEqual = norm(hinge.Cumulative(idx) - hingeCG.Cumulative(idx))
areHingeLossesEqual = 8.4704e-17
areScoresEqual = norm(scores(:,1) - scoresCG(:,1))
areScoresEqual = 8.8356e-13

返回数量之间的差异可以忽略不计。