Этот пример показывает, как преобразовать модель регрессии нейронной сети в Simulink в фиксированную точку с помощью Fixed-Point Tool и Lookup Table Optimizer и сгенерировать код С с помощью Simulink Coder.
Fixed-Point Designer предоставляет рабочие процессы через Инструмент с фиксированной точкой, который может преобразовать проект из типов данных с плавающей точкой в типы данных с фиксированной точкой. Этот Lookup Table Optimizer генерирует замены интерполяционных таблиц, эффективные для памяти, для неограниченных функций, таких как exp
и log2
. Используя эти инструменты, в этом примере показано, как преобразовать обученную модель регрессии нейронной сети с плавающей точкой для использования встроенных эффективных типов данных с фиксированной точкой.
The 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, щелкните правой нажатие кнопки подсистему Function Fitting Neural Network и выберите Fixed-Point Tool
. Кроме того, используйте интерфейс командной строки Fixed-Point Tool. Fixed Point Инструмента и интерфейс командной строки обеспечивают шаги рабочего процесса для подготовки модели для преобразования фиксированной точки, инструментирования области значений и переполнения объектов с помощью симуляции и анализа области значений, однородного исследования wordlength для набора данных фиксированной точки и дополнительной диагностики переполнения.
converter = DataTypeWorkflow.Converter(system_under_design);
Симулируйте модель с инструментированием, чтобы собрать области значений. Это достигается нажатием кнопки «Собрать области значений» в инструменте или при помощи следующих команд.
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™, щелкните правой кнопкой мыши по Подсистеме Function Fitting Neural Network, выберите C/C + + Code > Build Subsystem, затем нажмите кнопку Build при запросе настраиваемых параметров. Можно также сгенерировать код с помощью следующей команды. slbuild('fxpdemo_neuralnet_regression_toconvert/Function Fitting Neural Network')