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

В этом примере показано, как выполнить генерацию кода для приложения классификации изображений, которое использует глубокое обучение. Это использует codegen команда, чтобы сгенерировать MEX-функцию, которая запускает предсказание при помощи сетей классификации изображений, таких как MobileNet-v2, ResNet и GoogLeNet.

Сторонние необходимые условия

Необходимый

Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.

  • CUDA® включил NVIDIA® графический процессор и совместимый драйвер.

Дополнительный

Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.

Проверьте среду графического процессора

Используйте coder.checkGpuInstall Функция (GPU Coder), чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

mobilenetv2_predict Функция точки входа

MobileNet-v2 является сверточной нейронной сетью, которая обучена больше чем на миллионе изображений от базы данных ImageNet. Сеть является 155 слоями глубоко и может классифицировать изображения в 1 000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные. Сеть имеет входной размер изображений 224 224. Используйте analyzeNetwork функционируйте, чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения.

net = mobilenetv2();
analyzeNetwork(net);

mobilenetv2_predict.m функция точки входа берет вход изображений и запускает предсказание на изображении с помощью предварительно обученной сверточной нейронной сети MobileNet-v2. Функция использует постоянный объект mynet, чтобы загрузить серийный сетевой объект и снова использует постоянный объект для предсказания на последующих вызовах.

type('mobilenetv2_predict.m')
% Copyright 2017-2019 The MathWorks, Inc.

function out = mobilenetv2_predict(in) 
%#codegen

persistent mynet;

if isempty(mynet)
    mynet = coder.loadDeepLearningNetwork('mobilenetv2','mobilenetv2');
end

% pass in input   
out = mynet.predict(in);

Запустите генерацию кода MEX

Сгенерировать код CUDA для mobilenetv2_predict функция точки входа, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig (GPU Coder) функция, чтобы создать CuDNN объект настройки глубокого обучения и присвоение это к DeepLearningConfig свойство объекта настройки графического процессора кода. Запустите codegen команда и задает входной размер [224,224,3]. Это значение соответствует входному размеру слоя сети MobileNet-v2.

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
codegen -config cfg mobilenetv2_predict -args {ones(224,224,3)} -report
Code generation successful: View report

Описание сгенерированного кода

Серийная сеть сгенерирована, как класс C++, содержащий массив 155 классов слоя и функций, чтобы настроить, вызовите, предсказывают и очищают сеть.

class b_mobilenetv2_0
{
   .... 
   public:
     b_mobilenetv2_0();
     void setup();
     void predict();
     void cleanup();
     ~b_mobilenetv2_0();
};

setup() метод класса настраивает указатели и выделяет память для каждого слоя сетевого объекта. predict() метод выполняет предсказание для каждого из этих 155 слоев в сети.

Функция точки входа mobilenetv2_predict() в файле сгенерированного кода mobilenetv2_predict.cu создает статический объект b_mobilenetv2 типа класса и вызывает настройку, и предскажите на этом сетевом объекте.

static b_mobilenetv2_0 mynet;
static boolean_T mynet_not_empty;
/* Function Definitions */
void mobilenetv2_predict(const real_T in[150528], real32_T out[1000])
{
  if (!mynet_not_empty) {
    DeepLearningNetwork_setup(&mynet);
    mynet_not_empty = true;
  }
   /*  pass in input    */
   DeepLearningNetwork_predict(&mynet, in, out);
 }

Двоичные файлы экспортируются для слоев параметрами такой, как полностью соединено и слои свертки в сети. Например, файлы cnn_mobilenetv2_conv* _ w и cnn_mobilenetv2_conv* _ b соответствуют весам и смещают параметры для слоев свертки в сети. Чтобы видеть список сгенерированных файлов, используйте:

dir(fullfile(pwd, 'codegen', 'mex', 'mobilenetv2_predict'))

Запустите сгенерированный MEX

Загрузите входное изображение.

im = imread('peppers.png');
imshow(im);

Вызовите mobilenetv2_predict_mex на входном изображении.

im = imresize(im, [224,224]);
predict_scores = mobilenetv2_predict_mex(double(im));

