主要内容

generateLearnerDataTypeFcn

为定点生成函数,定义了数据类型代码生成

自从R2019b

描述

生成定点C / c++代码预测机器学习模型的函数,使用generateLearnerDataTypeFcn,saveLearnerForCoder,loadLearnerForCoder,codegen(MATLAB编码器)

  • 机器学习模型,训练后保存模型saveLearnerForCoder

  • 创建一个结构,定义了定点使用函数生成的数据类型generateLearnerDataTypeFcn

  • 定义一个入口点函数,通过使用两个加载模型loadLearnerForCoder和结构,然后调用预测函数。

  • 使用生成代码codegen,然后验证生成的代码。

generateLearnerDataTypeFcn函数需要定点设计师™和生成定点C / c++代码的需要MATLAB®编码器™和定点设计师。

这个流程图显示了定点代码生成的工作流预测机器学习模型的函数。使用generateLearnerDataTypeFcn突出显示的步骤。

定点代码生成工作流。步骤1:火车模型。第二步:保存模型。步骤3(强调):定义定点数据类型。第四步:定义一个入口点函数。第五步(可选):优化定点数据类型。第六步:生成代码。第七步:验证生成的代码。

例子

generateLearnerDataTypeFcn (文件名,X)生成一个数据类型的函数定义定点所需的变量的数据类型生成预测的定点C / c++代码的机器学习模型。文件名存储机器学习模型,X包含的预测数据预测的函数模型。

使用生成的函数创建一个结构,定义了定点数据类型。然后,使用结构作为输入参数TloadLearnerForCoder

generateLearnerDataTypeFcn (文件名,X,名称,值)指定附加选项通过使用一个或多个参数名称-值对。例如,您可以指定“字”,32使用32位字长为定点数据类型。

例子

全部折叠

机器学习模型,训练后保存模型saveLearnerForCoder。对于定点代码生成,指定所需的定点数据类型的变量预测使用生成的数据类型的功能generateLearnerDataTypeFcn。然后,定义一个入口点函数加载模型通过使用两个loadLearnerForCoder和指定的定点数据类型和调用预测的函数模型。使用codegen(MATLAB编码器)生成定点C / c++代码的入口点函数,然后验证生成的代码。

之前使用生成代码codegen,你可以使用buildInstrumentedMex(定点设计师)showInstrumentationResults(定点设计师)优化定点数据类型来提高定点代码的性能。记录最大和最小值的命名和内部变量预测使用buildInstrumentedMex。查看检测结果使用showInstrumentationResults;然后,根据结果,调整定点数据类型变量的属性。这个可选步骤的详细信息,请参阅定点代码生成SVM的预测

火车模型

加载电离层数据集和训练一个二进制SVM分类模型。

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

Mdl是一个ClassificationSVM模型。

保存模型

将支持向量机分类模型保存到该文件myMdl.mat通过使用saveLearnerForCoder

saveLearnerForCoder (Mdl“myMdl”);

定点数据类型定义

使用generateLearnerDataTypeFcn生成一个函数,定义了所需的定点数据类型的变量预测的支持向量机模型。

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:定点:二进制扩展Signedness:签了字:16 FractionLength: 14 RoundingMethod:地板OverflowAction:包装ProductMode: FullPrecision MaxProductWordLength: 128 SumMode: FullPrecision MaxSumWordLength: 128

定义入口点函数

定义一个入口点函数命名myFixedPointPredict做以下几点:

  • 接受的预测数据X和定点数据类型结构T

  • 加载一个定点的训练支持向量机分类模型用两个loadLearnerForCoder和结构T

  • 使用加载模型预测标签和分数。

函数(标签,分数)= myFixedPointPredict (X, T)% # codegenMdl = loadLearnerForCoder (“myMdl”,“数据类型”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生成墨西哥人的功能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(真正的),这意味着标签labels_fx是相等的。

如果你不满意的比较结果和想提高的精度生成的代码,您可以调整定点数据类型和重新生成代码。有关详细信息,请参见提示generateLearnerDataTypeFcn,数据类型的函数,定点代码生成SVM的预测

