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

С MATLAB® Coder™ можно сгенерировать код для прогноза от уже обученной сверточной нейронной сети (CNN), предназначаясь для встроенной платформы, которая использует процессор Intel®. Генератор кода использует в своих интересах Math Kernel Library Intel для Глубоких нейронных сетей (MKL-DNN). Сгенерированный код реализует CNN с архитектурой, слоями и параметрами, заданными в сетевом объекте входа SeriesNetwork или DAGNetwork.

Сгенерируйте код при помощи одного из этих методов:

  • Стандартная команда 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)

  • Deep Learning 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

Генерация кода при помощи приложения MATLAB Coder

  1. Выполните обычные шаги для определения функции точки входа и определения входных типов. Смотрите Генерируют код С при помощи Приложения MATLAB Coder.

  2. На шаге Generate Code:

    • Установите Language на C++.

    • Нажмите More Settings. В панели Deep Learning, набор Target library к 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 

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

| | | |

Похожие темы