С GPU Coder™ можно сгенерировать оптимизированный код для предсказания множества обученных нейронных сетей для глубокого обучения от Deep Learning Toolbox™. Сгенерированный код реализует глубокую сверточную нейронную сеть (CNN) при помощи архитектуры, слоев и параметров, которые вы задаете во входе SeriesNetwork
(Deep Learning Toolbox) или DAGNetwork
Объект (Deep Learning Toolbox). Генератор кода использует в своих интересах библиотеку глубокой нейронной сети NVIDIA® CUDA® (cuDNN) для NVIDIA графические процессоры. cuDNN является ускоренной графическим процессором библиотекой примитивов для глубоких нейронных сетей. Сгенерированный код может быть интегрирован в ваш проект как исходный код, статические или динамические библиотеки или исполняемые файлы, что можно развернуть в разнообразие NVIDIA платформы графического процессора.
Сгенерируйте код для сверточных сетей при помощи одного из методов:
Стандарт codegen
функция, которая генерирует код CUDA от функции точки входа MATLAB®.
Приложение GPU Coder, которое генерирует код CUDA от функции точки входа MATLAB.
Примечание
В предыдущих релизах вы могли предназначаться для cuDNN библиотеки при помощи cnncodegen
функция. От R2020b вперед, рекомендуется использовать codegen
команда вместо cnncodegen
функционируйте потому что в будущем релизе, cnncodegen
функция сгенерирует Код С++ и создаст статическую библиотеку только для процессора GPU ARM® Mali.
В этом примере вы используете GPU Coder, чтобы сгенерировать код CUDA для предварительно обученного googlenet
(Deep Learning Toolbox) глубокая сверточная нейронная сеть и классифицирует изображение. GoogLeNet был обучен на более чем миллионе изображений и может классифицировать изображения в 1 000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и животные). Сеть изучила богатые представления функции для широкого спектра изображений. Сеть берет изображение в качестве входа, и затем выводит метку для объекта в изображении вместе с вероятностями для каждой из категорий объектов. Этот пример показывает вам, как сгенерировать код для предварительно обученной сети при помощи codegen
команда и приложение GPU Coder.
Этот пример генерирует MEX CUDA, который имеет следующие дополнительные требования.
Deep Learning Toolbox.
Модель Deep Learning Toolbox для пакета Сетевой поддержки GoogLeNet.
Интерфейс GPU Coder для Библиотек Глубокого обучения поддерживает пакет.
CUDA включил NVIDIA графический процессор и совместимый драйвер. Для 8-битной целочисленной точности графический процессор CUDA должен иметь вычислить возможность 6,1, 6.3 или выше.
Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий CUDA и cuDNN библиотеки. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Устанавливающие Необходимые как условие продукты.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Переменные окружения.
Загрузите предварительно обученную сеть GoogLeNet. Можно принять решение загрузить различную предварительно обученную сеть для классификации изображений. Если у вас нет необходимых пакетов поддержки установленными, программное обеспечение обеспечивает ссылку на загрузку.
net = googlenet;
Объект net
содержит DAGNetwork
объект. Используйте analyzeNetwork
(Deep Learning Toolbox) функция, чтобы отобразить интерактивную визуализацию сетевой архитектуры, обнаружить ошибки и проблемы в сети, и отобразить подробную информацию о слоях сети. Информация о слое включает размеры активаций слоя и настраиваемых параметров, общего количества настраиваемых параметров и размеров параметров состояния текущих слоев.
analyzeNetwork(net);
Изображение, которое вы хотите классифицировать, должно иметь тот же размер как входной размер сети. Для GoogLeNet, размера imageInputLayer
(Deep Learning Toolbox) 224 224 3. Classes
свойство выхода classificationLayer
(Deep Learning Toolbox) содержит имена классов, изученных сетью. Просмотрите 10 случайных имен классов из общего количества 1 000.
classNames = net.Layers(end).Classes; numClasses = numel(classNames); disp(classNames(randperm(numClasses,10)))
'speedboat' 'window screen' 'isopod' 'wooden spoon' 'lipstick' 'drake' 'hyena' 'dumbbell' 'strawberry' 'custard apple'
Для получения дополнительной информации смотрите Список слоев глубокого обучения (Deep Learning Toolbox).
Напишите функцию точки входа в MATLAB что:
Использует coder.loadDeepLearningNetwork
функционируйте, чтобы загрузить модель глубокого обучения и создать и настроить класс CNN. Для получения дополнительной информации смотрите Предварительно обученные сети Загрузки для Генерации кода.
Вызовы predict
(Deep Learning Toolbox), чтобы предсказать ответы.
Например:
function out = googlenet_predict(in) %#codegen persistent mynet; if isempty(mynet) mynet = coder.loadDeepLearningNetwork('googlenet'); end % pass in input out = predict(mynet,in);
Постоянный объект mynet
загружает DAGNetwork
объект. В первом вызове функции точки входа постоянный объект создается и настраивается. На последующих вызовах функции тот же объект снова используется, чтобы вызвать predict
на входных параметрах, избегая восстановления и перезагрузки сетевого объекта.
Примечание
Генерация кода требует, чтобы сеть загрузилась в постоянный объект.
Можно также использовать activations
(Deep Learning Toolbox) метод к сетевым активациям для определенного слоя. Например, следующая строка кода возвращает сетевые активации для слоя, заданного в layerIdx
.
out = activations(mynet,in,layerIdx,'OutputAs','Channels');
Можно также использовать classify
(Deep Learning Toolbox) метод, чтобы предсказать класс помечает для данных изображения в in
с помощью обучившего сеть, mynet
.
[out,scores] = classify(mynet,in);
Для сетей LSTM можно также использовать predictAndUpdateState
(Deep Learning Toolbox) и resetState
(Deep Learning Toolbox) методы. Для указаний и ограничений по применению их метод смотрите соответствующую запись в таблице Supported Functions.
codegen
Чтобы сконфигурировать настройки сборки, такие как имя выходного файла, местоположение и тип, вы создаете объекты настройки кодера. Чтобы создать объекты, используйте coder.gpuConfig
функция. Например, при генерации MEX CUDA с помощью codegen
команда, используйте cfg = coder.gpuConfig('mex');
Другие доступные параметры:
cfg = coder.gpuConfig('lib');
, чтобы создать настройку генерации кода возражают для использования с codegen
при генерации C/C++ CUDA статическая библиотека.
cfg = coder.gpuConfig('dll');
, чтобы создать настройку генерации кода возражают для использования с codegen
при генерации C/C++ CUDA динамическая библиотека.
cfg = coder.gpuConfig('exe');
, чтобы создать настройку генерации кода возражают для использования с codegen
при генерации исполняемого файла C/C++ CUDA.
Чтобы задать параметры генерации кода для cuDNN, установите DeepLearningConfig
свойство к coder.CuDNNConfig
возразите, что вы создаете при помощи coder.DeepLearningConfig
.
cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); cfg.DeepLearningConfig.AutoTuning = true; cfg.DeepLearningConfig.DataType = 'fp32';
Задайте точность расчетов вывода в поддерживаемых слоях при помощи DataType
свойство. При выполнении вывода в 32-битных плаваниях используйте 'fp32'
. Для 8-битного целого числа используйте 'int8'
. Значением по умолчанию является 'fp32'
. Используйте ComputeCapability
свойство GpuConfig
объект установить соответствующее вычисляет значение возможности.
Примечание
Генерация кода для INT8
тип данных не поддерживает несколько нейронных сетей для глубокого обучения в функции точки входа.
Запустите codegen
команда. codegen
команда генерирует код CUDA от googlenet_predict.m
Функция точки входа MATLAB.
codegen -config cfg googlenet_predict -args {ones(224,224,3)} -report
-report
опция сообщает codegen
чтобы сгенерировать генерацию кода сообщают, что можно использовать, чтобы отладить код MATLAB.
-args
опция сообщает codegen
скомпилировать файл googlenet_predict.m
при помощи класса размер и сложность заданы для входа in. Значение (224,224,3)
соответствует входному размеру слоя сети GoogLeNet.
-config
опция сообщает codegen
чтобы использовать заданную настройку возражают для генерации кода.
Примечание
Можно задать входные параметры полуточности для генерации кода. Однако тип генератора кода бросает входные параметры к с одинарной точностью. Использование Deep Learning Toolbox арифметика с плавающей точкой, с одинарной точностью для всех расчетов в MATLAB.
Генератор кода использует упорядоченное по столбцам размещение по умолчанию. Чтобы использовать упорядоченное по строкам размещение передают -rowmajor
опция к codegen
команда. В качестве альтернативы сконфигурируйте свой код для упорядоченного по строкам размещения путем изменения cfg.RowMajor
параметр в объекте настройки генерации кода.
Когда генерация кода успешна, можно просмотреть получившийся отчет генерации кода путем нажатия на View Report в командном окне MATLAB. Отчет отображен в окне Report Viewer. Если генератор кода обнаруживает ошибки или предупреждения во время генерации кода, отчет описывает проблемы и обеспечивает ссылки на проблематичный код MATLAB. См. Отчеты Генерации кода.
Code generation successful: View report
Сеть DAG сгенерирована как класс C++, содержащий массив 78 классов слоя. Генератор кода сокращает количество слоев при помощи оптимизации сплава слоя слоев ReLU и сверточных. Отрывок объявления класса от googlenet_predict_types.h
файл показывают.
googlenet_predict_types.h
Файл
setup()
метод класса настраивает указатели и выделяет память для каждого слоя сетевого объекта.
predict()
метод вызывает предсказание для каждого из этих 78 слоев в сети.
DeepLearningNetwork.cu
файл содержит определения объектных функций для b_googlenet_0
класс.
Двоичные файлы экспортируются для слоев параметрами такой, как полностью соединено и слои свертки в сети. Например, файлы cnn_googlenet_conv*_w
и cnn_googlenet_conv*_b
соответствуйте весам и сместите параметры для FusedConvReLU
слои в сети. Генератор кода помещает эти двоичные файлы в codegen
папка.
Примечание
В системах Windows® некоторое антивирусное программное обеспечение, таких как Битный Защитник может неправильно идентифицировать некоторые файлы веса, как заражено и удалить их. Эти случаи являются ложными положительными сторонами, и файлы могут быть отмечены как безопасные в вашей антивирусной программе.
В файле сгенерированного кода googlenet_predict.cu
, функция точки входа googlenet_predict()
создает статический объект b_googlenet_0 типа класса и вызывает настройку, и предскажите на этом сетевом объекте.
Чтобы задать функцию точки входа и определение входных типов, завершите процедуру в приложении. Смотрите Генерацию кода при помощи Приложения GPU Coder.
На шаге Generate Code:
Установите Build type
к MEX
.
Нажмите More Settings. В панели Deep Learning, набор Target library к cuDNN.
Закройте окно настроек. Чтобы сгенерировать код CUDA, нажмите Generate.
Для 'lib'
, 'dll'
, и 'exe'
цели, генератор кода создает *_rtw.mk
make-файл в codegen
папка. В этом make-файле местоположение сгенерированного кода задано при помощи START_DIR
переменная найдена в MACROS
раздел. По умолчанию эта переменная указывает на путь текущей рабочей папки, где код сгенерирован. Если вы планируете переместить сгенерированные файлы и использовать make-файл, чтобы создать, замените сгенерированное значение START_DIR
с соответствующим местоположением пути.
Изображение, которое вы хотите классифицировать, должно иметь тот же размер как входной размер сети. Считайте изображение, что вы хотите классифицировать и изменить размер его к входному размеру сети. Это изменение размеров немного изменяет соотношение сторон изображения.
im = imread("peppers.png");
inputLayerSize = net.Layers(1).InputSize;
im = imresize(I,inputLayerSize(1:2));
Вызов GoogLeNet предсказывает на входном изображении.
predict_scores = googlenet_predict_mex(im);
Отобразите лучшие пять предсказанных меток и их связанные вероятности как гистограмма. Поскольку сеть классифицирует изображения в такое количество категорий объектов, и много категорий подобны, распространено рассмотреть лучшие пять точности при оценке сетей. Сеть классифицирует изображение как болгарский перец с высокой вероятностью.
[scores,indx] = sort(predict_scores, 'descend'); 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 5 predictions using GoogLeNet')