С помощью графического процессора Coder™ можно создавать оптимизированный код для моделей Simulink ®, содержащих различные обучаемые сети глубокого обучения. Функции глубокого обучения можно реализовать в Simulink, используя функциональные блоки MATLAB или блоки из библиотеки Deep Neural Networks. При реализации с функциональными блоками MATLAB используйте coder.loadDeepLearningNetwork функция загрузки обученной сети глубокого обучения и использование объектных функций сетевого объекта для получения требуемых откликов. Генератор кода можно настроить таким образом, чтобы использовать преимущества библиотеки глубоких нейронных сетей (cuDNN) NVIDIA ® CUDA ® и TensorRT™ высокопроизводительные библиотеки выводов для графических процессоров NVIDIA. Созданный код реализует глубокую сверточную нейронную сеть (CNN) с помощью архитектуры, уровней и параметров, заданных в сетевом объекте.
GoogLeNet прошел обучение на более чем миллионе изображений и может классифицировать изображения на 1000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и животные). Сеть принимает изображение в качестве входного, а затем выводит метку для объекта в изображении вместе с вероятностями для каждой из категорий объектов. В этом примере показано, как выполнять моделирование и генерировать код CUDA для предварительно обученных googlenet глубокая сверточная нейронная сеть и классифицируют изображение.
Загрузите предварительно подготовленную сеть GoogLeNet. Можно загрузить другую предварительно подготовленную сеть для классификации изображений. Если необходимые пакеты поддержки не установлены, установите программное обеспечение в соответствии с приведенными инструкциями.
net = googlenet;
Объект net содержит DAGNetwork объект. Используйте analyzeNetwork функция для отображения интерактивной визуализации сетевой архитектуры, обнаружения ошибок и проблем в сети и отображения подробной информации о сетевых уровнях. Информация о слое включает в себя размеры активизаций слоя и обучаемых параметров, общее количество обучаемых параметров и размеры параметров состояния повторяющихся слоев.
analyzeNetwork(net);

Изображение, которое требуется классифицировать, должно иметь тот же размер, что и входной размер сети. Для GoogLeNet - размер imageInputLayer 224 на 224 на 3. 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 из библиотеки пользовательских функций.
Добавьте блок «Изображение из файла» из библиотеки Computer Vision Toolbox™ и установите File name параметр для peppers.png.
Добавьте в модель блок Resize из библиотеки инструментов Computer Vision Toolbox. Задайте для параметра «Указать» блока «Изменить размер» значение Number of output rows and columns и введите [224 224] в качестве значения для числа выходных строк и столбцов. Этот блок изменяет размер входного изображения на размер входного уровня сети.

Дважды щелкните по блоку MATLAB Function. Сигнатура функции по умолчанию появляется в редакторе функциональных блоков MATLAB.
Определение функции с именем 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 (инструментарий глубокого обучения) и resetState Методы (Deep Learning Toolbox). Примечания по использованию и ограничения этого метода см. в разделе Поддерживаемые функции.
Откройте параметры блока функции MATLAB. На вкладке Создание кода выберите Reusable function для упаковки функций.
Подключите эти блоки, как показано на схеме. Сохранить модель как googlenetModel.

Параметры конфигурации модели определяют метод ускорения, используемый при моделировании.
Откройте диалоговое окно «Параметры конфигурации». Откройте панель Решатель (Solver). Чтобы скомпилировать модель для ускорения и создать код CUDA, настройте модель на использование решателя с фиксированным шагом. В этой таблице показана конфигурация решателя для этого примера.
| Параметр | Настройка | Влияние на сгенерированный код |
|---|---|---|
| Напечатать | Fixed-step | Поддерживает постоянный (фиксированный) размер шага, необходимый для создания кода |
| Решающее устройство | discrete (no continuous states) | Применение метода интеграции с фиксированным шагом для вычисления производной состояния модели |
| Фиксированный размер шага | auto | Simulink выбирает размер шага |

Выберите панель Цель моделирования (Simulation Target). Установите язык в значение C++.
Выберите ускорение графического процессора.
параметры, относящиеся к кодеру графического процессора, теперь отображаются на панели «Цель моделирования» > «Ускорение графического процессора». В этом примере можно использовать значения по умолчанию для этих параметров, специфичных для графического процессора.

На панели «Цель моделирования» задайте для параметра «Целевая библиотека» в группе глубокого обучения значение cuDNN.

Также можно выбрать TensorRT для назначения высокопроизводительных библиотек выводов TensorRT для графических процессоров NVIDIA.
Нажмите кнопку ОК, чтобы сохранить и закрыть диалоговое окно Параметры конфигурации (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')

Параметры конфигурации модели предоставляют множество опций для процесса генерации и построения кода.
Выберите панель «Создание кода». Задайте для целевого файла System значение grt.tlc.
Также можно использовать целевой файл Embedded Coder ® ,ert.tlc.
Установите язык в значение C++.
Выберите Создать код графического процессора.
Выберите Только генерировать код.
Выберите «Цепь инструментов». Для платформ Linux ® выберитеNVIDIA CUDA | gmake (64-bit Linux). Для систем Windows ® выберитеNVIDIA CUDA (w/Microsoft Visual C++ 20XX) | nmake (64-bit windows).
На панели Создание кода > Отчет выберите Создать отчет о создании кода и Открыть отчет автоматически.
На панели «Создание кода» > «Интерфейс» задайте для целевой библиотеки в группе глубокого обучения значение cuDNN.
Также можно выбрать TensorRT для назначения высокопроизводительных библиотек выводов TensorRT для графических процессоров NVIDIA.
Если параметр Generate GPU code включен, параметры, относящиеся к кодеру GPU, отображаются на панели Code Generation > GPU Code. В этом примере можно использовать значения по умолчанию параметров, специфичных для графического процессора, в окне «Создание кода» > «Код графического процессора».

Нажмите кнопку ОК, чтобы сохранить и закрыть диалоговое окно Параметры конфигурации (Configuration Parameters).
Также можно использовать set_param для конфигурирования параметра модели программным способом в окне команд MATLAB.
set_param('googlenetModel','GenerateGPUCode','CUDA');
В редакторе Simulink откройте приложение Simulink Coder.
Создать код.
Сообщения появляются в программе Diagnostics Viewer. Генератор кода создает исходные и заголовочные файлы CUDA и отчет о создании кода HTML. Генератор кода помещает файлы в папку построения, подпапку с именем googlenetModel_grt_rtw в текущей рабочей папке.
Создание кода для сети глубокого обучения с пользовательским уровнем не поддерживается в Simulink.
Генерация кода графического процессора для функциональных блоков MATLAB в диаграммах Stateflow ® не поддерживается.
Если включено ускорение графического процессора, генератор кода не поддерживает импорт пользовательского кода для импорта пользовательских исходных файлов CUDA (* .cu). Вместо этого используйтеcoder.ceval внутри функционального блока MATLAB.
Функциональный блок MATLAB поддерживает не все типы данных из языка MATLAB. Поддерживаемые типы данных см. в документации по блокам.
bdclose (Simulink) | close_system (Simulink) | get_param (Simulink) | load_system (Simulink) | open_system (Simulink) | save_system (Simulink) | set_param (Simulink) | sim (Simulink) | slbuild (Симулинк)