С MATLAB® Coder™ можно сгенерировать код для предсказания от уже обученной сверточной нейронной сети (CNN), предназначаясь для встроенной платформы, которая использует процессор ARM®, который поддерживает расширение NEON. Генератор кода использует в своих интересах ARM, Вычисляют Библиотеку для компьютерного зрения и машинного обучения. Сгенерированный код реализует CNN, который имеет архитектуру, слои и параметры, заданные во входе SeriesNetwork
(Deep Learning Toolbox) или DAGNetwork
(Deep Learning Toolbox) сетевой объект.
Сгенерируйте код при помощи одного из этих методов:
Интерфейс MATLAB Coder для Библиотек Глубокого обучения. Чтобы установить пакет поддержки, выберите его из меню MATLAB Add-Ons.
ARM Вычисляет Библиотеку для компьютерного зрения, и машинное обучение должно быть установлено на целевом компьютере.
Deep Learning Toolbox™.
Переменные окружения для компиляторов и библиотек.
Для поддерживаемых версий библиотек и для получения информации о подготовке переменных окружения, смотрите Необходимые условия для Глубокого обучения для 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. С пакетом поддержки, codegen
перемещает сгенерированный код в Raspberry Pi и создает исполняемую программу на Raspberry Pi. Когда вы генерируете код для цели, которая не имеет пакета аппаратной поддержки, вы должны команды выполнения, чтобы переместить сгенерированные файлы и создать исполняемую программу.
Генерация MEX не поддерживается для генерации кода для глубокого обучения на целях ARM.
Для ARM, для входных параметров к predict
(Deep Learning Toolbox) с повторными изображениями или наблюдениями (N > 1
), 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
Примечание
Можно задать входные параметры полуточности для генерации кода. Однако тип генератора кода бросает входные параметры к с одинарной точностью. Использование Deep Learning Toolbox арифметика с плавающей точкой, с одинарной точностью для всех расчетов в MATLAB.
Чтобы сгенерировать код для глубокого обучения, когда у вас нет пакета аппаратной поддержки для цели:
Сгенерируйте код по хосту Linux® только.
Создайте объект настройки для библиотеки. Например:
cfg = coder.config('lib');
Не используйте объект настройки для исполняемой программы.
Сконфигурируйте генерацию кода, чтобы сгенерировать Код С++ и сгенерировать исходный код только.
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 ...
Завершите шаги Define Input Types и Select Source Files.
Перейдите к шагу Generate Code. (Пропустите шаг Check for Run-Time Issues, потому что генерация MEX не поддерживается для генерации кода с ARM, Вычисляют Библиотеку.)
Установите Language на C++.
Задайте целевое оборудование ARM.
Если вашим целевым компьютером является Raspberry Pi, и вы установили Пакет Поддержки MATLAB для Оборудования Raspberry Pi:
Для 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