主要内容

数字识别神经网络转换为定点并生成C代码

这个例子展示了如何将神经网络分类模型在仿真软件™定点使用定点工具和查找表的优化器。金宝app转换后,您可以使用仿真软件编码器生成C代码。金宝app

概述

使用定点工具,您可以将一个设计从浮点定点。节省内存使用查找表优化器生成的查找表替代无界等功能经验值log2。使用这些工具,这个例子展示了如何将一个训练有素的浮点型神经网络分类模型使用embedded-efficient定点数据类型。

数字分类和MNIST数据集

MNIST手写数字的数据集是一种常用的数据集的神经网络。为一个例子显示一个简单的方法来创建一个两层神经网络使用这个数据集,明白了人工神经网络对初学者

和神经网络训练数据

下载的培训和测试MNIST文件根据方向人工神经网络对初学者。加载数据和训练网络。

%加载数据tr = csvread (“train.csv”1 0);%读train.csv子= csvread (“test.csv”1 0);%读test.csv%准备数据n =大小(tr, 1);%的样本数据集目标= tr (: 1);| | % 1列标签目标(目标= = 0)= 10;%使用‘10’现在' 0 'targetsd = dummyvar(目标);%的标签转换成一个虚拟变量输入= tr(:, 2:结束);%的列是预测输入=输入';%的转置输入目标=目标”;%的转置目标targetsd = targetsd ';% '哑变量rng (1);%的再现性c = cvpartition (n,“坚持”、n / 3);%坚持1/3的数据集Xtrain =输入(:,培训(c));% 2/3的输入进行训练Ytrain = targetsd(:,培训(c));% 2/3的培训目标Xtest =输入(:,测试(c));%的1/3的输入进行测试欧美=目标(测试(c));%的1/3的目标检测Ytestd = targetsd(:,测试(c));% 1/3的哑变量进行测试%的列车网络的hiddenLayerSize = 100;网= patternnet (hiddenLayerSize);(净,tr) =火车(网,Xtrain, Ytrain);视图(净);输出=净(Xtest);错误= gsubtract(欧美、输出);性能=执行(欧美,净输出);图中,plotperform (tr);

关闭网络的观点。

nnet.guis.closeAllViews ();

模型准备定点转换

训练后的网络,使用gensim从深度学习工具箱™函数生成一个仿真软件模型。金宝app

sys_name = gensim(网络,“名字”,“mTrainedNN”);

生成的模型gensim函数包含了神经网络训练的重量和偏见。准备训练神经网络转换为定点通过启用日志输出的信号网络,并添加输入刺激和验证。修改后的模型fxpdemo_mnist_classification

打开并检查模型。

