Глубокое обучение в Simulink при помощи блока MATLAB function

С помощью GPU Coder™ можно сгенерировать оптимизированный код для Simulink® модели, содержащие множество обученных нейронных сетей для глубокого обучения. Реализовать функциональность глубокого обучения в Simulink можно с помощью блоков MATLAB Function или с помощью блоков из библиотеки Deep Neural Networks. При реализации с MATLAB Function блоками используйте coder.loadDeepLearningNetwork функция для загрузки обученной нейронной сети для глубокого обучения и использования объектных функций сетевого объекта для получения желаемых откликов. Можно настроить генератор кода, чтобы использовать преимущества NVIDIA® CUDA® библиотека глубоких нейронных сетей (cuDNN) и 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. 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'
    

Создайте модель GoogLeNet

  1. Создайте модель Simulink и вставьте блок MATLAB Function из библиотеки User-Defined Functions.

  2. Добавьте блок Image From File из библиотеки Computer Vision Toolbox™ и установите File name параметр в peppers.png.

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

    Simulink model containing blocks for classifying images using GoogLeNet.

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

  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 (Deep Learning Toolbox) и resetState (Deep Learning Toolbox) методы. Примечания по указаниям по применению и ограничения этого метода смотрите в Поддерживаемые функции.

  6. Откройте параметры блоков MATLAB Function. На вкладке Code Generation выберите Reusable function для Function packaging.

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

    Simulink model showing connection between the blocks.

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

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

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

    ПараметрНастройкаЭффект на сгенерированный код
    TypeFixed-stepПоддерживает постоянный (фиксированный) размер шага, который необходим для генерации кода
    Solverdiscrete (no continuous states)Применяет метод интегрирования с фиксированным шагом для вычисления производной состояния модели
    Fixed-step sizeautoSimulink выбирает размер шага

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

  2. Выберите панель Simulation Target. Установите Language равным C++.

  3. Выберите GPU acceleration.

    опции, относящиеся к GPU Coder, теперь видны на панели Simulation Target > GPU Acceleration. В данном примере можно использовать значения по умолчанию для этих специфичных для графического процессора параметров.

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

  4. На панели Simulation Target установите параметр Target Library в группе Deep learning равным cuDNN.

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

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

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

    Вы можете использовать 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. Выберите панель Code Generation. Установите System target file равным grt.tlc.

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

  2. Установите Language равным C++.

  3. Выберите Generate GPU code.

  4. Выберите Generate code only.

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

  6. На панели Code Generation > Report выберите Create code generation report и Open report automatically.

  7. На панели Code Generation > Interface установите значение Target Library в группе Deep learning cuDNN.

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

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

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

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

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

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

Сгенерируйте код CUDA для модели

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

  2. Сгенерируйте код.

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

Ограничения

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

  • Генерация кода GPU для блоков MATLAB Function в Stateflow® графики не поддерживаются.

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

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

См. также

Функции

Похожие темы