Глубокое обучение в Simulink при помощи библиотеки глубоких нейронных сетей

С помощью GPU Coder™ можно сгенерировать оптимизированный код для Simulink® модели, содержащие множество обученных нейронных сетей для глубокого обучения. Можно реализовать функции глубокого обучения в Simulink с помощью блоков MATLAB Function или с помощью блоков из библиотеки Deep Neural Networks. Эта < reservedrangesplaceholder0 > библиотека блоков включает в себя:

Можно настроить генератор кода, чтобы использовать преимущества NVIDIA® CUDA® библиотека глубоких нейронных сетей (cuDNN) и TensorRT™ библиотеки эффективности вывода для графических процессоров NVIDIA. Сгенерированный код реализует глубокую сверточную нейронную сеть (CNN) с помощью архитектуры, слоев и параметров, которые вы задаете в сетевом объекте.

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

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

  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 и вставьте блок Predict из библиотеки Deep Neural Networks.

  2. Добавьте блок 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. Блок изменения размера изменяет размер входа изображения на размер входа слоя сети. Добавьте To Workspace к модели и измените имя переменной на yPred.

    Simulink model containing blocks for classifying images using GoogLeNet.

  3. Откройте Block Parameters (subsystem) блока Predict. Выберите Network from MATLAB function для Network и googlenet для MATLAB function.

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

    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. Можно также выбрать TensorRT.

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

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

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

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

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

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

    out = sim('googlenetModel');
    

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

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

    im = imread('peppers.png');
    predict_scores = out.yPred.Data(:,:,1);
    [scores,indx] = sort(predict_scores,'descend');
    topScores = scores(1:5);
    classNamesTop = classNames(indx(1:5))
    
    h = figure;
    h.Position(3) = 2*h.Position(3);
    ax1 = subplot(1,2,1);
    ax2 = subplot(1,2,2);
    
    image(ax1,im);
    barh(ax2,topScores)
    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.

  8. Опции, характерные для 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® графики не поддерживаются.

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

См. также

Функции

Похожие темы