定点代码生成SVM的预测
这个例子展示了如何生成定点C / c++代码的支持向量机(SVM)的预测模型。金宝app相比一般的C / c++代码生成工作流、定点代码生成需要一个额外的步骤,定义了定点预测所需的变量的数据类型。通过创建一个定点数据类型结构generateLearnerDataTypeFcn
,使用的结构作为输入参数loadLearnerForCoder
在一个入口点函数。您还可以优化定点数据类型生成代码。
这个流程图显示了定点代码生成工作流。
训练支持向量机模型。
通过使用保存训练模型
saveLearnerForCoder
。定义定点预测所需的数据类型变量通过使用生成的数据类型的功能
generateLearnerDataTypeFcn
。定义一个入口点函数,通过使用两个加载模型
loadLearnerForCoder
和结构,然后调用预测
函数。(可选)优化定点数据类型。
生成定点C / c++代码。
验证所生成的代码。
第五步是一个可选的步骤来提高生成的定点代码的性能。为此,重复这两个步骤,直到您满意代码性能:
记录的最大和最小值预测变量使用
buildInstrumentedMex
(定点设计师)。查看检测结果使用
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
。然而,标准化的操作添加到定点代码可以降低精度,增加内存使用。相反,您可以手动进行标准化的数据集,如本例所示。还描述了如何检查内存使用的例子。
定点代码生成不支持表或分类数组。金宝app所以,定义预测数据X
使用一个数字矩阵,定义类标签Y
使用一个逻辑向量。一个逻辑向量使用内存最有效的二元分类问题。
X = table2array(台);Y = adultdata。工资= =“< = 50 k”;
定义观察权重w
。
w = adultdata.fnlwgt;
训练模型的内存使用增加模型的支持向量的个数增加。金宝app减少支持向量的个数,可以增加箱约束培训时使用金宝app“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.5版本(版本R2023a) %由MATLAB生成,03 - mar - 2023 10:47:22如果输入参数个数< 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
的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
如果您使用一个默认的分数转换比如说doublelogit
,分对数
,或symmetriclogit
——训练分类器,您可以更新结构T
包括一个查找表,接近得分转换函数。例如,看到的使用查找表来近似分数转换。
生成更详细的功能和结构,明白了数据类型的函数。
定义入口点函数
定义一个入口点函数命名myFixedPointPredict
做以下几点:
接受的预测数据
X
和定点数据类型结构T
。加载一个定点的训练支持向量机分类模型用两个
loadLearnerForCoder
和结构T。使用加载模型预测标签和分数。
函数(标签,分数)= myFixedPointPredict (X, T)% # codegenMdl = loadLearnerForCoder (“myMdl”,“数据类型”T);(标签,分数)=预测(Mdl X);结束
注意:如果单击按钮位于右上角的这个例子和开放的MATLAB®中的示例,然后用MATLAB打开示例文件夹。这个文件夹包含的入口点函数文件。
(可选)优化定点数据类型
通过使用优化定点数据类型buildInstrumentedMex
和showInstrumentationResults
。记录最大和最小值的命名和内部变量预测使用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
选择。计算通过使用柱状图
柱状图
选择。允许完整的代码生成支持通过使用金宝app
编码器
选择。
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
。
点击查看变量的直方图在变量选项卡。
窗口包含直方图,潜在的溢出和下溢的信息,和变量的数据类型。
通过使用明确结果clearInstrumentationResults
(定点设计师)。
clearInstrumentationResults (“myFixedPointPredict_instrumented”)
检验仪器的墨西哥人的功能
比较的输出预测
和myFixedPointPredict_instrumented
。
(标签、分数)=预测(Mdl standardizedX);labels_fx1 verify_labels1 = isequal(标签)
verify_labels1 =逻辑0
isequal
返回逻辑1(真正的)标签
和labels_fx1
是相等的。如果标签是不平等的,计算之间的比例不匹配的标签标签
和labels_fx1
。
diff_labels1 =总和(比较字符串(字符串(labels_fx1),字符串(标签))= = 0)/长度(labels_fx1) * 100
diff_labels1 = 0.1228
找到之间的相对差异分数的最大输出。
diff_scores1 = max (abs((双(scores_fx1(: 1)分数(:1))。/分数(:1)))
diff_scores1 = 54.6741
调定点数据类型
您可以调整定点数据类型,如果结果显示溢出或下溢的记录,或者如果你想要提高的精度生成的代码。通过更新修改定点数据类型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.5版本(版本R2023a) %由MATLAB生成,03 - mar - 2023 10:48:40如果输入参数个数< 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]
创建一个新的仪器的墨西哥人功能,记录结果,并通过查看结果buildInstrumentedMex
和showInstrumentationResults
。
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(: 1)分数(:1))。/分数(:1)))
diff_scores2 = 2.2859
两者的比例不匹配的标签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.0644
内存使用
一个好的实践是手动标准化之前预测数据训练模型。如果你使用“标准化”
名称-值对的观点相反,然后生成的定点代码包括标准化操作,这可能会导致损失精度和内存使用增加。
如果您生成一个静态库,你可以找到的内存使用生成的代码通过使用代码生成报告。指定配置:自由
生成一个静态库,并使用报告
选项来生成一个代码生成报告。
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配置:自由报告
另请参阅
loadLearnerForCoder
|saveLearnerForCoder
|buildInstrumentedMex
(定点设计师)|showInstrumentationResults
(定点设计师)|clearInstrumentationResults
(定点设计师)|codegen
(MATLAB编码器)|投
(定点设计师)|generateLearnerDataTypeFcn
|fi
(定点设计师)
相关的话题
- 定点数据类型(定点设计师)
- 在MATLAB中创建定点数据(定点设计师)
- 使用最小/最大仪表设置数据类型(定点设计师)