С GPU Coder™ можно сгенерировать оптимизированный код для Simulink® модели, содержащие множество обученных нейронных сетей для глубокого обучения. Можно реализовать функциональность глубокого обучения в Simulink при помощи блоков MATLAB Function или при помощи блоков из библиотеки Deep Neural Networks. При реализации с блоками MATLAB Function используйте coder.loadDeepLearningNetwork
функционируйте, чтобы загрузить обученную нейронную сеть для глубокого обучения и использовать объектные функции сетевого объекта, чтобы получить желаемые ответы. Можно сконфигурировать генератор кода, чтобы использовать в своих интересах NVIDIA® CUDA® библиотека глубокой нейронной сети (cuDNN) и высокоэффективные библиотеки вывода TensorRT™ для NVIDIA графические процессоры. Сгенерированный код реализует глубокую сверточную нейронную сеть (CNN) при помощи архитектуры, слоев и параметров, которые вы задаете в сетевом объекте.
GoogLeNet был обучен на более чем миллионе изображений и может классифицировать изображения в 1 000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и животные). Сеть берет изображение в качестве входа, и затем выводит метку для объекта в изображении вместе с вероятностями для каждой из категорий объектов. Этот пример показывает вам, как выполнить симуляцию и сгенерировать код CUDA для предварительно обученного googlenet
глубокая сверточная нейронная сеть и классифицирует изображение.
Загрузите предварительно обученную сеть GoogLeNet. Можно принять решение загрузить различную предварительно обученную сеть для классификации изображений. Если вам не установили необходимые пакеты поддержки, установите программное обеспечение согласно предоставленным инструкциям.
net = googlenet;
Объект net
содержит DAGNetwork
объект. Используйте analyzeNetwork
функционируйте, чтобы отобразить интерактивную визуализацию сетевой архитектуры, обнаружить ошибки и проблемы в сети, и отобразить подробную информацию о слоях сети. Информация о слое включает размеры активаций слоя и настраиваемых параметров, общего количества настраиваемых параметров и размеров параметров состояния текущих слоев.
analyzeNetwork(net);
Изображение, которое вы хотите классифицировать, должно иметь тот же размер как входной размер сети. Для GoogLeNet, размера imageInputLayer
224 224 3. Classes
свойство выхода classificationLayer
содержит имена классов, изученных сетью. Просмотрите 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'
Создайте модель Simulink и вставьте блок MATLAB Function из библиотеки User-Defined Functions.
Добавьте блок Image From File из библиотеки Computer Vision Toolbox™ и установите File name
параметр к peppers.png
.
Добавьте блок Resize от библиотеки Computer Vision Toolbox до модели. Установите параметр Specify блока Resize к Number of output rows and columns
и введите [224 224]
как значение для Number of output rows and columns. Этот бок изменяет размер входного изображения к тому из входного слоя сети.
Дважды кликните блок MATLAB Function. Функциональная подпись по умолчанию появляется в Редакторе Блока MATLAB Function.
Задайте функцию под названием googlenet_predict
, который реализует функцию точки входа предсказания. Функциональный заголовок объявляет in
в качестве аргумента к googlenet_predict
функция, с scores
и indxTop
как возвращаемое значение.
function [scores,indxTop] = googlenet_predict(in) %#codegen persistent mynet; if isempty(mynet) mynet = coder.loadDeepLearningNetwork('googlenet'); end % pass in input predict_scores = predict(mynet,in); [scores,indx] = sort(predict_scores, 'descend'); indxTop = indx(1:5);
Постоянный объект 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) методы. Для указаний и ограничений по применению их метод смотрите Поддерживаемые Функции.
Откройте параметры блоков блока MATLAB Function. На вкладке Code Generation выберите Reusable function
для Function packaging.
Соедините эти блоки как показано в схеме. Сохраните модель как googlenetModel
.
Параметры конфигурации модели определяют ускоряющий метод, используемый в процессе моделирования.
Откройте диалоговое окно Configuration Parameters. Откройте панель Solver. Чтобы скомпилировать вашу модель для ускорения и сгенерировать код CUDA, сконфигурируйте модель, чтобы использовать решатель фиксированного шага. Эта таблица показывает настройку решателя для этого примера.
Параметр | Установка | Эффект на сгенерированном коде |
---|---|---|
Type | Fixed-step | Обеспечивает постоянный (фиксированный) размер шага, который требуется для генерации кода |
Solver | discrete (no continuous states) | Применяет метод интегрирования фиксированного шага для вычисления производной состояния модели |
Fixed-step size | auto | Simulink выбирает размер шага |
Выберите панель Simulation Target. Установите Language на C++
.
Выберите GPU acceleration.
опции, характерные для GPU Coder, теперь отображаются в панели Simulation Target > GPU Acceleration. В данном примере можно использовать значения по умолчанию для этих специфичных для графического процессора параметров.
На панели Simulation Target, установленной параметр Target Library в группе Deep learning к cuDNN
.
Можно также выбрать TensorRT
чтобы предназначаться для высокой производительности TensorRT заключают библиотеки для NVIDIA графические процессоры.
Нажмите OK, чтобы сохранить и закрыть диалоговое окно Configuration Parameters.
Можно использовать set_param
сконфигурировать программно параметр модели в MATLAB® командное окно.
set_param('googlenetModel','GPUAcceleration','on');
Чтобы создать и симулировать графический процессор ускоренная модель, выберите Run на вкладке Simulation или используйте команду MATLAB:
out = sim('googlenetModel');
Программное обеспечение сначала проверяет, чтобы видеть, был ли CUDA/C ++ код ранее скомпилирован для вашей модели. Если код был создан ранее, программное обеспечение запускает модель. Если код не был ранее создан, программное обеспечение сначала генерирует и компилирует CUDA/C ++ код, и затем запускает модель. Инструмент генерации кода помещает сгенерированный код в подпапку рабочей папки под названием slprj/_slprj/googlenetModel
.
Отобразите лучшие пять предсказанных меток и их связанные вероятности как гистограмма. Поскольку сеть классифицирует изображения в такое количество категорий объектов, и много категорий подобны, распространено рассмотреть лучшие пять точности при оценке сетей. Сеть классифицирует изображение как болгарский перец с высокой вероятностью.
im = imread('peppers.png'); classNamesTop = classNames(out.yout{2}.Values.Data(:,:,1)) h = figure; h.Position(3) = 2*h.Position(3); ax1 = subplot(1,2,1); ax2 = subplot(1,2,2); image(ax1,im); barh(ax2,out.yout{1}.Values.Data(1,5:-1:1,1)) xlabel(ax2,'Probability') yticklabels(ax2,classNamesTop(5:-1:1)) ax2.YAxisLocation = 'right'; sgtitle('Top 5 predictions using GoogLeNet')
Параметры конфигурации модели предоставляют много возможностей для генерации кода и процесса сборки.
Выберите панель Code Generation. Установите System target file на grt.tlc
.
Можно также использовать Embedded Coder® конечный файл, ert.tlc
.
Установите Language на C++
.
Выберите Generate GPU code.
Выберите Generate code only.
Выберите Toolchain. Для Linux® платформы, выберите NVIDIA CUDA | gmake (64-bit Linux)
. Для Windows® системы, выберите NVIDIA CUDA (w/Microsoft Visual C++ 20XX) | nmake (64-bit windows)
.
На панели Code Generation > Report выберите Create code generation report и Open report automatically.
На панели Code Generation > Interface, набор Target Library в группе Deep learning к cuDNN
.
Можно также выбрать TensorRT
чтобы предназначаться для высокой производительности TensorRT заключают библиотеки для NVIDIA графические процессоры.
Когда параметр Generate GPU code включен, опции, характерные для GPU Coder, отображаются в панели Code Generation > GPU Code. В данном примере можно использовать значения по умолчанию специфичных для графического процессора параметров в панели Code Generation > GPU Code.
Нажмите OK, чтобы сохранить и закрыть диалоговое окно Configuration Parameters.
Можно также использовать set_param
функция, чтобы сконфигурировать программно параметр модели в командном окне MATLAB.
set_param('googlenetModel','GenerateGPUCode','CUDA');
В Редакторе Simulink откройте приложение Simulink Coder.
Сгенерируйте код.
Сообщения появляются в Средстве просмотра Диагностики. Генератор кода производит исходные и заголовочные файлы CUDA и отчет генерации кода HTML. Генератор кода помещает файлы в папку сборки, подпапку под названием googlenetModel_grt_rtw
под вашей текущей рабочей папкой.
Генерация кода для нейронной сети для глубокого обучения с пользовательским слоем не поддерживается в Simulink.
Генерация кода графического процессора для MATLAB Function блокируется в Stateflow® графики не поддерживаются.
То, когда GPU acceleration включен, генератор кода не поддерживает Import custom code для импорта пользовательского, создало исходные файлы CUDA (*.cu). Вместо этого используйте coder.ceval
в блоке MATLAB Function.
Блок MATLAB Function не поддерживает все типы данных с языка MATLAB. Для поддерживаемых типов данных обратитесь к документации блока.
Для развертывания сгенерированного кода рекомендуется использовать опцию Generate an example main program, чтобы сгенерировать ert_main.cu
модуль. Эта опция требует лицензии Embedded Coder.
Можно также использовать rt_cppclass_main.cpp
статический основной модуль обеспечивается MathWorks®. Однако статический основной файл должен быть изменен таким образом, что конструктор класса моделей указывает на объект глубокого обучения. Например,
static googlenetModelModelClass::DeepLearning_googlenetModel_T googlenetModel_DeepLearning; static googlenetModelModelClass googlenetModel_Obj{ &googlenetModel_DeepLearning};
open_system
(Simulink) | load_system
(Simulink) | save_system
(Simulink) | close_system
(Simulink) | bdclose
(Simulink) | get_param
(Simulink) | set_param
(Simulink) | sim
(Simulink) | slbuild
(Simulink)