exponenta event banner

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

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

Обзор

Fixed-Point Designer предоставляет рабочие процессы с помощью инструмента Fixed Point Tool, который может преобразовывать конструкцию из типов данных с плавающей запятой в типы данных с фиксированной запятой. Оптимизатор таблиц подстановки генерирует замены таблиц подстановки с эффективным использованием памяти для неограниченных функций, таких как 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 функция из Toolbox™ Deep Learning для создания модели 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, щелкните правой кнопкой мыши подсистему нейронной сети Function Fitting и выберите Fixed-Point Tool. Также можно использовать интерфейс командной строки инструмента «Фиксированная точка». Инструмент Fixed Point Tool и интерфейс командной строки предоставляют шаги рабочего процесса для подготовки модели к преобразованию фиксированных точек, измерению диапазона и переполнения объектов с помощью моделирования и анализа диапазона, однородного исследования длины слова для типизации данных фиксированных точек и дополнительной диагностики переполнения.

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);

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

По умолчанию инструмент «Фиксированная точка» применяет все предлагаемые типы данных. Используйте applyDataTypes для применения типов данных. Если требуется применить только подмножество предложений, в инструменте «Фиксированная точка» установите флажок «Принять», чтобы указать предложения, которые требуется применить.

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 для более эффективной генерации кода с фиксированной точкой. В этом примере мы будем использовать оптимизатор таблицы подстановки для получения таблицы подстановки в качестве замены 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');

Создать код C

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