С 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