Преобразуйте Алгоритмы Нейронной сети в Фиксированную точку с помощью fxpopt и Сгенерируйте HDL-код

В этом примере показано, как преобразовать модель регрессии нейронной сети в Simulink к фиксированной точке с помощью fxpopt функция и Оптимизатор Интерполяционной таблицы.

Панорама

Fixed-Point Designer обеспечивает рабочие процессы через Инструмент Фиксированной точки, который может преобразовать проект от типов данных с плавающей точкой до типов данных с фиксированной точкой. fxpopt функция оптимизирует типы данных в основанном на модели в заданной системе поведенческие ограничения. Для получения дополнительной информации отошлите к ссылке на документацию https://www.mathworks.com/help/fixedpoint/ref/fxpopt.html, Оптимизатор Интерполяционной таблицы генерирует эффективные памятью замены интерполяционной таблицы для неограниченных функций, таких как exp и log2. Используя эти инструменты, этот пример демонстрирует, как преобразовать обученную модель регрессии нейронной сети с плавающей точкой, чтобы использовать встроено-эффективные типы данных с фиксированной точкой.

Сеть передачи данных и обучение нейронной сети

Neural Network Toolbox поставляется с engine_dataset который содержит данные, представляющие отношение между топливным уровнем и скоростью механизма, и его крутящим моментом и выбросами газа.

% Use the function fitting tool (nftool) from Neural Network Toolbox(TM) to
% train a neural network to estimate torque and gas emissions of an engine
% given the fuel rate and speed. Use the following commands to train
% the neural network.
load engine_dataset;
x = engineInputs;
t = engineTargets;
net = fitnet(10);
net = train(net,x,t);
view(net)

Закройте все окна учебного инструмента и представление сети.

nnet.guis.closeAllViews();
nntraintool('close');

Подготовка модели к преобразованию фиксированной точки

Если сеть обучена, используйте gensim функция от Нейронной сети Toolbox™, чтобы сгенерировать модель Simulink.

[sysName, netName] = gensim(net, 'Name', 'mTrainedNN'); %#ok

Модель сгенерирована gensim функция содержит нейронную сеть с обученными весами и смещениями. Чтобы подготовить эту сгенерированную модель к преобразованию фиксированной точки, выполните шаги подготовки в инструкциях по лучшым практикам. https://www.mathworks.com/help/fixedpoint/ug/best-practices-for-using-the-fixed-point-tool-to-propose-data-types-for-your-simulink-model.html

После применения этих принципов обученная нейронная сеть далее изменяется, чтобы включить логгирование сигнала при выходе сети, добавить входные стимулы и блоки верификации. Модифицированная модель сохранена как fxpdemo_neuralnet_regression.

Скопируйте модель во временную перезаписываемую директорию.

model = 'fxpdemo_neuralnet_regression';

current_dir = pwd;
fxpnn_demo_dir = fullfile(matlabroot, 'toolbox', 'simulink', 'fixedandfloat', 'fxpdemos');
fxpnn_temp_dir = [tempdir 'fxpnn_dir'];

cd(tempdir);
[~, ~, ~] = rmdir(fxpnn_temp_dir, 's');
mkdir(fxpnn_temp_dir);
cd(fxpnn_temp_dir);

copyfile(fullfile(fxpnn_demo_dir, [model,'.slx']), fullfile(fxpnn_temp_dir, [model '_toconvert.slx']));

Откройте и смотрите модель.

model = [model '_toconvert'];
system_under_design = [model '/Function Fitting Neural Network'];
baseline_output = [model '/yarr'];
open_system(model);

