В этом примере показано, как сгенерировать код CUDA® для сети долгой краткосрочной памяти (LSTM). Пример генерирует приложение MEX, которое делает прогнозы на каждом шаге входа timeseries. Этот пример использует данные о датчике акселерометра из смартфона, продолжил тело и делает прогнозы на действии владельца. Пользовательские перемещения классифицируются в одну из пяти категорий, а именно, танца, выполнения, нахождения, положения и обхода. Пример использует предварительно обученную сеть LSTM. Для получения дополнительной информации об обучении смотрите, что Классификация Последовательностей Использует Глубокое обучение (Deep Learning Toolbox) пример от Deep Learning Toolbox™.
CUDA включил NVIDIA®, графический процессор с вычисляет возможность 3.5 или выше.
NVIDIA инструментарий CUDA и драйвер.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты. Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов.
Интерфейс 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]