С помощью MATLAB ® Coder™ вы можете генерировать код для прогнозирования из уже обученной сверточной нейронной сети (CNN), ориентированной на встроенную платформу, использующую процессор ARM ®, поддерживающий расширение NEON. Генератор кода использует преимущества вычислительной библиотеки ARM для компьютерного зрения и машинного обучения. Созданный код реализует CNN, который имеет архитектуру, уровни и параметры, указанные на входеSeriesNetwork
(инструментарий глубокого обучения) или DAGNetwork
(Deep Learning Toolbox) сетевой объект.
Создайте код одним из следующих способов:
Интерфейс кодера MATLAB для библиотек глубокого обучения. Чтобы установить пакет поддержки, выберите его в меню Add-on MATLAB.
На целевом оборудовании должна быть установлена вычислительная библиотека ARM для компьютерного зрения и машинного обучения.
Toolbox™ глубокого обучения.
Переменные среды для компиляторов и библиотек.
Примечание
Версия библиотеки вычислений ARM, используемая в примерах в этом разделе справки, может не быть последней версией, поддерживаемой при создании кода. Поддерживаемые версии библиотек и сведения о настройке переменных среды см. в разделе Предварительные условия для глубокого обучения с помощью кодера MATLAB.
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. С пакетом поддержки, codegen
перемещает сгенерированный код в Raspberry Pi и строит исполняемую программу на Raspberry Pi. При создании кода для конечного объекта, не имеющего пакета аппаратной поддержки, необходимо выполнить команды для перемещения созданных файлов и построения исполняемой программы.
Генерация MEX не поддерживается для генерации кода для глубокого изучения целей ARM.
Для АРМ, для входов в predict
(Deep Learning Toolbox) с несколькими изображениями или наблюдениями (N > 1
), a MiniBatchSize
значение больше 1 не поддерживается. Укажите MiniBatchSize
из 1.
Если у вас есть пакет поддержки MATLAB для оборудования Raspberry Pi, чтобы создать код для глубокого обучения на 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
Примечание
Для создания кода можно задать входные данные с полуконкретностью. Однако тип генератора кода приводит входные данные к одинарной точности. Инструментарий глубокого обучения использует арифметику с одинарной точностью и плавающей запятой для всех вычислений в MATLAB.
Чтобы создать код для глубокого обучения, когда у вас нет пакета аппаратной поддержки для цели:
Создание кода только на хосте Linux ® .
Создайте объект конфигурации для библиотеки. Например:
cfg = coder.config('lib');
Не используйте объект конфигурации для исполняемой программы.
Настройте создание кода для создания кода C++ и только исходного кода.
cfg.GenCodeOnly = true;
cfg.TargetLang = 'C++';
Чтобы задать создание кода с помощью библиотеки вычислений ARM, создайте 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
Пример см. в разделе Создание кода для глубокого обучения по целям ARM.
Последовательная сеть создается как класс 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(); };
setup()
метод класса устанавливает дескрипторы и выделяет память для каждого уровня сетевого объекта. predict()
способ вызывает прогнозирование для каждого из уровней в сети. Предположим, что создается код для функции точки входа, squeezenet_predict
. В созданном файле «для вас »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).
Перейдите к шагу Создать код. (Пропустите шаг Проверка ошибок времени выполнения, поскольку генерация MEX не поддерживается для генерации кода с помощью библиотеки вычислений ARM.)
Установите язык на C++.
Укажите оконечное оборудование ARM.
Если целевым оборудованием является Raspberry Pi и установлен пакет поддержки MATLAB для оборудования Raspberry Pi:
Для платы аппаратных средств выберите Raspberry Pi
.
Чтобы получить доступ к настройкам Raspberry Pi, щелкните Дополнительные настройки. Затем щелкните Оборудование. Укажите адрес устройства, имя пользователя, пароль и каталог построения.
Если у вас нет пакета поддержки для цели ARM:
Убедитесь, что тип построения - Static Library
или Dynamic Library
и установите флажок Только генерировать код.
Для платы аппаратных средств выберите None - Select device below
.
Для параметра «Поставщик устройства» выберите ARM Compatible
.
Для типа устройства:
Для ARMv7 архитектуры выберите ARM Cortex
.
Для ARMv8 архитектуры выберите ARM 64-bit (LP64)
.
Примечание
Если вы создаете код для глубокого обучения на цели ARM и не используете пакет аппаратной поддержки, создайте код только на хосте Linux.
В области «Глубокое обучение» задайте для параметра «Целевая библиотека» значение ARM Compute
. Укажите версию библиотеки вычислений ARM и архитектуру вычислений ARM.
Создайте код.
coder.ARMNEONConfig
| coder.DeepLearningConfig
| coder.loadDeepLearningNetwork