自从R2023a

创建一个定点数据类型结构使用生成的函数generateLearnerDataTypeFcn。更新结构包括一个查找表,接近得分转换功能的训练分类器。然后,生成定点代码使用更新后的结构。

火车模型

加载census1994的数据集,其中包含的变量adultdata成人。这些变量包括人口数据来自美国人口普查局用来预测一个人是否使超过50000美元一年。您可以使用adultdata训练模型和成人测试训练模型。

负载census1994

考虑一个模型,预测员工的工资类别考虑到他们的年龄,工人阶级,教育水平、资本收益和损失,每周工作小时数。提取感兴趣的变量,并将它们保存在表。

台= adultdata (:, {“年龄”,“education_num”,“capital_gain”,“capital_loss”,“hours_per_week”});tblTest =成人(:,{“年龄”,“education_num”,“capital_gain”,“capital_loss”,“hours_per_week”});

定点代码生成不支持表或分类数组。万博1manbetx因此,定义使用一个数字矩阵,预测数据和使用一个逻辑向量定义类标签。一个逻辑向量使用内存最有效的二元分类问题。

X = table2array(台);Y = adultdata。工资= =“< = 50 k”;XTest = table2array (tblTest);欧美=成人。工资= =“< = 50 k”;

软件使用一个定点数据类型的预测数据。因此,规范预测数据使定点数据类型更健壮的溢出和下溢。正常化也减少了所需的计算分数变换生成的查找表。

规范化的预测数据XXTest。使用训练数据的平均值和标准偏差X规范化的测试数据XTest

[X, C, S] = (X)正常化;XTest =正常化(XTest,“中心”C“规模”,年代);

训练一个分类树模型。指定最小数量的叶子节点观测(MinLeafSize)和决策分歧的最大数量(MaxNumSplits模型的),以减少内存占用。指定分对数分数的转换。

Mdl = fitctree (X, Y,“重量”adultdata.fnlwgt,“MinLeafSize”10“MaxNumSplits”,100,“ScoreTransform”,分对数的);

Mdl是一个ClassificationTree模型。

计算分类错误的训练数据集和测试数据集。

损失(Mdl, X, Y)
ans = 0.1620
损失(Mdl XTest、欧美)
ans = 0.1683

训练数据的分类器分类大约16%和17%的测试数据。

保存模型

将分类模型保存到该文件myMdl.mat通过使用saveLearnerForCoder

saveLearnerForCoder (Mdl“myMdl”);

定点数据类型定义

使用generateLearnerDataTypeFcn生成一个函数,定义了定点预测所需的变量的数据类型。使用所有可用的预测数据获得现实的定点数据类型范围。

generateLearnerDataTypeFcn (“myMdl”,[X; XTest])

generateLearnerDataTypeFcn生成myMdl_datatype函数。

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

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

生成的查找表来近似分数转换

创建一个FunctionApproximation.TransformFunction(定点设计师)对象通过指定这些输入:

  • 前两个输入的输入都是相同的generateLearnerDataTypeFcn函数。第一个输入文件的名称,包含训练模型,和第二个输入是预测数据。

  • 第三个输入是通过调用生成的结构myMdl_datatype函数。

approxObj = FunctionApproximation.TransformFunction (“myMdl”[X; XTest], T)
approxObj = TransformFunction属性:问题:[1 x1 FunctionApproximation.ClassregProblem]

approxObj有财产问题,其中包含一个ClassregProblem对象。显示问题的属性approxObj

approxObj.Problem
ans = ClassregProblem属性:FunctionToApproximate: @ (x) (1. / (1 + exp (- x))) NumberOfInputs: 1 InputTypes: [1 x1嵌入。numerictype] InputLowerBounds: -3.5296 InputUpperBounds: 13.3944 OutputType: [1 x1嵌入。numerictype]选项:[1 x1 FunctionApproximation.Options]

ClassregProblem对象问题属性包含信息从创建时输入您指定approxObj。详情,请参阅FunctionApproximation.ClassregProblem(定点设计师)参考页面。