% Set up model for HDL code generation
hdlsetup(model);
### <a href="matlab:configset.internal.open('fxpdemo_neuralnet_regression_toconvert','SingleTaskRateTransMsg')">SingleTaskRateTransMsg</a> value is set from 'none' to 'error' (<a href="matlab:set_param('fxpdemo_neuralnet_regression_toconvert','SingleTaskRateTransMsg', 'none')">revert</a>).
### <a href="matlab:configset.internal.open('fxpdemo_neuralnet_regression_toconvert','Solver')">Solver</a> value is set from 'FixedStepAuto' to 'FixedStepDiscrete' (<a href="matlab:set_param('fxpdemo_neuralnet_regression_toconvert','Solver', 'FixedStepAuto')">revert</a>).
### <a href="matlab:configset.internal.open('fxpdemo_neuralnet_regression_toconvert','AlgebraicLoopMsg')">AlgebraicLoopMsg</a> value is set from 'warning' to 'error' (<a href="matlab:set_param('fxpdemo_neuralnet_regression_toconvert','AlgebraicLoopMsg', 'warning')">revert</a>).
### <a href="matlab:configset.internal.open('fxpdemo_neuralnet_regression_toconvert','BlockReduction')">BlockReduction</a> value is set from 'on' to 'off' (<a href="matlab:set_param('fxpdemo_neuralnet_regression_toconvert','BlockReduction', 'on')">revert</a>).
### <a href="matlab:configset.internal.open('fxpdemo_neuralnet_regression_toconvert','ConditionallyExecuteInputs')">ConditionallyExecuteInputs</a> value is set from 'on' to 'off' (<a href="matlab:set_param('fxpdemo_neuralnet_regression_toconvert','ConditionallyExecuteInputs', 'on')">revert</a>).
### <a href="matlab:configset.internal.open('fxpdemo_neuralnet_regression_toconvert','DefaultParameterBehavior')">DefaultParameterBehavior</a> value is set from 'Tunable' to 'Inlined' (<a href="matlab:set_param('fxpdemo_neuralnet_regression_toconvert','DefaultParameterBehavior', 'Tunable')">revert</a>).
### <a href="matlab:configset.internal.open('fxpdemo_neuralnet_regression_toconvert','ProdHWDeviceType')">ProdHWDeviceType</a> value is set from 'Intel->x86-64 (Windows64)' to 'ASIC/FPGA->ASIC/FPGA' (<a href="matlab:set_param('fxpdemo_neuralnet_regression_toconvert','ProdHWDeviceType', 'Intel->x86-64 (Windows64)')">revert</a>).
### The listed configuration parameter values are modified as a part of hdlsetup. Please refer to <a href="matlab:helpview(fullfile(docroot, 'hdlcoder', 'helptargets.map'), 'msg_hdlsetup_function')">hdlsetup</a> document for best practices on model settings.

Симулируйте модель, чтобы наблюдать производительность модели при использовании типов данных с плавающей точкой с двойной точностью.

sim_out = sim(model, 'SaveFormat', 'Dataset');

plotRegression(sim_out, baseline_output, system_under_design, 'Regression before conversion');

Задайте систему поведенческие ограничения для преобразования фиксированной точки

opts = fxpOptimizationOptions();
opts.addTolerance(system_under_design, 1, 'RelTol', 0.05);
opts.addTolerance(system_under_design, 1, 'AbsTol', 50)
opts.AllowableWordLengths = 8:32;

Оптимизируйте типы данных

Используйте fxpopt функция, чтобы оптимизировать типы данных в системе в соответствии с проектом и исследовать решение. Программное обеспечение анализирует область значений объектов в system_under_design и wordlength и ограничения допуска заданы в opts применять типы гетерогенных данных к модели при минимизации общей битной ширины.

