主要内容

定点代码生成SVM的预测

这个例子展示了如何生成定点C / c++代码的支持向量机(SVM)的预测模型。万博1manbetx相比一般的C / c++代码生成工作流、定点代码生成需要一个额外的步骤,定义了定点预测所需的变量的数据类型。通过创建一个定点数据类型结构generateLearnerDataTypeFcn,使用的结构作为输入参数loadLearnerForCoder在一个入口点函数。您还可以优化定点数据类型生成代码。

这个流程图显示了定点代码生成工作流。

  1. 训练支持向量机模型。

  2. 通过使用保存训练模型saveLearnerForCoder

  3. 定义定点预测所需的数据类型变量通过使用生成的数据类型的功能generateLearnerDataTypeFcn

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

  5. (可选)优化定点数据类型。

  6. 生成定点C / c++代码。

  7. 验证所生成的代码。

第五步是一个可选的步骤来提高生成的定点代码的性能。为此,重复这两个步骤,直到您满意代码性能:

  1. 记录的最大和最小值预测变量使用buildInstrumentedMex(定点设计师)

  2. 查看检测结果使用showInstrumentationResults(定点设计师)。然后,调整定点数据类型(如果有必要)为了防止溢出和下溢的,和提高精度的定点代码。

在这个工作流程中,您使用的数据类型定义的定点数据类型生成的函数generateLearnerDataTypeFcn。分离数据类型的变量算法使测试更简单。您可以通过编程方式切换数据类型浮点和定点之间通过使用函数输入参数的数据类型。同时,这个工作流是兼容手工定点转换工作流程(定点设计师)

数据进行预处理

加载census1994数据集。这个数据集由人口数据来自美国人口普查局用来预测一个人是否使超过50000美元一年。

负载census1994

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

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

打印的总结表。

总结(台)
变量:年龄:32561 x1双重价值:17分钟37 Max 90 education_num中位数:32561 x1双重价值:1分钟10马克斯16 capital_gain中位数:32561 x1双重价值:最小值0最大99999 capital_loss: 32561 x1双重价值:最小值0最大4356 hours_per_week: 32561 x1双重价值:最小值40 Max 99

变量的尺度是不一致的。在这种情况下,您可以训练一个模型使用一个标准化的数据集通过指定“标准化”名称-值对的观点fitcsvm。然而,标准化的操作添加到定点代码可以降低精度,增加内存使用。相反,您可以手动进行标准化的数据集,如本例所示。还描述了如何检查内存使用的例子。

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

X = table2array(台);Y = adultdata。工资= =“< = 50 k”;

定义观察权重w

w = adultdata.fnlwgt;

训练模型的内存使用增加模型的支持向量的个数增加。万博1manbetx减少支持向量的个数,可以增加箱约束培训时使用万博1manbetx“BoxConstraint”名称-值对的观点或者使用子样品代表数据集进行训练。注意,增加箱约束会导致更长的训练时间,并使用子样品的数据集可以减少训练模型的准确性。在本例中,您从数据集和随机样本1000名观察使用子样品数据进行训练。

rng (“默认”)%的再现性[X_sampled, idx] = datasample (X, 1000,“替换”、假);Y_sampled = Y (idx);w_sampled = w (idx);

发现加权均值和标准差的培训模型使用“重量”“标准化”名称-值对参数。

tempMdl = fitcsvm (X_sampled Y_sampled,“重量”w_sampled,“KernelFunction”,“高斯”,“标准化”,真正的);μ= tempMdl.Mu;σ= tempMdl.Sigma;

如果你不使用“成本”,“之前”,或“重量”名称-值对参数进行训练,那么你可以找到使用的平均值和标准偏差值zscore函数。

[standardizedX_sampled、μ、σ]= zscore (X_sampled);

通过使用标准化的预测数据μσ

standardizedX = (xμ)。/σ;standardizedX_sampled = standardizedX (idx:);

您可以使用一组测试数据来验证训练模型和测试仪器的墨西哥人的功能。指定一个测试数据集和规范测试通过使用预测数据μσ

XTest = table2array(成人(:{“年龄”,“education_num”,“capital_gain”,“capital_loss”,“hours_per_week”}));standardizedXTest = (XTest-mu)。/σ;欧美=成人。工资= =“< = 50 k”;

火车模型

火车一个二进制SVM分类模型。

