С 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