输入你创建时指定的预测数据FunctionApproximation.TransformFunction对象决定了范围InputLowerBoundsInputUpperBounds。如果两者之间的界限范围太大,生成的查找表可以耗费时间。在本例中,您标准化X和缩放XTest减少范围。

创建一个新的数据类型结构T_new通过使用近似(定点设计师)函数。

T_new =近似(approxObj)
T_new =结构体字段:XDataType: [0 x0嵌入。fi] TransformedScoreDataType: [0x0 embedded.fi] ScoreDataType: [0x0 embedded.fi] LookupTableFunction: '@myMdl_lookup'

近似返回输出T_new并生成的查找表的功能myMdl_lookupT_new存储在包含所有的字段T和一个额外的字段LookupTableFunction,其中包含一个函数处理myMdl_lookup

定义入口点函数

定义一个入口点函数命名myFixedPointPredict使用训练模型,预测分类标签和分数。

函数(标签,分数)= myFixedPointPredict (X, T)% # codegenMdl = loadLearnerForCoder (“myMdl”,“数据类型”T);(标签,分数)=预测(Mdl X);结束

生成代码

转换XTest中指定的类型T_new.XDataType通过使用(定点设计师)函数。

XTest_fx =投(XTest,“喜欢”,T_new.XDataType);

生成代码的入口点函数使用codegen。而不是指定一个适应输入的预测数据集,指定一个固定大小的输入使用coder.typeof。如果你知道预测数据集的大小,通过对所生成的代码,然后生成代码简单的固定大小的输入是可取的。

codegenmyFixedPointPredictarg游戏{coder.typeof (XTest_fx [1,5], [0]), coder.Constant (T_new)}
代码生成成功。

codegen生成墨西哥人的功能myFixedPointPredict_mex与平台相关的扩展。

验证生成的代码

通过测试数据集XTest预测myFixedPointPredict_mex比较输出。

(标签、分数)=预测(Mdl XTest);n =大小(XTest, 1);labels_fx = true (n, 1);scores_fx = 0 (n, 2);i = 1: n [labels_fx(我),scores_fx(我,:)]= myFixedPointPredict_mex (XTest_fx(我,:),T_new);结束

比较的输出预测myFixedPointPredict_mex

labels_fx verify_labels = isequal(标签)
verify_labels =逻辑0

isequal返回逻辑0(假的),这意味着标签labels_fx是不一样的。发现不匹配的标签。

idx =找到(labels_fx ~ =标签)
idx =2×14815 14114

墨西哥人函数返回相同的标签预测函数除了两个样品XTest

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