Mdl = fitcsvm (standardizedX_sampled Y_sampled,“重量”w_sampled,“KernelFunction”,“高斯”);

Mdl是一个ClassificationSVM模型。

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

损失(Mdl standardizedX_sampled Y_sampled)
ans = 0.1663
损失(Mdl standardizedXTest、欧美)
ans = 0.1905

支持向量机分类器分类大约17%的训练数据和测试数据的19%。

保存模型

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

saveLearnerForCoder (Mdl“myMdl”);

定点数据类型定义

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

generateLearnerDataTypeFcn (“myMdl”,(standardizedX;standardizedXTest])

generateLearnerDataTypeFcn生成myMdl_datatype函数。显示的内容myMdl_datatype.m通过使用类型函数。

类型myMdl_datatype.m
函数T = myMdl_datatype (dt) % myMdl_datatype为定点定义数据类型生成代码% % T = myMdl_datatype (dt)返回的数据类型结构T,它定义了%所需的变量的数据类型生成定点C / c++代码%机器学习模型的预测。T的每个字段包含一个%定点fi返回的对象。输入参数dt指定%定点对象的数据类型属性。dt指定为“固定”(默认)%定点代码生成或dt指定为“双”来模拟%浮点定点代码的行为。% %使用输出结构T作为一个入口点%函数的输入参数和第二内loadLearnerForCoder %入口点函数的输入参数。有关更多信息,请参见loadLearnerForCoder。%文件:myMdl_datatype。m %统计和机器学习工具箱12.3版本(版本R2022a) %由MATLAB生成,26 - 2月- 2022 15:23:25如果输入参数个数< 1 dt = '固定';结束%设置定点数学设置调频= fimath (“RoundingMethod”,“地板”,…‘OverflowAction’,‘包装’,…… 'ProductMode','FullPrecision', ... 'MaxProductWordLength',128, ... 'SumMode','FullPrecision', ... 'MaxSumWordLength',128); % Data type for predictor data T.XDataType = fi([],true,16,11,fm,'DataType',dt); % Data type for output score T.ScoreDataType = fi([],true,16,14,fm,'DataType',dt); % Internal variables % Data type of the squared distance dist = (x-sv)^2 for the Gaussian kernel G(x,sv) = exp(-dist), % where x is the predictor data for an observation and sv is a support vector T.InnerProductDataType = fi([],true,16,6,fm,'DataType',dt); end

注意:如果单击按钮位于右上角的这个例子和开放的MATLAB®中的示例,然后用MATLAB打开示例文件夹。这个文件夹包含的入口点函数文件。

myMdl_datatype函数使用默认字长(16),提出了最大一部分长度为避免溢出,基于默认字长(16)和安全保证金(10%)为每个变量。

创建一个结构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: 11 RoundingMethod:地板OverflowAction:包装ProductMode: FullPrecision MaxProductWordLength: 128 SumMode: FullPrecision MaxSumWordLength: 128

生成更详细的功能和结构,明白了数据类型的函数

定义入口点函数

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

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

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

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

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

(可选)优化定点数据类型

通过使用优化定点数据类型buildInstrumentedMexshowInstrumentationResults。记录最大和最小值的命名和内部变量预测使用buildInstrumentedMex。查看检测结果使用showInstrumentationResults;然后,根据结果,调整定点数据类型变量的属性。

指定入口点函数的输入参数类型

指定的输入参数类型myFixedPointPredict使用一个2×1单元阵列。

ARGS =细胞(2,1);

第一个输入参数是预测数据。的XDataType场的结构T指定的定点数据类型预测数据。转换X中指定的类型T.XDataType通过使用(定点设计师)函数。

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

测试数据集不具有相同的大小作为训练数据集。指定ARGS {1}通过使用coder.typeof(MATLAB编码器)所以墨西哥人可以适应输入函数。

ARGS {1} = coder.typeof (X_fx、大小(standardizedX) [1,0]);

第二个输入参数是结构T,它必须是一个编译时常量。使用coder.Constant(MATLAB编码器)指定T作为一个常数在代码生成。

ARGS {2} = coder.Constant (T);

创建测试墨西哥人函数

创建一个仪器的墨西哥人通过使用函数buildInstrumentedMex(定点设计师)

  • 指定的入口点函数的输入参数类型使用arg游戏选择。

  • 通过使用指定的墨西哥人函数名称- o选择。

  • 计算通过使用柱状图柱状图选择。

  • 允许完整的代码生成支持通过使用万博1manbetx编码器选择。

