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

В этом примере показано, как преобразовать модель регрессии нейронной сети в Simulink к фиксированной точке с помощью Fixed-Point Tool и Lookup Table Optimizer и сгенерировать код С с помощью Simulink Coder.

Обзор

Fixed-Point Designer обеспечивает рабочие процессы через Инструмент Фиксированной точки, который может преобразовать проект от типов данных с плавающей точкой до типов данных с фиксированной точкой. Lookup Table Optimizer генерирует эффективные памятью замены интерполяционной таблицы для неограниченных функций, таких как exp и log2. Используя эти инструменты, этот пример демонстрирует, как преобразовать обученную модель регрессии нейронной сети с плавающей точкой, чтобы использовать встроено-эффективные типы данных с фиксированной точкой.

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

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

load engine_dataset;

Используйте функцию подходящий инструмент nftool от Deep Learning Toolbox™, чтобы обучить нейронную сеть, чтобы оценить крутящий момент и выбросы газа механизмы, учитывая топливный уровень и скорость. Используйте следующие команды, чтобы обучить нейронную сеть.

x = engineInputs;
t = engineTargets;
net = fitnet(10);
net = train(net,x,t);
view(net)

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

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

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

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

sys_name = gensim(net, 'Name', 'mTrainedNN');

Модель сгенерирована 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

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

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

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

Чтобы открыть Fixed-Point Tool, щелкните правой кнопкой мыши по Функции, Соответствующей подсистеме Нейронной сети, и выберите Fixed-Point Tool. В качестве альтернативы используйте интерфейс командной строки Fixed-Point Tool. Инструмент Фиксированной точки и интерфейс командной строки обеспечивают шаги рабочего процесса для подготовки модели к преобразованию фиксированной точки, области значений и инструментированию переполнения объектов через симуляцию и анализ области значений, гомогенное wordlength исследование для ввода данных о фиксированной точке и дополнительной диагностики переполнения.

converter = DataTypeWorkflow.Converter(system_under_design);

Запустите симуляцию, чтобы собрать области значений

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

converter.applySettingsFromShortcut('Range collection using double override');

% Save simulation run name generated as collect_ranges. This run name is used in
% later steps to propose fixed point data types.
collect_ranges = converter.CurrentRunName;
sim_out = converter.simulateSystem();

Постройте точность регрессии перед преобразованием.

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

Предложите типы данных с фиксированной точкой

Информация об области значений, полученная из симуляции, может использоваться Fixed-Point Tool, чтобы предложить типы данных с фиксированной точкой для блоков в системе в соответствии с проектом. В этом примере, чтобы гарантировать, что инструменты предлагают подписанные типы данных для всех блоков в подсистеме, отключают ProposeSignedness опция в ProposalSettings объект.

ps = DataTypeWorkflow.ProposalSettings;
ps.ProposeSignedness  = false;
converter.proposeDataTypes(collect_ranges, ps);

Примените предложенные типы данных

По умолчанию Fixed-Point Tool применяет все предложенные типы данных. Используйте applyDataTypes метод, чтобы применить типы данных. Если вы хотите только применить подмножество предложений в использовании Fixed-Point Tool флажок Accept, чтобы задать предложения, что вы хотите применяться.

converter.applyDataTypes(collect_ranges);

Проверьте типы данных

Предложенные типы должны обработать все возможные входные параметры правильно. Установите модель симулировать использование недавно прикладных типов, симулировать модель и замечать, что точность регрессии нейронной сети сохраняется преобразование фиксированной точки сообщения.

converter.applySettingsFromShortcut('Range collection with specified data types');
sim_out = converter.simulateSystem();

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

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

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

Функция Активации Tanh в Слое 1 может быть заменена или интерполяционной таблицей или реализацией CORDIC для более эффективной генерации фиксированной точки. В этом примере мы будем использовать Lookup Table Optimizer, чтобы получить интерполяционную таблицу как замену для 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 = 16;
p.Options.BreakpointSpecification = 'EvenPow2Spacing';
solution  = p.solve;
solution.replaceWithApproximate;
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) | 
|   0 |             64 |        0 |          2 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 1.000000e+00 |
|   1 |          16416 |        1 |       1024 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 1.525879e-03 |
|   2 |           8224 |        1 |        512 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 5.981445e-03 |

Best Solution
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) |
|   2 |           8224 |        1 |        512 |              16 |           16 |         EvenPow2Spacing |     7.812500e-03, 5.981445e-03 |

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

converter.applySettingsFromShortcut(converter.ShortcutsForSelectedSystem{2});
sim_out = converter.simulateSystem;

Постройте точность регрессии.

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

Сгенерируйте код С

Чтобы сгенерировать код С с помощью Simulink Coder™, щелкните правой кнопкой по Функции, Соответствующей подсистеме Нейронной сети, выберите C/C ++ Code> Build Subsystem, затем нажмите кнопку Build, когда запрошено настраиваемые параметры. Можно также сгенерировать код при помощи следующей команды. slbuild('fxpdemo_neuralnet_regression_toconvert/Function Fitting Neural Network')