增量学习的代码生成
这个例子展示了如何为二进制线性分类生成实现增量学习的代码。为了激发它的目的,可以考虑训练一个可穿戴设备,让它根据设备读取的感官特征来判断佩戴者是在空闲还是在运动。
生成的代码执行以下任务,如入口点函数中定义的那样:
加载在命令行中创建的已配置增量学习模型模板。
跟踪来自数据流的传入数据批的性能指标。这个例子跟踪错误分类率和铰链丢失。
通过将增量模型拟合到数据批处理中来更新模型。
预测批数据的标签。
本例从MATLAB®命令行生成代码,但您也可以使用MATLAB®Coder™应用程序来生成代码。有关更多细节,请参见基于MATLAB Coder App的机器学习模型预测代码生成.
所有用于二元线性分类(以及线性回归)的增量学习对象函数都支持代码生成。要准备生成用于增量学习的代码,对象函数需要一个适当配置的增量学习模型对象,但是arg游戏
选择codegen
(MATLAB编码器)不接受这些对象。要解决此限制,请使用saveLearnerForCoder
而且loadLearnerForCoder
功能。
此流程图显示了线性模型的增量学习对象函数的代码生成工作流程。
流程图显示了两个不同但正在合并的工作流程。
工作流从以下开始转换模型需要数据,在这种情况下,您可以在生成用于增量学习的代码之前,通过执行交叉验证来选择性地执行特性选择或优化模型。
工作流从以下开始配置模型不需要数据。相反,您必须手动配置一个增量学习模型对象。
有关工作流之间差异的详细信息,以及决定使用哪个工作流的帮助,请参见配置增量学习模型.
无论您选择哪种工作流程,生成的增量学习模型必须具有以下所有品质:
的
NumPredictors
属性反映增量学习过程中预测器数据中的预测器数量。分类,
一会
属性必须包含增量学习期间期望的所有类名。
如果您选择转换模型工作流和您适合模型的数据包含所有已知的类,模型配置为代码生成。
在您准备了增量学习模型之后,使用saveLearnerForCoder
.然后,定义一个入口点函数,该函数使用loadLearnerForCoder
,它通过调用对象函数来执行增量学习。或者,您可以定义多个入口点函数,分别执行增量学习的各个阶段(本例使用此工作流)。然而,当更新的模型对象是另一个入口点函数的输入时,此工作流需要特殊处理。例如,您可以编写以下三个入口点函数:
接受当前模型和一批数据的函数调用
updateMetrics
,并返回一个具有更新性能度量的模型。接受更新的模型和数据批的函数调用
适合
,并返回一个具有更新系数的模型。接受进一步更新的模型和批量预测器数据的函数调用
预测
,并返回预测的标签。
最后,使用生成入口点函数的代码codegen
,并验证生成的代码。
加载和预处理数据
加载人类活动数据集。随机打乱数据。
负载humanactivityrng (1);%的再现性n =元素个数(actid);p =大小(功绩,2);idx = randsample (n, n);X =壮举(idx:);actid = actid (idx);
有关数据集的详细信息,请输入描述
在命令行。
反应可以是五种类型中的一种:坐、站、走、跑或跳舞。通过确定主题是否空闲(actid
<= 2).存储唯一的类名。创建分类数组。
一会=分类([“空闲”“NotIdle”]);(1), Y = repmat(类名n, 1);Y(actid > 2) = classnames(2);
配置增量学习模型
要生成用于增量分类的代码,必须适当配置用于增量学习的二进制分类线性模型incrementalClassificationLinear
.
创建一个用于增量学习的二元分类(SVM)模型。通过指定所有预期的类名和预测变量的数量,完全配置代码生成的模型。同时,指定跟踪误分类率和铰链丢失。为了再现性,这个例子关闭了尺度不变求解器的观察变换。
指标= [“classiferror”“枢纽”];IncrementalMdl = incrementalClassificationLinear (“类名”一会,“NumPredictors”、磷、...“洗牌”假的,“指标”、指标)
IncrementalMdl = incrementalClassificationLinear IsWarm: 0 Metrics: [2x2 table] ClassNames: [Idle NotIdle] ScoreTransform: 'none' Beta: [60x1 double] Bias: 0 Learner: 'svm'属性,方法
Mdl
是一个incremenalClassificationLinear
为代码生成配置的模型对象。Mdl
是冷(Mdl。IsWarm
是0
),因为它没有处理数据,系数是0
.
或者,因为数据是可用的,您可以通过使用任何一种方法将SVM模型与数据拟合fitcsvm
或fitclinear
,然后通过将模型传递到,将结果模型转换为增量学习模型incrementalLearner
.得到的模型是温暖的因为它有处理过的数据,它的系数可能是非零的。
保存模型使用saveLearnerForCoder
将增量学习模型保存到文件中InitialMdl.mat
通过使用saveLearnerForCoder
.
saveLearnerForCoder (IncrementalMdl“InitialMdl”);
saveLearnerForCoder
将增量学习模型保存到MATLAB二进制文件中SVMClassIncrLearner.mat
作为当前文件夹中的结构数组。
定义入口点函数
一个入口点函数,也称为顶级或主要的函数,是为代码生成而定义的函数。因为您不能在顶层使用codegen
,您必须定义一个调用启用代码生成功能的入口点函数,并使用codegen
.入口点函数中的所有函数都必须支持代码生成。
在当前文件夹中定义四个独立的入口点函数,执行以下操作:
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) %#codegen % myUpdateMetricsIncrLearn度量新数据上的模型性能度量。结束
类型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定位并使用一个支持的、安装的编译器。您可以使用墨西哥人
设置
查看和更改默认编译器。有关更多细节,请参见改变默认的编译器.
构建类型
MATLAB Coder可以为以下构建类型生成代码:
MEX (MATLAB可执行程序)函数
独立的C / c++代码
编译到静态库的独立C/ c++代码
编译到动态链接库的独立C/ c++代码
编译成可执行文件的独立C/ c++代码
方法指定生成类型配置
选择codegen
(MATLAB编码器).有关设置代码生成选项的详细信息,请参见配置
选择codegen
(MATLAB编码器)而且配置构建设置(MATLAB编码器).
默认情况下,codegen
生成MEX函数。MEX函数是一个可在MATLAB中执行的C/ c++程序。您可以使用MEX函数来加速MATLAB算法,并测试生成的代码的功能和运行时问题。有关详细信息,请参见MATLAB算法加速(MATLAB编码器)而且为什么要在MATLAB中测试MEX函数?(MATLAB编码器).
使用生成代码codegen
因为C和c++是静态类型语言,所以必须在编译时在入口点函数中指定所有变量的属性。指定以下:
入口点的数据输入的数据类型通过
coder.typeof
(MATLAB编码器).另外,由于观察值的数量可能在批与批之间有所不同,因此指定观察值的数量(第一个维度)具有可变的大小。有关详细信息,请参见为代码生成指定可变大小的参数而且指定入口点函数输入的属性(MATLAB编码器).由于几个入口点函数接受增量模型对象作为输入,并对其进行操作,因此创建模型对象的表示以用于代码生成
编码器。OutputType
(MATLAB编码器).有关更多细节,请参见传递一个入口点函数输出作为输入(MATLAB编码器).
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 =地板(n / numObsPerChunk);ce = array2table (0 (nchunk, 2),“VariableNames”, (“累积”“窗口”]);铰链= ce;ceCG = ce;hingeCG = ce;IncrementalMdlCG = 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 (IncrementalMdl X (idx:), Y (idx));ce {j:} = IncrementalMdl。指标{“ClassificationError”,:};铰链{j:} = IncrementalMdl。指标{“HingeLoss”,:};IncrementalMdlCG = myIncrLearn_mex (“myUpdateMetricsIncrLearn”IncrementalMdlCG,...X (idx:), Y (idx));ceCG {j:} = IncrementalMdlCG。指标{“ClassificationError”,:};hingeCG {j:} = IncrementalMdlCG。指标{“HingeLoss”,:};IncrementalMdl =适合(IncrementalMdl X (idx:), Y (idx));IncrementalMdlCG = myIncrLearn_mex (“myFitIncrLearn”IncrementalMdlCG X (idx:), Y (idx));:[~,分数(idx)] =预测(IncrementalMdl X (idx:));: [~, scoresCG (idx)] = myIncrLearn_mex (“myPredictIncrLearn”IncrementalMdlCG X (idx:));结束
比较分类的累积指标和分数闲置
由对象函数和MEX函数返回。
idx =所有(~ isnan (ce.Variables), 2);areCEsEqual = norm(ce.Cumulative(idx) - ceCG.Cumulative(idx))
areCEsEqual = 8.9904 e-18
idx =所有(~ isnan (hinge.Variables), 2);areHingeLossesEqual = norm(hinge.Cumulative(idx) - hingeCG.Cumulative(idx))
areHingeLossesEqual = 9.5220 e-17
areScoresEqual = norm(scores(:,1) - scoresCG(:,1))
areScoresEqual = 8.7996 e-13
返回数量之间的差异可以忽略不计。