buildInstrumentedMexmyFixedPointPredictarg游戏arg游戏- omyFixedPointPredict_instrumented柱状图编码器
代码生成成功。

测试仪器的墨西哥人的功能

运行这个测试过的墨西哥人功能来记录测量结果。

[labels_fx1, scores_fx1] = myFixedPointPredict_instrumented (X_fx T);

您可以运行的墨西哥人多次函数来记录各种测试数据集的结果。运行这个测试过的墨西哥人使用函数standardizedXTest

Xtest_fx =投(standardizedXTest,“喜欢”,T.XDataType);[labels_fx1_test, scores_fx1_test] = myFixedPointPredict_instrumented (Xtest_fx T);

查看检测结果墨西哥人的功能

调用showInstrumentationResults(定点设计师)打开一个包含仪器结果的报告。查看模拟最小和最大值,提出部分长度、当前范围的百分比,整数的地位。

showInstrumentationResults (“myFixedPointPredict_instrumented”)

拟议中的单词长度和部分长度X是相同的吗XDataType结构T

点击查看变量的直方图变量选项卡。

窗口包含直方图和对话面板与有关变量的信息。这个窗口的信息,请参阅NumericTypeScope(定点设计师)参考页面。

通过使用明确结果clearInstrumentationResults(定点设计师)

clearInstrumentationResults (“myFixedPointPredict_instrumented”)

检验仪器的墨西哥人的功能

比较的输出预测myFixedPointPredict_instrumented

(标签、分数)=预测(Mdl standardizedX);labels_fx1 verify_labels1 = isequal(标签)
verify_labels1 =逻辑0

isequal返回逻辑1(真正的)标签labels_fx1是相等的。如果标签是不平等的,你可以计算的比例不正确分类标签,如下所示。

diff_labels1 =总和(比较字符串(字符串(labels_fx1),字符串(标签))= = 0)/长度(labels_fx1) * 100
diff_labels1 = 0.1228

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

diff_scores1 = max (abs (scores_fx1.double(: 1)分数(:1))。/分数(:1)))
diff_scores1 = 46.1118

调定点数据类型

您可以调整定点数据类型,如果结果显示溢出或下溢的记录,或者如果你想要提高的精度生成的代码。通过更新修改定点数据类型myMdl_datatype函数创建一个新的结构,然后使用新结构生成代码。更新myMdl_datatype功能,您可以手动修改定点数据类型在函数文件(myMdl_datatype.m)。或者,您可以通过使用生成功能generateLearnerDataTypeFcn并指定字长较长,如本例所示。更多细节,请参阅提示

函数生成一个新的数据类型。指定字长32和这个名字myMdl_datatype2为生成的功能。

generateLearnerDataTypeFcn (“myMdl”,(standardizedX;standardizedXTest),“字”32岁的“OutputFunctionName”,“myMdl_datatype2”)

显示的内容myMdl_datatype2.m

类型myMdl_datatype2.m
函数T = myMdl_datatype2 (dt) % myMdl_datatype2为定点定义数据类型生成代码% % T = myMdl_datatype2 (dt)返回的数据类型结构T,它定义了%所需的变量的数据类型生成定点C / c++代码%机器学习模型的预测。T的每个字段包含一个%定点fi返回的对象。输入参数dt指定%定点对象的数据类型属性。dt指定为“固定”(默认)%定点代码生成或dt指定为“双”来模拟%浮点定点代码的行为。% %使用输出结构T作为一个入口点%函数的输入参数和第二内loadLearnerForCoder %入口点函数的输入参数。有关更多信息,请参见loadLearnerForCoder。%文件:myMdl_datatype2。m %统计和机器学习工具箱12.3版本(版本R2022a) %由MATLAB生成,26 - 2月- 2022 15:24:14如果输入参数个数< 1 dt = '固定';结束%设置定点数学设置调频= fimath (“RoundingMethod”,“地板”,…‘OverflowAction’,‘包装’,…… 'ProductMode','FullPrecision', ... 'MaxProductWordLength',128, ... 'SumMode','FullPrecision', ... 'MaxSumWordLength',128); % Data type for predictor data T.XDataType = fi([],true,32,27,fm,'DataType',dt); % Data type for output score T.ScoreDataType = fi([],true,32,30,fm,'DataType',dt); % Internal variables % Data type of the squared distance dist = (x-sv)^2 for the Gaussian kernel G(x,sv) = exp(-dist), % where x is the predictor data for an observation and sv is a support vector T.InnerProductDataType = fi([],true,32,22,fm,'DataType',dt); end

