В этом примере показано, как сгенерировать код 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]