主要内容

代码生成的Sequence-to-Sequence LSTM网络

这个案例展示了如何生成CUDA®代码很长一段短期记忆(LSTM)网络。示例应用程序生成一个墨西哥人,使得预测输入timeseries的每一步。演示了两种方法:一种方法使用标准LSTM网络,和一种方法利用相同的LSTM网络的有状态的行为。这个示例使用加速度计传感器数据的智能手机进行了身体,使预测使用者的活动。用户动作分为五类,即跳舞、跑步,坐着,站着,和散步。这个例子使用一个pretrained LSTM网络。有关培训的更多信息,请参阅使用深度学习序列分类深度学习工具箱™的例子。

第三方的先决条件

要求

这个示例中生成CUDA墨西哥人,有以下第三方的要求。

  • CUDA启用NVIDIA GPU®和兼容的驱动程序。

可选

等non-MEX构建静态、动态库或可执行文件,这个例子有以下额外的需求。

验证GPU环境

使用coder.checkGpuInstall(GPU编码器)函数来确认所需的编译器和库运行这个例子是正确设置。

envCfg = coder.gpuEnvConfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

lstmnet_predict入口点函数

一个sequence-to-sequence LSTM网络使您能够做出不同的预测数据序列的每个时间步。的lstmnet_predict.m入口点函数接受一个输入序列并将其传递到一个训练有素的LSTM网络预测。具体来说,该函数使用LSTM网络训练的使用深度学习序列序列分类的例子。加载的网络对象的函数lstmnet_predict.mat文件到一个持久变量和重用后续预测的持久对象调用。

显示一个交互式可视化的网络体系结构和网络层的信息,使用analyzeNetwork函数。

类型(“lstmnet_predict.m”)
函数= lstmnet_predict () % # codegen % MathWorks版权2019 - 2021,公司持续mynet;如果isempty (mynet) mynet = coder.loadDeepLearningNetwork (“lstmnet.mat”);结束%通过在输入=预测(mynet,);

生成CUDA墨西哥人

生成CUDA的墨西哥人lstmnet_predict.m入口点函数,创建一个GPU配置对象,并指定目标是墨西哥人。设置目标语言c++。创建一个指定目标的深度学习配置对象库cuDNN。将这个深度学习配置对象附加到GPU配置对象。

cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig = coder.DeepLearningConfig (“cudnn”);

在编译时,GPU编码器™必须知道所有输入的数据类型的入口点函数。指定输入参数的类型和大小codegen(MATLAB编码器)命令使用coder.typeof(MATLAB编码器)函数。对于本例,双数据类型的输入是一个特征维度三个和一个变量的值序列长度。指定的序列长度大小可变的使我们对任何长度的输入序列进行预测。

matrixInput = coder.typeof(双(0),[3正],[假真]);

codegen命令运行。

codegen配置cfglstmnet_predictarg游戏{matrixInput}报告
代码生成成功:查看报告

测试数据上运行生成的墨西哥人

加载HumanActivityValidateMAT-file。这个MAT-file存储变量XValidate包含样本timeseries的传感器读数可以测试生成的代码。调用lstmnet_predict_mex在第一次观察。

负载HumanActivityValidateYPred1 = lstmnet_predict_mex (XValidate {1});

YPred1是一个5 -,- 53888数字矩阵包含概率的五类为每个53888时间步。对于每一个时间步,找到预测类通过计算最大概率指数。

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

副最大概率的指标对应的标签。显示前十的标签。从结果中,您可以看到网络预测人类坐第十次步骤。

标签=分类({“跳舞”,“奔跑”,“坐”,“站”,“走”});predictedLabels1 =标签(maxIndex);disp (predictedLabels1 (1:10)”)
坐着坐着坐着坐着坐着坐着坐着坐着坐着坐着

预测与试验数据相比较

使用一个情节比较墨西哥人输出数据与测试数据。

图绘制(predictedLabels1,“。”);持有情节(YValidate {1});持有包含(“时间步”)ylabel (“活动”)标题(“预测活动”)传说([“预测”“测试数据”])

调用生成的墨西哥人的观察序列长度不同

调用lstmnet_predict_mex在第二个观察不同序列长度。在这个例子中,XValidate {2}的序列长度为64480而XValidate {1}有一个序列长度为53888。生成的代码处理预测正确,因为我们指定的序列长度尺寸是适应的。

YPred2 = lstmnet_predict_mex (XValidate {2});[~,maxIndex] = max (YPred2 [], 1);predictedLabels2 =标签(maxIndex);disp (predictedLabels2 (1:10)”)
坐着坐着坐着坐着坐着坐着坐着坐着坐着坐着

在多个观测生成需要的墨西哥人

如果你想执行预测在许多观察一次,你可以观察分组单元阵列,通过预测单元阵列。单元阵列必须列单元阵列,每个细胞必须包含一个观察。每个维度观察必须具有相同的特性,但序列长度可能会有所不同。在这个例子中,XValidate包含五个观察。可以生成一个墨西哥人XValidate作为输入,指定输入类型是5-by-1单元阵列。此外,指定每个单元是相同类型的matrixInput指定的类型,单一的观察在前面codegen命令。

matrixInput = coder.typeof(双(0),[3正],[假真]);cellInput =编码器。typeof ({matrixInput} 1 [5]);codegen配置cfglstmnet_predictarg游戏{cellInput}报告
代码生成成功:查看报告
YPred3 = lstmnet_predict_mex (XValidate);

输出是一个5-by-1单元阵列的预测五观察传入。

disp (YPred3)
{5×53888单}{5×64480单}{5×53696单}{5×56416单}{5×50688单}

生成与状态LSTM墨西哥人

而不是通过整个timeseries预测在一个步骤,我们可以预测运行在一个输入流的一个步伐,利用函数predictAndUpdateState这个函数接受一个输入,产生一个输出预测和更新网络的内部状态,以便未来预测考虑初始输入。

的入口点函数lstmnet_predict_and_update.m以在single-timestep输入和过程输入使用predictAndUpdateState函数。predictAndUpdateState输出对输入的步伐的预测和更新网络,以便后续的输入被视为后续相同样品的步伐。经过所有的步伐一次,由此产生的输出是一样的,如果步伐都是作为一个输入传递。

类型(“lstmnet_predict_and_update.m”)
函数= lstmnet_predict_and_update () % # codegen % MathWorks版权2019 - 2021,公司持续mynet;如果isempty (mynet) mynet = coder.loadDeepLearningNetwork (“lstmnet.mat”);结束%通过输入[mynet,] = predictAndUpdateState (mynet,);

这个新的设计文件上运行codegen。因为我们正在一个步伐每个调用,我们指定matrixInput有一个固定的序列维度1而不是一个变量序列长度。

matrixInput = coder.typeof(双(0),1 [3]);codegen配置cfglstmnet_predict_and_updatearg游戏{matrixInput}报告
代码生成成功:查看报告

运行生成的墨西哥人在第一次验证示例的第一个步伐。

firstSample = XValidate {1};firstTimestep = firstSample (: 1);YPredStateful = lstmnet_predict_and_update_mex (firstTimestep);[~,maxIndex] = max (YPredStateful [], 1);predictedLabelsStateful1 =标签(maxIndex)
predictedLabelsStateful1 =分类坐着

比较输出标签与地面真理。

YValidate {1} (1)
ans =分类坐着