С MATLAB® Coder™ можно сгенерировать код для предсказания от уже обученной сверточной нейронной сети (CNN), нацеленной на встроенную платформу, использующую ARM® процессор, поддерживающий расширение NEON. Генератор кода использует преимущества ARM Compute Library для компьютерного зрения и машинного обучения. Сгенерированный код реализует CNN, который имеет архитектуру, слои и параметры, указанные во входе SeriesNetwork
(Deep Learning Toolbox) или DAGNetwork
(Deep Learning Toolbox) сетевой объект.
Сгенерируйте код с помощью одного из следующих методов:
Интерфейс MATLAB Coder для библиотек глубокого обучения. Чтобы установить пакет поддержки, выберите его в меню Add-Ons MATLAB.
Библиотека ARM Compute Library для компьютерного зрения и машинного обучения должна быть установлена на целевом компьютере.
Deep Learning Toolbox™.
Переменные окружения для компиляторов и библиотек.
Примечание
Версия библиотеки ARM Compute, которую используют примеры в этой теме справки, возможно, не является последней версией, которая поддержки генерацию кода. Для поддерживаемых версий библиотек и для получения информации о настройке переменных окружения, смотрите Необходимые условия для глубокого обучения с MATLAB Coder.
codegen
Чтобы сгенерировать код для глубокого обучения на ARM-цели при помощи codegen
:
Написание функции точки входа, которая загружает предварительно обученный CNN и вызовы predict
. Для примера:
function out = squeezenet_predict(in) %#codegen persistent net; opencv_linkflags = '`pkg-config --cflags --libs opencv`'; coder.updateBuildInfo('addLinkFlags',opencv_linkflags); if isempty(net) net = coder.loadDeepLearningNetwork('squeezenet', 'squeezenet'); end out = net.predict(in); end
Если вашим целевым компьютером является Raspberry Pi™, можно воспользоваться пакетом поддержки MATLAB для Raspberry Pi Hardware. С пакетом поддержки, codegen
перемещает сгенерированный код в Raspberry Pi и создает исполняемую программу на Raspberry Pi. Когда вы генерируете код для цели, которая не имеет пакета аппаратной поддержки, вы должны запустить команды, чтобы переместить сгенерированные файлы и создать исполняемую программу.
Генерация MEX не поддерживается для генерации кода для глубокого обучения на целевых устройствах ARM.
Для ARM, для входов к predict
(Deep Learning Toolbox) с несколькими изображениями или наблюдениями (N > 1
), а MiniBatchSize
больше 1 не поддерживается. Задайте MiniBatchSize
от 1.
Когда у вас есть MATLAB Support Package for Raspberry Pi Hardware, чтобы сгенерировать код для глубокого обучения на Raspberry Pi:
Для подключения к Raspberry Pi используйте raspi
(Пакет поддержки MATLAB для оборудования Raspberry Pi). Для примера:
r = raspi('raspiname','username','password');
Создайте объект строения генерации кода для библиотеки или исполняемого файла при помощи coder.config
. Установите TargetLang
свойство к 'C++'
.
cfg = coder.config('exe'); cfg.TargetLang = 'C++';
Создайте объект строения глубокого обучения при помощи coder.DeepLearningConfig
. Установите ArmComputeVersion
и ArmArchitecture
свойства. Установите DeepLearningConfig
свойство объекта строения генерации кода к coder.ARMNEONConfig
объект. Для примера:
dlcfg = coder.DeepLearningConfig('arm-compute'); dlcfg.ArmArchitecture = 'armv7'; dlcfg.ArmComputeVersion = '19.05'; cfg.DeepLearningConfig = dlcfg;
Чтобы сконфигурировать аппаратные настройки генерации кода для Raspberry Pi, создайте coder.Hardware
объект, при помощи coder.hardware
. Установите Hardware
свойство объекта строения генерации кода к coder.Hardware
объект.
hw = coder.hardware('Raspberry Pi');
cfg.Hardware = hw;
Если вы генерируете исполняемую программу, предоставьте основную программу на C++. Для примера:
cfg.CustomSource = 'main.cpp';
Чтобы сгенерировать код, используйте codegen
. Задайте объект строения генерации кода при помощи -config
опция. Для примера:
codegen -config cfg squeezenet_predict -args {ones(227, 227, 3,'single')} -report
Примечание
Можно задать входы половинной точности для генерации кода. Однако тип генератора кода приводит входы к одинарной точности. Deep Learning Toolbox использует арифметику с одной точностью и плавающей точкой для всех расчетов в MATLAB.
Чтобы сгенерировать код для глубокого обучения, когда у вас нет пакета аппаратной поддержки для целевого устройства:
Сгенерируйте код на Linux® только хост.
Создайте объект строения для библиотеки. Для примера:
cfg = coder.config('lib');
Не используйте объект строения для исполняемой программы.
Сконфигурируйте генерацию кода, чтобы сгенерировать код С++ и сгенерировать только исходный код.
cfg.GenCodeOnly = true;
cfg.TargetLang = 'C++';
Чтобы задать генерацию кода с помощью ARM Compute Library, создайте coder.ARMNEONConfig
объект при помощи coder.DeepLearningConfig
. Установите ArmComputeVersion
и ArmArchitecture
свойства. Установите DeepLearningConfig
свойство объекта строения генерации кода к coder.ARMNEONConfig
объект.
dlcfg = coder.DeepLearningConfig('arm-compute'); dlcfg.ArmArchitecture = 'armv7'; dlcfg.ArmComputeVersion = '19.05'; cfg.DeepLearningConfig = dlcfg;
Чтобы сконфигурировать параметры генерации кода, специфичные для целевого компьютера, установите ProdHWDeviceType
свойство HardwareImplementation
объект.
Для архитектуры ARMv7 используйте 'ARM Compatible->ARM Cortex'
.
для архитектуры ARMv8 используйте 'ARM Compatible->ARM 64-bit (LP64)'
.
Для примера:
cfg.HardwareImplementation.ProdHWDeviceType = 'ARM Compatible->ARM 64-bit (LP64)';
Чтобы сгенерировать код, используйте codegen
. Задайте объект строения генерации кода при помощи -config
опция. Для примера:
codegen -config cfg squeezenet_predict -args {ones(227, 227, 3, 'single')} -d arm_compute
Для получения примера смотрите Code Generation for Deep Learning on ARM Targets.
Сеть серии генерируется как класс C++, содержащий массив классов слоев.
class b_squeezenet_0 { public: int32_T batchSize; int32_T numLayers; real32_T *inputData; real32_T *outputData; MWCNNLayer *layers[68]; private: MWTargetNetworkImpl *targetImpl; public: b_squeezenet_0(); void presetup(); void postsetup(); void setup(); void predict(); void cleanup(); real32_T *getLayerOutput(int32_T layerIndex, int32_T portIndex); ~b_squeezenet_0(); };
The setup()
метод класса настраивает указатели и выделяет память для каждого слоя сетевого объекта. The predict()
метод вызывает предсказание для каждого из слоев в сети. Предположим, что вы генерируете код для функции точки входа, squeezenet_predict
. В сгенерированном файле «for you», squeezenet_predict.cpp
, функцию точки входа squeeznet_predict()
создает статический объект b_squeezenet_0 типа классов и вызывает setup
и predict
на сетевом объекте.
static b_squeezenet_0 net; static boolean_T net_not_empty; // Function Definitions // // A persistent object net is used to load the DAGNetwork object. // At the first call to this function, the persistent object is constructed and // set up. When the function is called subsequent times, the same object is reused // to call predict on inputs, avoiding reconstructing and reloading the // network object. // Arguments : const real32_T in[154587] // real32_T out[1000] // Return Type : void // void squeezenet_predict(const real32_T in[154587], real32_T out[1000]) { // Copyright 2018 The MathWorks, Inc. if (!net_not_empty) { DeepLearningNetwork_setup(&net); net_not_empty = true; } DeepLearningNetwork_predict(&net, in, out); }
Двоичные файлы экспортируются для слоев, которые имеют параметры, такие как полносвязные и свертки в сети. Например, файлы с именами, имеющими шаблон cnn_squeezenet_*_w
и cnn_squeezenet_*_b
соответствуют весам и параметрам смещения для слоев свертки в сети.
cnn_squeezenet_conv10_b cnn_squeezenet_conv10_w cnn_squeezenet_conv1_b cnn_squeezenet_conv1_w cnn_squeezenet_fire2-expand1x1_b cnn_squeezenet_fire2-expand1x1_w cnn_squeezenet_fire2-expand3x3_b cnn_squeezenet_fire2-expand3x3_w cnn_squeezenet_fire2-squeeze1x1_b cnn_squeezenet_fire2-squeeze1x1_w ...
Смотрите Генерацию кода для квантованных нейронных сетей для глубокого обучения.
Выполните Select Source Files и Define Input Types шаги.
Переходите к Generate Code шагу. (Пропустите шаг Check for Run-Time Issues, поскольку генерация MEX не поддерживается для генерации кода с помощью библиотеки ARM Compute Library.)
Установите Language значение C++.
Укажите целевое оборудование ARM.
Если вашим целевым компьютером является Raspberry Pi, и вы установили пакет поддержки MATLAB для Raspberry Pi Hardware:
Для Hardware Board выберите Raspberry Pi
.
Для доступа к настройкам Raspberry Pi нажмите More Settings. Затем нажмите Hardware. Задайте Device Address, Username, Password и Build directory.
Когда у вас нет пакета поддержки для вашего ARM-целевого устройства:
Убедитесь, что Build type Static Library
или Dynamic Library
и установите флажок Generate code only.
Для Hardware Board выберите None - Select device below
.
Для Device vendor выберите ARM Compatible
.
Для Device type:
Для архитектуры ARMv7 выберите ARM Cortex
.
Для архитектуры ARMv8 выберите ARM 64-bit (LP64)
.
Примечание
Если вы генерируете код для глубокого обучения на ARM-цели и не используете пакет аппаратной поддержки, сгенерируйте код только на хосте Linux.
На панели Deep Learning задайте Target library ARM Compute
. Задайте ARM Compute Library version и ARM Compute Architecture.
Сгенерируйте код.
coder.ARMNEONConfig
| coder.DeepLearningConfig
| coder.loadDeepLearningNetwork