Получите лучшие пять баллов предсказания и их метки.

[scores,indx] = sort(predict_scores, 'descend');
classNames = net.Layers(end).ClassNames;
classNamesTop = classNames(indx(1:5));

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);

image(ax1,im);
barh(ax2,scores(5:-1:1))
xlabel(ax2,'Probability')
yticklabels(ax2,classNamesTop(5:-1:1))
ax2.YAxisLocation = 'right';
sgtitle('Top Five Predictions That Use MobileNet-v2')

Очистите статический сетевой объект, который загрузился в памяти.

clear mex;

Классификация Изображений при помощи сети ResNet-50

Можно также использовать сеть DAG ResNet-50 для классификации изображений. Предварительно обученная модель ResNet-50 для MATLAB доступна в пакете поддержки ResNet-50 Deep Learning Toolbox. Чтобы загрузить и установить пакет поддержки, используйте Add-On Explorer. Чтобы узнать больше о нахождении и установке дополнений, смотрите, Получают и Управляют Дополнениями.

net = resnet50;
disp(net)
  DAGNetwork with properties:

         Layers: [177×1 nnet.cnn.layer.Layer]
    Connections: [192×2 table]
     InputNames: {'input_1'}
    OutputNames: {'ClassificationLayer_fc1000'}

Запустите генерацию кода MEX

Сгенерировать код CUDA для resnet_predict.m функция точки входа, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Эта точка входа вызовы функции resnet50 функционируйте, чтобы загрузить сеть и выполнить предсказание на входном изображении.

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
codegen -config cfg resnet_predict -args {ones(224,224,3)} -report
Code generation successful: View report

Вызовите resnet_predict_mex на входном изображении.

predict_scores = resnet_predict_mex(double(im));

Получите лучшие пять баллов предсказания и их метки.

[scores,indx] = sort(predict_scores, 'descend');
classNames = net.Layers(end).ClassNames;
classNamesTop = classNames(indx(1:5));

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);

image(ax1,im);
barh(ax2,scores(5:-1:1))
xlabel(ax2,'Probability')
yticklabels(ax2,classNamesTop(5:-1:1))
ax2.YAxisLocation = 'right';
sgtitle('Top Five Predictions That Use ResNet-50')

Очистите статический сетевой объект, который загрузился в памяти.

clear mex;

Классификация Изображений при помощи сети GoogLeNet (Inception)

Предварительно обученная модель GoogLeNet для MATLAB доступна в пакете поддержки GoogLeNet Deep Learning Toolbox. Чтобы загрузить и установить пакет поддержки, используйте Add-On Explorer. Чтобы узнать больше о нахождении и установке дополнений, смотрите, Получают и Управляют Дополнениями.

net = googlenet;
disp(net)
  DAGNetwork with properties:

         Layers: [144×1 nnet.cnn.layer.Layer]
    Connections: [170×2 table]
     InputNames: {'data'}
    OutputNames: {'output'}

Запустите генерацию кода MEX

Сгенерируйте код CUDA для googlenet_predict.m функция точки входа. Эта точка входа вызовы функции googlenet функционируйте, чтобы загрузить сеть и выполнить предсказание на входном изображении. Чтобы сгенерировать код для этой функции точки входа, создайте объект настройки графического процессора для цели MEX.

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
codegen -config cfg googlenet_predict -args {ones(224,224,3)} -report
Code generation successful: View report

Вызовите googlenet_predict_mex на входном изображении.

im = imresize(im, [224,224]);
predict_scores = googlenet_predict_mex(double(im));

Получите лучшие пять баллов предсказания и их метки.

[scores,indx] = sort(predict_scores, 'descend');
classNames = net.Layers(end).ClassNames;
classNamesTop = classNames(indx(1:5));

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);

image(ax1,im);
barh(ax2,scores(5:-1:1))
xlabel(ax2,'Probability')
yticklabels(ax2,classNamesTop(5:-1:1))
ax2.YAxisLocation = 'right';
sgtitle('Top Five Predictions That Use GoogLeNet')

Очистите статический сетевой объект, который загрузился в памяти.

clear mex;

Похожие темы