solution  = fxpopt(model, system_under_design, opts);
best_solution = solution.explore; %#ok
	+ Preprocessing
	+ Modeling the optimization problem
		- Constructing decision variables
	+ Running the optimization solver
		- Evaluating new solution: cost 483, does not meet the tolerances.
		- Evaluating new solution: cost 541, does not meet the tolerances.
		- Evaluating new solution: cost 599, does not meet the tolerances.
		- Evaluating new solution: cost 657, does not meet the tolerances.
		- Evaluating new solution: cost 715, does not meet the tolerances.
		- Evaluating new solution: cost 773, does not meet the tolerances.
		- Evaluating new solution: cost 831, does not meet the tolerances.
		- Evaluating new solution: cost 889, meets the tolerances.
		- Updated best found solution, cost: 889
		- Evaluating new solution: cost 885, meets the tolerances.
		- Updated best found solution, cost: 885
		- Evaluating new solution: cost 875, meets the tolerances.
		- Updated best found solution, cost: 875
		- Evaluating new solution: cost 874, meets the tolerances.
		- Updated best found solution, cost: 874
		- Evaluating new solution: cost 873, meets the tolerances.
		- Updated best found solution, cost: 873
		- Evaluating new solution: cost 872, meets the tolerances.
		- Updated best found solution, cost: 872
		- Evaluating new solution: cost 871, meets the tolerances.
		- Updated best found solution, cost: 871
		- Evaluating new solution: cost 870, meets the tolerances.
		- Updated best found solution, cost: 870
		- Evaluating new solution: cost 869, meets the tolerances.
		- Updated best found solution, cost: 869
		- Evaluating new solution: cost 868, meets the tolerances.
		- Updated best found solution, cost: 868
		- Evaluating new solution: cost 867, meets the tolerances.
		- Updated best found solution, cost: 867
		- Evaluating new solution: cost 857, meets the tolerances.
		- Updated best found solution, cost: 857
		- Evaluating new solution: cost 856, meets the tolerances.
		- Updated best found solution, cost: 856
		- Evaluating new solution: cost 855, meets the tolerances.
		- Updated best found solution, cost: 855
		- Evaluating new solution: cost 854, meets the tolerances.
		- Updated best found solution, cost: 854
		- Evaluating new solution: cost 853, meets the tolerances.
		- Updated best found solution, cost: 853
		- Evaluating new solution: cost 852, meets the tolerances.
		- Updated best found solution, cost: 852
		- Evaluating new solution: cost 847, meets the tolerances.
		- Updated best found solution, cost: 847
		- Evaluating new solution: cost 846, meets the tolerances.
		- Updated best found solution, cost: 846
		- Evaluating new solution: cost 841, does not meet the tolerances.
		- Evaluating new solution: cost 845, meets the tolerances.
		- Updated best found solution, cost: 845
		- Evaluating new solution: cost 837, meets the tolerances.
		- Updated best found solution, cost: 837
		- Evaluating new solution: cost 836, meets the tolerances.
		- Updated best found solution, cost: 836
		- Evaluating new solution: cost 832, does not meet the tolerances.
		- Evaluating new solution: cost 826, meets the tolerances.
		- Updated best found solution, cost: 826
		- Evaluating new solution: cost 825, meets the tolerances.
		- Updated best found solution, cost: 825
		- Evaluating new solution: cost 824, meets the tolerances.
		- Updated best found solution, cost: 824
		- Evaluating new solution: cost 823, meets the tolerances.
		- Updated best found solution, cost: 823
		- Evaluating new solution: cost 822, meets the tolerances.
		- Updated best found solution, cost: 822
		- Evaluating new solution: cost 821, meets the tolerances.
		- Updated best found solution, cost: 821
		- Evaluating new solution: cost 820, meets the tolerances.
		- Updated best found solution, cost: 820
		- Evaluating new solution: cost 819, meets the tolerances.
		- Updated best found solution, cost: 819
		- Evaluating new solution: cost 818, meets the tolerances.
		- Updated best found solution, cost: 818
		- Evaluating new solution: cost 808, meets the tolerances.
		- Updated best found solution, cost: 808
		- Evaluating new solution: cost 807, meets the tolerances.
		- Updated best found solution, cost: 807
		- Evaluating new solution: cost 806, meets the tolerances.
		- Updated best found solution, cost: 806
		- Evaluating new solution: cost 805, meets the tolerances.
		- Updated best found solution, cost: 805
		- Evaluating new solution: cost 804, meets the tolerances.
		- Updated best found solution, cost: 804
		- Evaluating new solution: cost 803, meets the tolerances.
		- Updated best found solution, cost: 803
		- Evaluating new solution: cost 798, meets the tolerances.
		- Updated best found solution, cost: 798
		- Evaluating new solution: cost 797, meets the tolerances.
		- Updated best found solution, cost: 797
		- Evaluating new solution: cost 792, does not meet the tolerances.
		- Evaluating new solution: cost 796, does not meet the tolerances.
		- Evaluating new solution: cost 789, meets the tolerances.
		- Updated best found solution, cost: 789
		- Evaluating new solution: cost 788, meets the tolerances.
		- Updated best found solution, cost: 788
		- Evaluating new solution: cost 784, meets the tolerances.
		- Updated best found solution, cost: 784
		- Evaluating new solution: cost 774, does not meet the tolerances.
	+ Optimization has finished.
		- Neighborhood search complete.
		- Maximum number of iterations completed.
	+ Fixed-point implementation that met the tolerances found.
		- Total cost: 784
		- Maximum absolute difference: 53.582715
		- Use the explore method of the result to explore the implementation.

Проверьте точность модели после преобразования путем симуляции модели.

sim_out = sim(model, 'SaveFormat', 'Dataset');

Постройте точность регрессии модели фиксированной точки.

plotRegression(sim_out, baseline_output, system_under_design, 'Regression after conversion');

Замените функцию активации на оптимизированную интерполяционную таблицу

