С помощью 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