exponenta event banner

Глубокое обучение в Simulink с помощью функционального блока MATLAB

С помощью графического процессора Coder™ можно создавать оптимизированный код для моделей Simulink ®, содержащих различные обучаемые сети глубокого обучения. Функции глубокого обучения можно реализовать в Simulink, используя функциональные блоки MATLAB или блоки из библиотеки Deep Neural Networks. При реализации с функциональными блоками MATLAB используйте coder.loadDeepLearningNetwork функция загрузки обученной сети глубокого обучения и использование объектных функций сетевого объекта для получения требуемых откликов. Генератор кода можно настроить таким образом, чтобы использовать преимущества библиотеки глубоких нейронных сетей (cuDNN) NVIDIA ® CUDA ® и TensorRT™ высокопроизводительные библиотеки выводов для графических процессоров NVIDIA. Созданный код реализует глубокую сверточную нейронную сеть (CNN) с помощью архитектуры, уровней и параметров, заданных в сетевом объекте.

Пример: Классификация изображений с помощью GoogLeNet

GoogLeNet прошел обучение на более чем миллионе изображений и может классифицировать изображения на 1000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и животные). Сеть принимает изображение в качестве входного, а затем выводит метку для объекта в изображении вместе с вероятностями для каждой из категорий объектов. В этом примере показано, как выполнять моделирование и генерировать код CUDA для предварительно обученных googlenet глубокая сверточная нейронная сеть и классифицируют изображение.

  1. Загрузите предварительно подготовленную сеть GoogLeNet. Можно загрузить другую предварительно подготовленную сеть для классификации изображений. Если необходимые пакеты поддержки не установлены, установите программное обеспечение в соответствии с приведенными инструкциями.

    net = googlenet;
    

  2. Объект net содержит DAGNetwork объект. Используйте analyzeNetwork функция для отображения интерактивной визуализации сетевой архитектуры, обнаружения ошибок и проблем в сети и отображения подробной информации о сетевых уровнях. Информация о слое включает в себя размеры активизаций слоя и обучаемых параметров, общее количество обучаемых параметров и размеры параметров состояния повторяющихся слоев.

    analyzeNetwork(net);
    

    Analyze network app showing network analysis of GoogLeNet.

  3. Изображение, которое требуется классифицировать, должно иметь тот же размер, что и входной размер сети. Для 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'
    

Создание модели GoogLeNet

  1. Создайте модель Simulink и вставьте блок MATLAB Function из библиотеки пользовательских функций.

  2. Добавьте блок «Изображение из файла» из библиотеки Computer Vision Toolbox™ и установите File name параметр для peppers.png.

  3. Добавьте в модель блок Resize из библиотеки инструментов Computer Vision Toolbox. Задайте для параметра «Указать» блока «Изменить размер» значение Number of output rows and columns и введите [224 224] в качестве значения для числа выходных строк и столбцов. Этот блок изменяет размер входного изображения на размер входного уровня сети.

    Simulink model containing blocks for classifying images using GoogLeNet.

  4. Дважды щелкните по блоку MATLAB Function. Сигнатура функции по умолчанию появляется в редакторе функциональных блоков MATLAB.

  5. Определение функции с именем 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). Примечания по использованию и ограничения этого метода см. в разделе Поддерживаемые функции.

  6. Откройте параметры блока функции MATLAB. На вкладке Создание кода выберите Reusable function для упаковки функций.

  7. Подключите эти блоки, как показано на схеме. Сохранить модель как googlenetModel.

    Simulink model showing connection between the blocks.

Настройка модели для ускорения графического процессора

Параметры конфигурации модели определяют метод ускорения, используемый при моделировании.

  1. Откройте диалоговое окно «Параметры конфигурации». Откройте панель Решатель (Solver). Чтобы скомпилировать модель для ускорения и создать код CUDA, настройте модель на использование решателя с фиксированным шагом. В этой таблице показана конфигурация решателя для этого примера.

    ПараметрНастройкаВлияние на сгенерированный код
    НапечататьFixed-stepПоддерживает постоянный (фиксированный) размер шага, необходимый для создания кода
    Решающее устройствоdiscrete (no continuous states)Применение метода интеграции с фиксированным шагом для вычисления производной состояния модели
    Фиксированный размер шагаautoSimulink выбирает размер шага

    Snapshot of the configuration parameters dialog showing solver options for simulation.

  2. Выберите панель Цель моделирования (Simulation Target). Установите язык в значение C++.

  3. Выберите ускорение графического процессора.

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

    GPU Acceleration pane on the configuration parameters dialog of the model.

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

    Snapshot of the configuration parameters dialog showing deep learning options for simulation acceleration.

    Также можно выбрать TensorRT для назначения высокопроизводительных библиотек выводов TensorRT для графических процессоров NVIDIA.

  5. Нажмите кнопку ОК, чтобы сохранить и закрыть диалоговое окно Параметры конфигурации (Configuration Parameters).

    Вы можете использовать set_param для конфигурирования параметра модели программным способом в окне команд MATLAB ®.

    set_param('googlenetModel','GPUAcceleration','on');
    