Функция Активации Tanh в Слое 1 может быть заменена или интерполяционной таблицей или реализацией CORDIC для более эффективной генерации фиксированной точки. В этом примере мы будем использовать Оптимизатор Интерполяционной таблицы, чтобы получить интерполяционную таблицу как замену для tanh. Мы будем использовать EvenPow2Spacing для более быстрой скорости выполнения. Для получения дополнительной информации см. https://www.mathworks.com/help/fixedpoint/ref/functionapproximation.options-class.html.

block_path = [system_under_design '/Layer 1/tansig'];
p = FunctionApproximation.Problem(block_path);
p.Options.WordLengths = 8:32;
p.Options.BreakpointSpecification = 'EvenPow2Spacing';
solution  = p.solve;
solution.replaceWithApproximate;
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) | 
|   0 |             46 |        0 |          2 |              15 |            8 |         EvenPow2Spacing |     7.812500e-03, 1.000000e+00 |
|   1 |           8222 |        1 |       1024 |              15 |            8 |         EvenPow2Spacing |     7.812500e-03, 7.812500e-03 |
|   2 |           8212 |        1 |       1024 |              10 |            8 |         EvenPow2Spacing |     7.812500e-03, 7.812500e-03 |
|   3 |           4126 |        1 |        512 |              15 |            8 |         EvenPow2Spacing |     7.812500e-03, 7.812500e-03 |
|   4 |           4114 |        1 |        512 |               9 |            8 |         EvenPow2Spacing |     7.812500e-03, 7.812500e-03 |
|   5 |             48 |        0 |          2 |              15 |            9 |         EvenPow2Spacing |     7.812500e-03, 1.000000e+00 |
|   6 |             50 |        0 |          2 |              15 |           10 |         EvenPow2Spacing |     7.812500e-03, 1.000000e+00 |
|   7 |             52 |        0 |          2 |              15 |           11 |         EvenPow2Spacing |     7.812500e-03, 1.000000e+00 |
|   8 |             54 |        0 |          2 |              15 |           12 |         EvenPow2Spacing |     7.812500e-03, 1.000000e+00 |
|   9 |             56 |        0 |          2 |              15 |           13 |         EvenPow2Spacing |     7.812500e-03, 1.000000e+00 |

Best Solution
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) |
|   4 |           4114 |        1 |        512 |               9 |            8 |         EvenPow2Spacing |     7.812500e-03, 7.812500e-03 |

Проверьте точность модели после функциональной замены

sim_out = sim(model, 'SaveFormat', 'Dataset');

Постройте точность регрессии после функциональной замены.

plotRegression(sim_out, baseline_output, system_under_design, 'Regression after function replacement');

Сгенерируйте HDL-код и испытательный стенд

Генерация HDL-кода требует лицензии HDL Coder™.

Выберите модель, для которой можно сгенерировать HDL-код и испытательный стенд.

systemname = 'fxpdemo_neuralnet_regression_toconvert/Function Fitting Neural Network';

Используйте временную директорию в сгенерированных файлах.

workingdir = tempname;

Можно запустить следующую команду, чтобы проверять на совместимость генерации HDL-кода.

checkhdl(systemname,'TargetDirectory',workingdir);

Запустите следующую команду, чтобы сгенерировать HDL-код.

makehdl(systemname,'TargetDirectory',workingdir);

Запустите следующую команду, чтобы сгенерировать испытательный стенд.

makehdltb(systemname,'TargetDirectory',workingdir);

Очистка

close all;
Simulink.sdi.close;
clear engineInputs engineTargets net x t
clear h1 h2 h3
clear sim_out logsout nn_out yarr_out ypred actual
clear solution opts p
close_system(model, 0);
close_system(sysName, 0);
clear system_under_design model block_path
clear netName sysName
clear best_solution baseline_output
cd(current_dir);
status = rmdir(fxpnn_temp_dir, 's'); %#ok
clear fxpnn_demo_dir fxpnn_temp_dir current_dir status

Функции помощника

Создайте функцию, чтобы отобразить данные о регрессии на графике.

function plotRegression(sim_out, baseline_path, neural_network_output_path, plotTitle)

    nn_out = find(sim_out.logsout, 'BlockPath', neural_network_output_path);
    yarr_out = find(sim_out.logsout, 'BlockPath', baseline_path);

    ypred = nn_out{1}.Values.Data;
    actual = yarr_out{1}.Values.Data;

    figure;
    plotregression(double(ypred), actual, plotTitle);
end