Генерация кода для сети от последовательности к последовательности LSTM

В этом примере показано, как сгенерировать код CUDA® для сети долгой краткосрочной памяти (LSTM). Пример генерирует приложение MEX, которое делает прогнозы на каждом шаге входа timeseries. Этот пример использует данные о датчике акселерометра из смартфона, продолжил тело и делает прогнозы на действии владельца. Пользовательские перемещения классифицируются в одну из пяти категорий, а именно, танца, выполнения, нахождения, положения и обхода. Пример использует предварительно обученную сеть LSTM. Для получения дополнительной информации об обучении смотрите, что Классификация Последовательностей Использует пример Глубокого обучения от Deep Learning Toolbox™.

Предпосылки

  • CUDA включил NVIDIA®, графический процессор с вычисляет возможность 3.5 или выше.

  • NVIDIA инструментарий CUDA и драйвер.

  • Библиотека NVIDIA cuDNN.

  • Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты (GPU Coder). Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов (GPU Coder).

  • Интерфейс GPU Coder для Библиотек Глубокого обучения поддерживает пакет. Чтобы установить этот пакет поддержки, используйте Add-On Explorer.

Проверьте среду графического процессора

Используйте coder.checkGpuInstall функция, чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

lstmnet_predict Функция точки входа

Сеть LSTM от последовательности к последовательности позволяет вам сделать различные прогнозы для каждого отдельного временного шага последовательности данных. lstmnet_predict.m функция точки входа берет входную последовательность и передает ее обученной сети LSTM для прогноза. А именно, функция использует сеть LSTM, обученную в Последовательности к Классификации Последовательностей Используя пример Глубокого обучения. Функция загружает сетевой объект от lstmnet_predict.mat файл в персистентную переменную и повторные использования постоянный объект на последующих вызовах прогноза.

Чтобы отобразить интерактивную визуализацию сетевой архитектуры и информации о сетевых слоях, используйте analyzeNetwork функция.

type('lstmnet_predict.m')
function out = lstmnet_predict(in) %#codegen

% Copyright 2019 The MathWorks, Inc. 

persistent mynet;

if isempty(mynet)
    mynet = coder.loadDeepLearningNetwork('lstmnet.mat');
end

% pass in input   
out = predict(mynet,in); 

Сгенерируйте MEX CUDA

Сгенерировать MEX CUDA для lstmnet_predict.m функция точки входа, создайте настройку графического процессора, возражают и задают цель, чтобы быть MEX. Установите выходной язык на C++. Создайте объект настройки глубокого обучения, который задает целевую библиотеку как cuDNN. Присоедините этот объект настройки глубокого обучения к объекту настройки графического процессора.

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');

Во время компиляции GPU Coder™ должен знать типы данных всех входных параметров к функции точки входа. Задайте тип и размер входного параметра к codegen команда при помощи coder.typeof функция. В данном примере вход имеет двойной тип данных со значением размерности признаков три и переменная длина последовательности. Определение длины последовательности как переменного размера позволяет нам выполнить прогноз на входной последовательности любой длины.

matrixInput = coder.typeof(double(0),[3 Inf],[false true]);

Запустите codegen команду.

codegen -config cfg lstmnet_predict -args {matrixInput} -report
Code generation successful: To view the report, open('codegen/mex/lstmnet_predict/html/report.mldatx').

Запустите сгенерированный MEX на тестовых данных

Загрузите HumanActivityValidate Matfile. Этот MAT-файл хранит переменную XValidate это содержит демонстрационный timeseries показаний датчика, на которых можно протестировать сгенерированный код. Вызовите lstmnet_predict_mex на первом наблюдении.

load HumanActivityValidate
YPred1 = lstmnet_predict_mex(XValidate{1});

YPred1 5 53888 числовая матрица, содержащая вероятности этих пяти классов для каждого из этих 53 888 временных шагов. Для каждого временного шага найдите предсказанный класс путем вычисления индекса максимальной вероятности.

[~, maxIndex] = max(YPred1, [], 1);

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

labels = categorical({'Dancing', 'Running', 'Sitting', 'Standing', 'Walking'});
predictedLabels = labels(maxIndex);
disp(predictedLabels(1:10))
  Columns 1 through 6

     Sitting      Sitting      Sitting      Sitting      Sitting      Sitting 

  Columns 7 through 10

     Sitting      Sitting      Sitting      Sitting 

Сравните прогнозы с тестовыми данными

Используйте график сравнить выходные данные MEX с тестовыми данными.

figure
plot(predictedLabels,'.-')
hold on
plot(YValidate)
hold off

xlabel("Time Step")
ylabel("Activity")
title("Predicted Activities")
legend(["Predicted" "Test Data"])

Вызовите сгенерированный MEX на наблюдении с различной длиной последовательности

Вызовите lstmnet_predict_mex на втором наблюдении с различной длиной последовательности. В этом примере, Validate{2} имеет длину последовательности 64 480 тогда как Validate{1} имел длину последовательности 53 888. Сгенерированный код обрабатывает прогноз правильно, потому что мы задали размерность длины последовательности, чтобы быть переменным размером.

YPred2 = lstmnet_predict_mex(XValidate{2});

Сгенерируйте MEX, который берет в Нескольких Наблюдениях

Если вы хотите выполнить прогноз на многих наблюдениях целиком, можно собрать в группу наблюдения в массиве ячеек и передать массив ячеек для прогноза. Массив ячеек должен быть массивом ячейки столбца, и каждая ячейка должна содержать одно наблюдение. Каждое наблюдение должно иметь ту же размерность признаков, но длины последовательности могут варьироваться. В этом примере, XValidate содержит пять наблюдений. Сгенерировать MEX, который может взять XValidate как введено, задайте входной тип, чтобы быть массивом ячеек 5 на 1. Далее, укажите, что каждая ячейка имеет тот же тип как matrixInput, тип вы задали для одного наблюдения в предыдущем codegen команда.

matrixInput = coder.typeof(double(0),[3 Inf],[false true]);
cellInput = coder.typeof({matrixInput}, [5 1]);

codegen -config cfg lstmnet_predict -args {cellInput} -report

YPred3 = lstmnet_predict_mex(XValidate);
Code generation successful: To view the report, open('codegen/mex/lstmnet_predict/html/report.mldatx').

Выход является массивом ячеек 5 на 1 прогнозов для этих пяти наблюдений, переданных в.

disp(YPred3)
    [5×53888 single]
    [5×64480 single]
    [5×53696 single]
    [5×56416 single]
    [5×50688 single]

Для просмотра документации необходимо авторизоваться на сайте