С GPU Coder™ можно сгенерировать код для прогноза от уже обученной сверточной нейронной сети, предназначаясь для нескольких встроенных платформ то использование процессоры NVIDIA® Tegra®. GPU Coder использует в своих интересах библиотеки NVIDIA cuDNN для NVIDIA графические процессоры. Сгенерированный код реализует CNN с архитектурой, слоями и параметрами, заданными в сетевом объекте входа SeriesNetwork
или DAGNetwork
. Можно сгенерировать код для сверточных сетей при помощи одного из методов:
Стандартный codegen
функционирует для генерации кода CUDA® из кода MATLAB®.
Команда cnncodegen
, которая генерирует код CUDA и создает статическую библиотеку для CNN.
Приложение GPU Coder.
Когда вы генерируете код для нейронной сети при помощи codegen
или приложения GPU Coder, сгенерированный код использует главное столбцом размещение для ваших данных массива. Чтобы совпадать с главным строкой размещением, которое использует библиотека глубокого обучения, генератор кода должен вставить операции, чтобы преобразовать главное столбцом размещение в главное строкой размещение. Эти операции преобразования могут ухудшить производительность сгенерированного кода. Генерация кода для глубоких нейронных сетей не поддерживает кодер главные строкой опции, такие как параметр конфигурации RowMajor
.
Этот пример показывает, как сгенерировать код от объекта SeriesNetwork
при помощи codegen
, cnncodegen
и приложения. В этом примере SeriesNetwork
реализует архитектуру AlexNet, обученную классификации набора данных ImageNet
.
Deep Learning Toolbox™.
Чтобы выполнить генерацию кода для нейронных сетей для глубокого обучения, необходимо установить Интерфейс GPU Coder для пакета поддержки Библиотек Глубокого обучения. Чтобы установить этот пакет поддержки, выберите пакет поддержки из меню MATLAB Add-Ons.
На Windows генерация кода для нейронных сетей для глубокого обучения с функцией codegen
требует Microsoft® Visual Studio® 2015 или выше.
Инструментарий CUDA и cuDNN библиотеки. Для получения дополнительной информации смотрите Устанавливающие Необходимые как условие продукты.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Переменные окружения.
Модель Deep Learning Toolbox для Сети AlexNet обеспечивает предварительно обученную архитектуру AlexNet, обученную классификации набора данных ImageNet
. Используйте функцию alexnet
, чтобы получить предварительно обученную сеть.
net = alexnet;
Объект net
содержит объект SeriesNetwork
. Это содержит 25 слоев включая свертку, полностью соединенную, и классификация выходные слои. Вы видите детали архитектуры при помощи записи через точку.
net.Layers
25x1 Layer array with layers: 1 'data' Image Input 227x227x3 images with 'zerocenter' normalization 2 'conv1' Convolution 96 11x11x3 convolutions with stride [4 4] and padding [0 0] 3 'relu1' ReLU ReLU 4 'norm1' Cross Channel Normalization cross channel normalization with 5 channels per element 5 'pool1' Max Pooling 3x3 max pooling with stride [2 2] and padding [0 0] 6 'conv2' Convolution 256 5x5x48 convolutions with stride [1 1] and padding [2 2] 7 'relu2' ReLU ReLU 8 'norm2' Cross Channel Normalization cross channel normalization with 5 channels per element 9 'pool2' Max Pooling 3x3 max pooling with stride [2 2] and padding [0 0] 10 'conv3' Convolution 384 3x3x256 convolutions with stride [1 1] and padding [1 1] 11 'relu3' ReLU ReLU 12 'conv4' Convolution 384 3x3x192 convolutions with stride [1 1] and padding [1 1] 13 'relu4' ReLU ReLU 14 'conv5' Convolution 256 3x3x192 convolutions with stride [1 1] and padding [1 1] 15 'relu5' ReLU ReLU 16 'pool5' Max Pooling 3x3 max pooling with stride [2 2] and padding [0 0] 17 'fc6' Fully Connected 4096 fully connected layer 18 'relu6' ReLU ReLU 19 'drop6' Dropout 50% dropout 20 'fc7' Fully Connected 4096 fully connected layer 21 'relu7' ReLU ReLU 22 'drop7' Dropout 50% dropout 23 'fc8' Fully Connected 1000 fully connected layer 24 'prob' Softmax softmax 25 'output' Classification Output crossentropyex with 'tench', 'goldfish', and 998 other classes
Для получения дополнительной информации об этих слоях смотрите, Задают Слои Сверточной Нейронной сети (Deep Learning Toolbox).
codegen
В этом методе вы написали функцию точки входа в MATLAB и используете функцию coder.loadDeepLearningNetwork
, чтобы загрузить модель глубокого обучения, создать и настроить класс CNN. Для получения дополнительной информации смотрите Предварительно обученные сети Загрузки для Генерации кода.
Вы затем используете метод predict
, чтобы предсказать ответы. Можно также использовать метод activations
для сетевых активаций для определенного слоя. Например,
out = activations(mynet,in,layerIdx,'OutputAs','Channels');
layerIdx
. Для указаний и ограничений по применению метода activations
смотрите соответствующую запись в таблице Supported Functions.Можно сгенерировать код CUDA для функции точки входа использование регулярной функции codegen
, описанной в Генерации кода Используя Интерфейс командной строки.
Функция alexnet_predict.m
берет вход изображений и запускает прогноз на изображении с помощью нейронной сети для глубокого обучения alexnet
. Функция загружает сетевой объект в персистентную переменную mynet
. На последующих вызовах функции постоянный объект снова используется для прогноза.
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','alexnet'); end % pass in input out = predict(mynet,in);
Создайте объект GPU Configuration для цели MEX, устанавливающей выходной язык на C++. Чтобы задать параметры генерации кода для cuDNN, установите свойство DeepLearningConfig
на объект coder.CuDNNConfig
, который вы создаете с coder.DeepLearningConfig
. Запустите команду codegen
, задающую вход размера [227,227,3]. Этот входной размер соответствует входному размеру слоя сети AlexNet.
cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); codegen -config cfg alexnet_predict -args {ones(227,227,3)} -report
Серийная сеть сгенерирована как класс C++, содержащий массив 25 классов слоя.
class b_alexnet { ... public: b_alexnet(); ... void setup(); void predict(); void cleanup(); ... ~b_alexnet(); };
Метод setup()
класса настраивает указатели и выделяет память для каждого слоя сетевого объекта. Метод predict()
вызывает прогноз для каждого из этих 25 слоев в сети. Функция точки входа alexnet_predict()
в файле сгенерированного кода alexnet_predict.cu
создает статический объект b_alexnet типа класса и вызывает настройку, и предскажите на этом сетевом объекте.
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
соответствуют весам и смещают параметры для слоев свертки в сети.
В системах Windows® некоторое антивирусное программное обеспечение, таких как Битный Защитник может неправильно идентифицировать некоторые файлы веса, как заражено и удаляет их. Однако было определено, что эти случаи являются ложными положительными сторонами и что файлы безопасны. Можно отметить эти файлы как безопасные в антивирусной программе.
cnn_alexnet_conv1_b cnn_alexnet_conv1_w cnn_alexnet_conv2_b cnn_alexnet_conv2_w cnn_alexnet_conv3_b cnn_alexnet_conv3_w cnn_alexnet_conv4_b cnn_alexnet_conv4_w cnn_alexnet_conv5_b cnn_alexnet_conv5_w
Выполните обычные шаги для определения функции точки входа и определения входных типов. Смотрите Генерацию кода при помощи Приложения GPU Coder. На шаге Generate Code:
Установите Language на C++.
Нажмите More Settings. В панели Deep Learning, набор Target library к cuDNN.
Сгенерируйте код.
cnncodegen
Можно использовать опцию targetlib
команды cnncodegen
, чтобы сгенерировать код с cuDNN библиотекой. Команда cnncodegen
генерирует код CUDA и создает статическую библиотеку для данного SeriesNetwork
или сетевого объекта DAGNetwork
.
cnncodegen(net,'targetlib','cudnn');
Команда cnncodegen
генерирует код и make-файл, cnnbuild_rtw.mk
. Это помещает все сгенерированные файлы в папку codegen
.
Серийная Сеть сгенерирована как класс C++, содержащий массив 25 классов слоя.
class CnnMain { ... public: CnnMain(); ... void setup(); void predict(); void cleanup(); ~CnnMain(); };
Метод setup()
класса настраивает указатели и выделяет память для каждого слоя сетевого объекта. Метод predict()
вызывает прогноз для каждого из этих 25 слоев в сети.
void CnnMain::predict() { int32_T idx; for (idx = 0; idx < 25; 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.CuDNNConfig
| coder.loadDeepLearningNetwork