模型=“fxpdemo_mnist_classification”;system_under_design =[模型' /模式识别神经网络的];baseline_output =[模型' / yarr '];open_system(模型);

打开定点工具,右键单击函数并选择合适的神经网络子系统定点的工具。另外,使用的命令行界面定点工具。定点工具和命令行界面帮助您准备您的模型转换,并将系统转换为定点。您可以使用定点工具来收集范围和溢出仪表的对象模型通过仿真和范围分析。在这个示例中,使用的命令行界面定点工具将神经网络转换为定点。

转换器= DataTypeWorkflow.Converter (system_under_design);

运行仿真收集范围

模拟模型与仪器收集范围。使仪器使用收集使用双覆盖范围的快捷方式。保存仿真运行使用在以后的步骤。

converter.applySettingsFromShortcut (收集使用双覆盖范围的);collect_ranges = converter.CurrentRunName;sim_out = converter.simulateSystem ();

情节转换前的正确分类率建立基线的行为。

plotConfusionMatrix (sim_out baseline_output system_under_design,“之前分类率转换”);

提出定点数据类型

定点工具使用范围信息通过模拟块提出定点数据类型下的系统设计。在这个例子中,确保工具提出签署的数据类型中的所有模块子系统,禁用ProposeSignedness选项ProposalSettings对象。

ps = DataTypeWorkflow.ProposalSettings;转换器。proposeDataTypes (collect_ranges、ps);

应用提出的数据类型

默认情况下,定点工具适用于所有的数据类型。使用applyDataTypes方法应用的数据类型。如果你想只应用建议的一个子集,在定点工具使用接受复选框来指定您想应用的建议。

converter.applyDataTypes (collect_ranges);

验证数据类型

提出应正确处理所有可能的输入类型。设置模型来模拟使用新应用的类型,模拟模型,观察到神经网络回归精度转换后保持不变。

converter.applySettingsFromShortcut (的范围与指定的数据类型集合);sim_out = converter.simulateSystem ();

情节的正确分类率定点模型。

plotConfusionMatrix (sim_out baseline_output system_under_design,“定点后分类率转换”);

激活函数替换为一个优化的查找表

更高效的代码,取代第一层中的双曲正切激活函数与一个查找表或CORDIC的实现。在这个例子中,使用查找表优化器查找表来取代双曲正切。在这个例子中,指定EvenPow2Spacing断点间距的更快的执行速度。

block_path = [system_under_design“图层1 / tansig”];p = FunctionApproximation.Problem (block_path);p.Options。字= 16;p.Options。BreakpointSpecification =“EvenPow2Spacing”;解决方案= p.solve;solution.replaceWithApproximate;
| | ID内存(位)| |可行的表大小|断点WLs | TableData西城| BreakpointSpecification |错误(Max、电流)| | 0 | 64 | 0 | 2 | 16 | | EvenPow2Spacing | 7.812500 e 03, 1.000000 e + 00 | | 1 | 8224 | 1 | 512 | 16 | | EvenPow2Spacing | 7.812500 e 03, 1.525879 e 03 | | 2 | 4128 | 1 | 256 | 16 | | EvenPow2Spacing | 7.812500 e 03, 5.981445 e 03 | | 3 | 2080 | 0 | 128 | 16 | | EvenPow2Spacing | 7.812500 e 03, 2.331543 e-02 |最佳解决方案| | ID内存(位)| |可行的表大小|断点WLs | TableData西城| BreakpointSpecification |错误(Max、电流)| | 2 | 4128 | 1 | 256 | 16 | | EvenPow2Spacing | 7.812500 e 03, 5.981445 e 03 |

遵循相同的步骤来取代经验值函数将softmax实现在第二层一个查找表。

block_path = [system_under_design/ 2层/ softmax /经验的];p = FunctionApproximation.Problem (block_path);p.Options。字= 16;p.Options。BreakpointSpecification =“EvenPow2Spacing”;

得到一个优化的查找表,定义输入有限的上下界限。

p。InputLowerBounds = -40;p。InputUpperBounds = 0;解决方案= p.solve;solution.replaceWithApproximate;
| | ID内存(位)| |可行的表大小|断点WLs | TableData西城| BreakpointSpecification |错误(Max、电流)| | 0 | 64 | 0 | 2 | 16 | | EvenPow2Spacing | 7.812500 e 03, 9.996643 e-01 | | 1 | 2608 | 1 | 161 | 16 | | EvenPow2Spacing | 7.812500 e 03, 6.907394 e 03 | | 2 | 1328 | 0 | 81 | 16 | | EvenPow2Spacing | 7.812500 e 03, 2.451896 e-02 |最佳解决方案| | ID内存(位)| |可行的表大小|断点WLs | TableData西城| BreakpointSpecification |错误(Max、电流)| | 1 | 2608 | 1 | 161 | 16 | | EvenPow2Spacing | 7.812500 e 03, 6.907394 e 03 |

验证模型的准确性后替换查找表的函数近似。

converter.applySettingsFromShortcut (converter.ShortcutsForSelectedSystem {2});sim_out = converter.simulateSystem;plotConfusionMatrix (sim_out baseline_output system_under_design,分类率函数替换后的);

生成C代码

生成C代码,右键单击函数拟合神经网络子系统、选择C / c++代码>构建子系统。单击构建当提示输入可调参数的按钮。

引用

[1]LeCun (Y。,C. Cortes, and C. J. C. Burges. "The MNIST Database of Handwritten Digits."http://yann.lecun.com/exdb/mnist/

另请参阅

|