Ускоренная модель графического процессора сборки

  1. Чтобы построить и смоделировать ускоренную модель графического процессора, выберите команду Выполнить (Run) на вкладке Моделирование (Simulation) или используйте команду MATLAB:

    out = sim('googlenetModel');
    

    Сначала программа проверяет, был ли предварительно скомпилирован код CUDA/C + + для вашей модели. Если код был создан ранее, программа запускает модель. Если код ранее не создавался, программное обеспечение сначала генерирует и компилирует код CUDA/C + +, а затем запускает модель. Инструмент создания кода помещает созданный код в подпапку рабочей папки с именемslprj/_slprj/googlenetModel.

  2. Отображение пяти лучших прогнозируемых меток и связанных с ними вероятностей в виде гистограммы. Поскольку в сети изображения классифицируются по множеству категорий объектов, а многие категории схожи, при оценке сетей обычно учитывается пять основных показателей точности. Сеть классифицирует изображение как колокольный перец с высокой вероятностью.

    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')
    

Конфигурирование модели для создания кода

Параметры конфигурации модели предоставляют множество опций для процесса генерации и построения кода.

  1. Выберите панель «Создание кода». Задайте для целевого файла System значение grt.tlc.

    Также можно использовать целевой файл Embedded Coder ® ,ert.tlc.

  2. Установите язык в значение C++.

  3. Выберите Создать код графического процессора.

  4. Выберите Только генерировать код.

  5. Выберите «Цепь инструментов». Для платформ Linux ® выберитеNVIDIA CUDA | gmake (64-bit Linux). Для систем Windows ® выберитеNVIDIA CUDA (w/Microsoft Visual C++ 20XX) | nmake (64-bit windows).

  6. На панели Создание кода > Отчет выберите Создать отчет о создании кода и Открыть отчет автоматически.

  7. На панели «Создание кода» > «Интерфейс» задайте для целевой библиотеки в группе глубокого обучения значение cuDNN.

    Также можно выбрать TensorRT для назначения высокопроизводительных библиотек выводов TensorRT для графических процессоров NVIDIA.

  8. Если параметр Generate GPU code включен, параметры, относящиеся к кодеру GPU, отображаются на панели Code Generation > GPU Code. В этом примере можно использовать значения по умолчанию параметров, специфичных для графического процессора, в окне «Создание кода» > «Код графического процессора».

    GPU Code pane on the configuration parameters dialog of the model.

  9. Нажмите кнопку ОК, чтобы сохранить и закрыть диалоговое окно Параметры конфигурации (Configuration Parameters).

    Также можно использовать set_param для конфигурирования параметра модели программным способом в окне команд MATLAB.

    set_param('googlenetModel','GenerateGPUCode','CUDA');
    

Создание кода CUDA для модели

  1. В редакторе Simulink откройте приложение Simulink Coder.

  2. Создать код.

Сообщения появляются в программе Diagnostics Viewer. Генератор кода создает исходные и заголовочные файлы CUDA и отчет о создании кода HTML. Генератор кода помещает файлы в папку построения, подпапку с именем googlenetModel_grt_rtw в текущей рабочей папке.

Ограничения

  • Создание кода для сети глубокого обучения с пользовательским уровнем не поддерживается в Simulink.

  • Генерация кода графического процессора для функциональных блоков MATLAB в диаграммах Stateflow ® не поддерживается.

  • Если включено ускорение графического процессора, генератор кода не поддерживает импорт пользовательского кода для импорта пользовательских исходных файлов CUDA (* .cu). Вместо этого используйтеcoder.ceval внутри функционального блока MATLAB.

  • Функциональный блок MATLAB поддерживает не все типы данных из языка MATLAB. Поддерживаемые типы данных см. в документации по блокам.

См. также

Функции

Связанные темы