В этом примере показано, как сгенерировать код 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 для 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').
Загрузите 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"])

Вызовите lstmnet_predict_mex на втором наблюдении с различной длиной последовательности. В этом примере, Validate{2} имеет длину последовательности 64 480 тогда как Validate{1} имел длину последовательности 53 888. Сгенерированный код обрабатывает прогноз правильно, потому что мы задали размерность длины последовательности, чтобы быть переменным размером.
YPred2 = lstmnet_predict_mex(XValidate{2});
Если вы хотите выполнить прогноз на многих наблюдениях целиком, можно собрать в группу наблюдения в массиве ячеек и передать массив ячеек для прогноза. Массив ячеек должен быть массивом ячейки столбца, и каждая ячейка должна содержать одно наблюдение. Каждое наблюдение должно иметь ту же размерность признаков, но длины последовательности могут варьироваться. В этом примере, 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]