Генерация кода для глубоких образовательных сетей с MKL-DNN

С 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

  1. Напишите функцию точки входа в MATLAB что:

    Например:

    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); 

  2. Создайте объект настройки генерации кода для MEX или для статической или динамически подключаемой библиотеки. Чтобы задать параметры генерации кода для MKL-DNN, установите свойство DeepLearningConfig на объект coder.MklDNNConfig, который вы создаете с coder.DeepLearningConfig.

    cfg = coder.config('lib');
    cfg.TargetLang = 'C++';
    cfg.DeepLearningConfig = coder.DeepLearningConfig('mkldnn');
  3. Запустите команду 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

Сгенерируйте код при помощи приложения

  1. Выполните обычные шаги для определения функции точки входа и определения входных типов. Смотрите, что генерация кода C Использует Приложение MATLAB CODER.

  2. На Сгенерировать шаге Кода:

    • Установите язык на C++.

    • Нажмите More Settings. В Глубоком Изучении панели, библиотеки Target набора к MKL-DNN.

  3. Сгенерируйте код.

Сгенерируйте код при помощи cnncodegen

  1. Загрузите предварительно обученную сеть.

    Для получения дополнительной информации смотрите Загрузку Предварительно обученные Сети для Генерации кода.

  2. Вызовите 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 

Смотрите также

| | | |

Похожие темы

Была ли эта тема полезной?