relDiff_scores = max (abs((双(scores_fx(: 1)分数(:1))。/分数(:1)))
relDiff_scores = 0.0407

输入参数

全部折叠

MATLAB格式化二进制文件的名称(MAT-file)包含结构数组代表一个模型对象,指定为一个特征向量或字符串标量。

你必须创建文件名文件使用saveLearnerForCoder和模型文件名可以是下列之一:

的扩展文件名文件必须.mat。如果文件名没有扩展呢generateLearnerDataTypeFcn附加.mat

如果文件名不包括一个完整的路径,然后呢generateLearnerDataTypeFcn加载文件从当前文件夹。

例子:“myMdl”

数据类型:字符|字符串

预测数据预测存储在函数的模型文件名指定为一个n——- - - - - -p数字矩阵,n是观察和的数量吗p是预测变量的数量。

数据类型:|

名称-值参数

指定可选的双参数作为Name1 = Value1,…,以=家,在那里的名字参数名称和吗价值相应的价值。名称-值参数必须出现在其他参数,但对的顺序无关紧要。

R2021a之前,用逗号来分隔每一个名称和值,并附上的名字在报价。

例子:generateLearnerDataTypeFcn(文件名,X,‘OutputFunctionName’,‘myDataTypeFcn’,‘字’,32)生成一个数据类型函数命名myDataTypeFcn使用32位的字长为每个变量在定义定点数据类型。

生成的函数的名称,指定为逗号分隔组成的“OutputFunctionName”和一个字符向量或字符串标量。的“OutputFunctionName”值必须是一个有效的MATLAB函数名。

默认的文件名是函数名文件名紧随其后的是_datatype。例如,如果文件名myMdl,那么默认的函数名myMdl_datatype

例子:“OutputFunctionName”、“myDataTypeFcn”

数据类型:字符|字符串

位字长,指定为逗号分隔组成的“字”和一个数字标量。

生成的数据类型的函数定义了一个定点为每个变量使用指定的对象“字”价值。如果一个变量需要较长的单词长度比指定的值,软件双打一词长度为变量。

最优词长度取决于你的目标硬件属性。当指定的字长较长最长单词的大小你的目标硬件,生成的代码包含多字操作。

有关详细信息,请参见定点数据类型(定点设计师)

例子:“字”,32

数据类型:|

输出参数的范围预测函数,指定为逗号分隔组成的“OutputRange”和一个数字向量的两个元素(输出的最小和最大值)。

“OutputRange”值指定的范围预测类分数分类模型和回归模型预测反应的范围。下表中列出的输出参数可以指定使用范围“OutputRange”名称-值对的论点。

分类模型

模型 预测的函数模型 输出参数
决策树 预测 分数
整体的决策树 预测 分数
支持向量机 预测 分数

回归模型

模型 预测的函数模型 输出参数
决策树 预测 Yfit
整体的决策树 预测 Yfit
支持向量机 预测 yfit

X包含了大量的观察和范围为输出参数,指定“OutputRange”价值减少的数量计算。

如果你不指定“OutputRange”值,然后使用预测软件模拟输出范围的数据X预测函数。

软件确定数字,张成的空间定点数据可以表示通过“OutputRange”价值和“PercentSafetyMargin”价值。

例子:“OutputRange”, [0, 1]

数据类型:|

安全保证金比例,指定为逗号分隔组成的“PercentSafetyMargin”和一个数字标量。

对于每个变量,软件模拟变量的范围并添加指定的安全裕度来确定数字张成的空间定点数据可以表示。然后,软件提出了最大一部分长度,不会导致溢出。

当你指定要特别小心“PercentSafetyMargin”价值。如果一个变量范围很大,增加安全裕度可以导致下溢,因为软件降低分数的长度代表更大范围使用给定单词的长度。

例子:“PercentSafetyMargin”, 15

数据类型:|

更多关于

全部折叠

数据类型的函数

使用生成的数据类型的功能generateLearnerDataTypeFcn创建一个结构,定义了定点所需的变量的数据类型生成预测的定点C / c++代码的机器学习模型。使用输出结构函数作为输入参数的数据类型TloadLearnerForCoder

如果文件名“myMdl”,然后generateLearnerDataTypeFcn生成一个数据类型函数命名myMdl_datatype。的myMdl_datatype函数支持这种语法:万博1manbetx

T = myMdl_datatype (dt)

T = myMdl_datatype (dt)返回一个数据类型结构,定义了所需的变量的数据类型生成预测的定点C / c++代码的机器学习模型。

每个字段的T包含一个定点返回的对象fi(定点设计师)。输入参数dt指定了数据类型定点对象的属性。

  • 指定dt作为“固定”(默认)定点代码生成。

  • 指定dt作为“双”模拟浮点定点的代码的行为。

使用输出结构T作为第二个输入参数loadLearnerForCoder

结构T下列表中包含的字段。这些字段定义变量的数据类型直接影响模型的精度。这些变量,以及其他命名和内部变量,必须运行预测的函数模型。

描述 字段
常见的领域分类
  • XDataType(输入)

  • ScoreDataType(输出或内部变量)TransformedScoreDataType(输出)

    • 如果你训练一个模型使用默认值“ScoreTransform”的价值“没有”“身份”(也就是说,您不变换预测分数),然后ScoreDataType场输出的精度影响成绩。

    • 如果你训练一个模型使用的价值“ScoreTransform”除了“没有”“身份”(即你变换预测分数),然后ScoreDataType场的精度影响内部untransformed分数。的TransformedScoreDataType场转换后输出的精度影响成绩。

公共领域的回归
  • XDataType(输入)

  • YFitDataType(输出)

其他字段的决策树
  • WeakLearnerOutputDataType(内部变量)——输出数据类型从弱的学习者。

  • AggregatedLearnerWeightsDataType(内部变量),数据类型为加权总输出的弱学习者,使用装袋(只适用于如果你训练模型“方法”,“包”)。软件计算预测分数(ScoreDataType)除以总学习者权重的总和。

其他字段的支持向量机
  • XnormDataType(内部变量),只适用于如果你训练一个模型使用“标准化”“KernelScale”

  • InnerProductDataType(内部变量)

软件提出了最大一部分长度不会导致溢出,基于默认字长(16)和安全保证金(10%)为每一个变量。

下面的代码显示了数据类型的功能myMdl_datatype,生成的generateLearnerDataTypeFcn文件名“myMdl”和模型文件名文件是一个支持向量机分类器。

函数T = myMdl_datatype (dt)如果输入参数个数< 1 dt =“固定”;结束%设置定点数学设置调频= fimath (“RoundingMethod”,“地板”,“OverflowAction”,“包装”,“ProductMode”,“FullPrecision”,“MaxProductWordLength”,128,“SumMode”,“FullPrecision”,“MaxSumWordLength”,128);%预测数据的数据类型T.XDataType= fi([],true,16,14,fm,“数据类型”,dt);%为输出数据类型得分T。ScoreDataType = fi (fm[],真的,16日,14日,“数据类型”,dt);%内部变量dist = %数据类型的平方距离为高斯内核(x-sv) ^ 2 G (x, sv) = exp(经销)% x是预测数据的观察和sv支持向量万博1manbetxT。InnerProductDataType = fi([],真的,16 6调频,“数据类型”,dt);结束

提示

  • 提高精度的定点生成的代码,您可以调整定点数据类型。通过更新修改定点数据类型数据类型的函数(myMdl_datatype)和创建一个新的结构,然后重新生成代码使用新的结构。你可以更新myMdl_datatype函数两种方式中的一种:

    • 重新生成myMdl_datatype通过使用函数generateLearnerDataTypeFcn和它的名称-值对参数。

      如果你增加这个词长度或减少安全裕度,该软件可以提出一个分数长度更长,因此,提高精度的基于给定数据集生成的代码。

    • 手动修改定点数据类型在函数文件(myMdl_datatype.m)。为每一个变量,您可以调整长度和长度和指定定点数学设置使用fimath(定点设计师)对象。

  • 定点代码生成,大量的操作或一个大变量范围可能导致丧失精度,而相应的精度浮点代码。当训练支持向量机模型,牢记下面的建议来避免损失精度的定点生成代码:

    • 数据标准化(“标准化”)- - -为了避免溢出模型中属性值的支持向量的SVM模型,可以预测数据标准化。万博1manbetx而不是使用“标准化”名称-值对参数当训练模型,规范之前预测数据通过数据拟合函数和预测函数,以便定点代码不包括标准化的操作。

    • 内核函数(“KernelFunction”)- - -使用高斯内核或线性内核比使用一个多项式内核。一个多项式比其他内核,内核需要较高的计算复杂度和多项式核函数的输出是无界的。

    • 内核规模(“KernelScale”)- - -使用一个内核规模如果需要额外的操作“KernelScale”不是1。

    • 看到下面成了一个分类问题的预测可能会丧失精度,如果预测类分数值有很大的范围。

  • 您可以生成一个查找表,接近一个分数变换函数训练分类器的使用FunctionApproximation.TransformFunction(定点设计师)对象和它的功能近似(定点设计师)。然后使用定点代码生成的查找表。这种方法需要较少的计算分数转换生成的代码比默认的方法,它使用CORDIC-based算法。因此,使用一个查找表收益率相对高速性能和内存需求相对较低。支持分数万博1manbetx转换功能包括“doublelogit”,分对数的,“symmetriclogit”。例如,看到的使用查找表来近似分数转换(因为R2023a)

版本历史

介绍了R2019b

全部展开

另请参阅

||(定点设计师)|(定点设计师)|(MATLAB编码器)|(定点设计师)