С помощью GPU Coder™ можно сгенерировать оптимизированный код для Simulink® модели, содержащие множество обученных нейронных сетей для глубокого обучения. Реализовать функциональность глубокого обучения в Simulink можно с помощью блоков MATLAB Function или с помощью блоков из библиотеки Deep Neural Networks. При реализации с MATLAB Function блоками используйте coder.loadDeepLearningNetwork
функция для загрузки обученной нейронной сети для глубокого обучения и использования объектных функций сетевого объекта для получения желаемых откликов. Можно настроить генератор кода, чтобы использовать преимущества NVIDIA® CUDA® библиотека глубоких нейронных сетей (cuDNN) и TensorRT™ библиотеки эффективности вывода для графических процессоров NVIDIA. Сгенерированный код реализует глубокую сверточную нейронную сеть (CNN) с помощью архитектуры, слоев и параметров, которые вы задаете в сетевом объекте.
GoogLeNet обучен на более чем миллионе изображений и может классифицировать изображения в 1000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и животные). Сеть принимает изображение как вход, а затем выводит метку для объекта в изображении вместе с вероятностями для каждой из категорий объектов. В этом примере показано, как выполнить симуляцию и сгенерировать код CUDA для предварительно обученного googlenet
глубокая сверточная нейронная сеть и классификация изображения.
Загрузите предварительно обученную сеть GoogLeNet. Можно выбрать загрузку другой предварительно обученной сети для классификации изображений. Если у вас нет необходимых пакетов поддержки, установите программное обеспечение в соответствии с предоставленными инструкциями.
net = googlenet;
Объект net
содержит DAGNetwork
объект. Используйте analyzeNetwork
функция для отображения интерактивной визуализации сетевой архитектуры, для обнаружения ошибок и проблем в сети и для отображения подробной информации о слоях сети. Информация о слое включает размеры активации слоя и настраиваемые параметры, общее количество настраиваемых параметров и размеры параметров состояния рекуррентных слоев.
analyzeNetwork(net);
Изображение, которое вы хотите классифицировать, должно иметь тот же размер, что и вход сигнала сети. Для GoogLeNet, размер imageInputLayer
224 на 224 на 3. The Classes
свойство выхода classificationLayer
содержит имена классов, выученных сетью. Просмотрите 10 случайных имен классов из 1000.
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
.
Параметры конфигурации модели определяют метод ускорения, используемый во время симуляции.
Откройте диалоговое окно Параметры конфигурации. Откройте панель 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, чтобы сохранить и закрыть диалоговое окно Параметров конфигурации.
Вы можете использовать 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, чтобы сохранить и закрыть диалоговое окно Параметров конфигурации.
Вы также можете использовать set_param
функция для программной настройки параметра модели в Командном окне MATLAB.
set_param('googlenetModel','GenerateGPUCode','CUDA');
В Редактор откройте приложение Simulink Coder.
Сгенерируйте код.
Сообщения отображаются в средстве просмотра. Генератор кода создает исходные и заголовочные файлы CUDA, а также отчет о HTML генерации кода. Генератор кода помещает файлы в папку сборки, подпапку с именем googlenetModel_grt_rtw
в текущей рабочей папке.
Генерация кода для нейронной сети для глубокого обучения с пользовательским слоем не поддерживается в Simulink.
Генерация кода GPU для блоков MATLAB Function в Stateflow® графики не поддерживаются.
Когда GPU acceleration включено, генератор кода не поддерживает Import custom code для импорта пользовательских исходных файлов CUDA (* .cu). Вместо этого используйтеcoder.ceval
внутри блока MATLAB Function.
Блок MATLAB Function не поддерживает все типы данных из языка MATLAB. Поддерживаемые типы данных см. в документации по блокам.
bdclose
(Simulink) | close_system
(Simulink) | get_param
(Simulink) | load_system
(Simulink) | open_system
(Simulink) | save_system
(Simulink) | set_param
(Simulink) | sim
(Simulink) | slbuild
(Simulink)