myMdl_datatype2函数指定了单词长度32,提出了最大一部分长度,避免溢出。

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

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

创建一个新的仪器的墨西哥人功能,记录结果,并通过查看结果buildInstrumentedMexshowInstrumentationResults

X_fx2 =投(standardizedX,“喜欢”,T2.XDataType);buildInstrumentedMexmyFixedPointPredictarg游戏{X_fx2, coder.Constant (T2)}- omyFixedPointPredict_instrumented2柱状图编码器
代码生成成功。
[labels_fx2, scores_fx2] = myFixedPointPredict_instrumented2 (X_fx2, T2);showInstrumentationResults (“myFixedPointPredict_instrumented2”)

检查仪器的报告,然后明确结果。

clearInstrumentationResults (“myFixedPointPredict_instrumented2”)

验证myFixedPointPredict_instrumented2

labels_fx2 verify_labels2 = isequal(标签)
verify_labels2 =逻辑0
diff_labels2 =总和(比较字符串(字符串(labels_fx2),字符串(标签))= = 0)/长度(labels_fx2) * 100
diff_labels2 = 0.0031
diff_scores2 = max (abs (scores_fx2.double(: 1)分数(:1))。/分数(:1)))
diff_scores2 = 2.8556

的比例不正确分类标签diff_labels2和相对差异分数值diff_scores2小于那些从之前的墨西哥人函数使用默认生成字长(16)。

更多细节关于优化定点数据类型通过使用MATLAB®代码,查看参考页buildInstrumentedMex(定点设计师),showInstrumentationResults(定点设计师),clearInstrumentationResults(定点设计师)和例子使用最小/最大仪表设置数据类型(定点设计师)

生成代码

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

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

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

验证生成的代码

你可以验证myFixedPointPredict_mex功能是一样的,你验证的墨西哥人的功能。看到检验仪器的墨西哥人的功能部分细节。

[labels_sampled, scores_sampled] =预测(Mdl standardizedX_sampled);n =大小(standardizedX_sampled, 1);labels_fx = true (n, 1);scores_fx = 0 (n, 2);i = 1: n [labels_fx(我),scores_fx(我,:)]= myFixedPointPredict_mex (X_fx2 (idx(我):),T2);结束verify_labels = isequal (labels_sampled labels_fx)
verify_labels =逻辑1
diff_labels =总和(比较字符串(字符串(labels_fx),字符串(labels_sampled)) = = 0) /长度(labels_fx) * 100
diff_labels = 0
diff_scores = max (abs (scores_fx (: 1) -scores_sampled (: 1))。/ scores_sampled (: 1)))
diff_scores = 0.0632

内存使用

一个好的实践是手动标准化之前预测数据训练模型。如果你使用“标准化”名称-值对的观点相反,然后生成的定点代码包括标准化操作,这可能会导致损失精度和内存使用增加。

如果您生成一个静态库,你可以找到的内存使用生成的代码通过使用代码生成报告。指定配置:自由生成一个静态库,并使用报告选项来生成一个代码生成报告。

codegenmyFixedPointPredictarg游戏{coder.typeof (X_fx2 [1,5], [0]), coder.Constant (T2)}- omyFixedPointPredict_lib配置:自由报告

总结标签的代码生成报告,点击代码度量。函数信息部分显示了累积堆栈大小。

找到内存使用模型的训练“标准化”,“真正的”,您可以运行下面的代码。

Mdl = fitcsvm (X_sampled Y_sampled,“重量”w_sampled,“KernelFunction”,“高斯”,“标准化”,真正的);saveLearnerForCoder (Mdl“myMdl”);generateLearnerDataTypeFcn (“myMdl”[X;XTest),“字”32岁的“OutputFunctionName”,“myMdl_standardize_datatype”)T3 = myMdl_standardize_datatype (“固定”);X_fx3 =投(X_sampled,“喜欢”,T3.XDataType);codegenmyFixedPointPredictarg游戏{coder.typeof (X_fx3 [1,5], [0]), coder.Constant (T3)}- omyFixedPointPredict_standardize_lib配置:自由报告

另请参阅

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

相关的话题