С MATLAB® Coder™ можно сгенерировать код для прогноза от уже обученной сверточной нейронной сети (CNN), предназначаясь для встроенной платформы, которая использует процессор Intel®. Генератор кода использует в своих интересах Math Kernel Library Intel для Глубоких Нейронных сетей (MKL-DNN). Сгенерированный код реализует CNN с архитектурой, уровнями и параметрами, заданными во входном параметре сетевой объект DAGNetwork
или SeriesNetwork
.
Сгенерируйте код при помощи одного из этих методов:
Стандартная команда codegen
для генерации кода C/C++ из кода MATLAB.
Приложение MATLAB CODER.
Команда cnncodegen
, которая генерирует Код С++ и создает статическую библиотеку для CNN.
Когда вы генерируете код для нейронной сети при помощи codegen
или приложения MATLAB CODER, сгенерированный код использует главное столбцом размещение для ваших данных массива. Чтобы совпадать с главным строкой размещением, которое использует глубокая библиотека изучения, генератор кода должен вставить операции, чтобы преобразовать главное столбцом размещение в главное строкой размещение. Эти операции преобразования могут ухудшить производительность сгенерированного кода. Генерация кода для глубоких нейронных сетей изучения не поддерживает MATLAB CODER главные строкой опции, такие как параметр конфигурации RowMajor
.
На Windows® генерация кода для глубоких образовательных сетей с функцией codegen
требует Microsoft® Visual Studio® 2015 или позже.
Интерфейс MATLAB CODER для Глубокого Изучения Библиотек. Чтобы установить этот пакет поддержки, выберите его из меню MATLAB Add-Ons.
Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN)
Глубоко изучение Toolbox™.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Предпосылки для Глубокого Изучения с MATLAB CODER.
codegen
Напишите функцию точки входа в MATLAB что:
Использует функцию coder.loadDeepLearningNetwork
, чтобы загрузить глубокую модель изучения, и создать и настроить класс CNN.
Для получения дополнительной информации смотрите Загрузку Предварительно обученные Сети для Генерации кода.
Вызовы predict
, чтобы предсказать ответы.
Например:
function out = alexnet_predict(in) %#codegen % A persistent object mynet is used to load the series network object. % At the first call to this function, the persistent object is constructed and % setup. When the function is called subsequent times, the same object is reused % to call predict on inputs, thus avoiding reconstructing and reloading the % network object. persistent mynet; if isempty(mynet) mynet = coder.loadDeepLearningNetwork('alexnet'); end % pass in input out = predict(mynet,in);
Создайте объект настройки генерации кода для MEX или для статической или динамически подключаемой библиотеки. Чтобы задать параметры генерации кода для MKL-DNN, установите свойство DeepLearningConfig
на объект coder.MklDNNConfig
, который вы создаете с coder.DeepLearningConfig
.
cfg = coder.config('lib'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('mkldnn');
Запустите команду codegen
. Используйте опцию -config
, чтобы задать объект настройки. Используйте опцию -args
, чтобы задать входной тип. Входной размер соответствует входному размеру уровня сети AlexNet.
codegen -config cfg alexnet_predict -args {ones(227,227,3)} -report
Серийная сеть сгенерирована как класс C++, содержащий массив классов уровня.
class b_alexnet_0 { ... public: b_alexnet_0(); ... void setup(); void predict(); void cleanup(); ... ~b_alexnet_0(); };
Метод setup()
класса настраивает указатели и выделяет память для каждого уровня сетевого объекта. Метод predict()
вызывает прогноз для каждого из уровней в сети. В файле сгенерированного кода alexnet_predict.cpp
функция точки входа alexnet_predict()
создает статический объект b_alexnet_0 типа класса и вызывает настройку, и предскажите на этом сетевом объекте.
static b_alexnet_0 mynet; static boolean_T mynet_not_empty; // Function Definitions // // A persistent object mynet is used to load the series network object. // At the first call to this function, the persistent object is constructed and // setup. When the function is called subsequent times, the same object is reused // to call predict on inputs, thus avoiding reconstructing and reloading the // network object. // Arguments : const real_T in[154587] // real32_T out[1000] // Return Type : void // void alexnet_predict(const real_T in[154587], real32_T out[1000]) { if (!mynet_not_empty) { DeepLearningNetwork_setup(&mynet); mynet_not_empty = true; } // pass in input DeepLearningNetwork_predict(&mynet, in, out); }
Двоичные файлы экспортируются для уровней с параметрами такой, как полностью соединено и уровни свертки в сети. Например, файлы cnn_alexnet_conv*_w
и cnn_alexnet_conv*_b
соответствуют весам и смещают параметры для уровней свертки в сети.
cnn_alexnet_conv1_b cnn_alexnet_conv4_b cnn_alexnet_conv1_w cnn_alexnet_conv4_w cnn_alexnet_conv2_b cnn_alexnet_conv5_b cnn_alexnet_conv2_w cnn_alexnet_conv5_w cnn_alexnet_conv3_b cnn_alexnet_conv3_w
Выполните обычные шаги для определения функции точки входа и определения входных типов. Смотрите, что генерация кода C Использует Приложение MATLAB CODER.
На Сгенерировать шаге Кода:
Установите язык на C++.
Нажмите More Settings. В Глубоком Изучении панели, библиотеки Target набора к MKL-DNN
.
Сгенерируйте код.
cnncodegen
Загрузите предварительно обученную сеть.
Для получения дополнительной информации смотрите Загрузку Предварительно обученные Сети для Генерации кода.
Вызовите cnncodegen
с 'targetlib'
, заданным как 'mkldnn'
.
Например:
net = alexnet; cnncodegen(net,'targetlib','mkldnn');
Команда cnncodegen
генерирует Код С++ и make-файл, cnnbuild_rtw.mk
. Сгенерированные файлы находятся в папке codegen
.
Серийная Сеть сгенерирована как класс C++, содержащий массив классов уровня.
class CnnMain { ... public: CnnMain(); ... void setup(); void predict(); void cleanup(); ... ~CnnMain(); };
Метод setup()
класса настраивает указатели и выделяет память для каждого уровня сетевого объекта. Метод predict()
вызывает прогноз для каждого из уровней в сети.
void CnnMain::predict() { int32_T idx; for (idx = 0; idx < 20; 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
| codegen
| coder.DeepLearningConfig
| coder.MklDNNConfig
| coder.loadDeepLearningNetwork