С MATLAB® Coder™ можно сгенерировать код для предсказания от уже обученной сверточной нейронной сети (CNN), предназначаясь для встроенной платформы, которая использует процессор ARM®, который поддерживает расширение NEON. Генератор кода использует в своих интересах ARM, Вычисляют Библиотеку для компьютерного зрения и машинного обучения. Сгенерированный код реализует CNN, который имеет архитектуру, слои и параметры, заданные во входе SeriesNetwork или DAGNetwork сетевой объект.
Сгенерируйте код при помощи одного из этих методов:
Интерфейс 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 с повторными изображениями или наблюдениями (N > 1), MiniBatchSize из больших, чем 1 не поддержан. Задайте MiniBatchSize из 1.
Когда вы сделали, чтобы MATLAB Поддержал Пакет для Оборудования Raspberry Pi, сгенерировал код для глубокого обучения на Raspberry Pi:
Чтобы соединиться с Raspberry Pi, используйте raspi. Например:
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_raspi_predict -args {ones(227, 227, 3,'single')} -report
Можно задать входные параметры полуточности для генерации кода. Однако тип генератора кода бросает входные параметры к с одинарной точностью. Использование Deep Learning Toolbox арифметика с плавающей точкой, с одинарной точностью для всех расчетов в MATLAB.
Для примера смотрите Генерацию кода для Глубокого обучения на Raspberry Pi.
Чтобы сгенерировать код для глубокого обучения, когда у вас нет пакета аппаратной поддержки для цели:
Сгенерируйте код по хосту 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);
real32_T *getInputDataPointer();
real32_T *getOutputDataPointer();
~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.
Сгенерируйте код.
cnncodegen
Загрузите предварительно обученную сеть в MATLAB. Например:
net = alexnet;
Сгенерируйте код для CNN при помощи cnncodegen с 'targetlib' заданный как 'arm-compute'.
Укажите, что ARM Вычисляет версию Библиотеки и архитектуру ARM при помощи targetparams аргумент.
Например:
cnncodegen(net,'targetlib','arm-compute','targetparams',struct('ArmComputeVersion','19.05','ArmArchitecture','armv8'));
Если вы указываете, что версия ARM Вычисляет Библиотеку, которая является позже, чем 19,05, генератор кода производит код для 19,05. На цели ARM сгенерированный код может создать с более поздней версией библиотеки.
Запишите C++ основную функцию, которая вызывает predict.
Переместите файлы в оборудование ARM и создайте исполняемую программу.
Для примера смотрите, что Генерация кода для Нейронных сетей для глубокого обучения с ARM Вычисляет Библиотеку.
cnncodegen команда генерирует Код С++ и make-файл, cnnbuild_rtw.mk. Сгенерированные файлы находятся в codegen папка. Не компилируйте сгенерированный код на хосте MATLAB. Переместите сгенерированный код в целевую платформу ARM для компиляции.
Серийная Сеть сгенерирована как класс C++, содержащий массив классов слоя.
class CnnMain
{
...
public:
CnnMain();
...
void setup();
void predict();
void cleanup();
...
real32_T *getInputDataPointer();
real32_T *getOutputDataPointer();
~CnnMain();
};setup() метод класса настраивает указатели и выделяет память для каждого слоя сетевого объекта. predict() метод вызывает предсказание для каждого из слоев в сети.
void CnnMain::predict()
{
int32_T idx;
for (idx = 0; idx < 25; idx++) {
this->layers[idx]->predict();
}
}Двоичные файлы экспортируются для слоев, которые имеют параметры такой, как полностью соединено и слои свертки в сети. Например, файлы cnn_CnnMain_conv*_w и cnn_CnnMain_conv*_b соответствуйте весам и сместите параметры для слоев свертки в сети.
cnn_CnnMain_avg cnn_CnnMain_conv5_w cnn_CnnMain_conv1_b cnn_CnnMain_fc6_b cnn_CnnMain_conv1_w cnn_CnnMain_fc6_w cnn_CnnMain_conv2_b cnn_CnnMain_fc7_b cnn_CnnMain_conv2_w cnn_CnnMain_fc7_w cnn_CnnMain_conv3_b cnn_CnnMain_fc8_b cnn_CnnMain_conv3_w cnn_CnnMain_fc8_w cnn_CnnMain_conv4_b cnn_CnnMain_labels.txt cnn_CnnMain_conv4_w cnn_CnnMain_conv5_b
cnncodegen | coder.ARMNEONConfig | coder.DeepLearningConfig | coder.loadDeepLearningNetwork