主要内容

使用Intel MKL-DNN的LSTM网络的代码生成

这个例子展示了如何为预先训练的长短期记忆(LSTM)网络生成代码,该网络使用英特尔深度神经网络数学内核库(MKL-DNN)。此示例生成一个MEX函数,该函数对输入时间序列的每个步骤进行预测。该示例演示了两种方法。第一种方法使用标准LSTM网络。第二种方法利用同一个LSTM网络的有状态行为。此示例使用了工厂事件的文本描述,这些事件可以分为以下四类之一:电子故障、泄漏、机械故障和软件故障。这个例子使用了一个预训练的LSTM网络。有关培训网络的更多信息,请参见利用深度学习对文本数据进行分类(文本分析工具箱)

第三方先决条件

这个例子支持Mac®,Linux金宝app®和Windows®平台,不支持MATLAB在线。

准备投入

加载wordEncodingMat文件。此MAT文件将编码为数字索引的单词存储。该编码是在网络训练期间执行的。有关更多信息,请参阅利用深度学习对文本数据进行分类(文本分析工具箱)

负载(“Wordencoding.mat”);

创建一个包含新报告的字符串数组来对事件类型进行分类。

eportsnew = [...“冷却液在分拣机下面汇集。”“分拣机在启动时吹熔断。”“汇编者有一些非常响亮的嘎嘎声的声音。”“机械安排软件有时会死机。”“混频器输出卡住。”];

使用该输入字符串授权PreprocessText.函数。

documentsNew = preprocessText (reportsNew);

使用doc2sequence.(文本分析工具箱)函数将文档转换为序列。

xnew = doc2sequence(enc,dooksnew);标签=分类({'电子失败''泄漏''机械故障'软件故障的});

lstm_predict入口点函数

序列到序列的LSTM网络使您能够对数据序列的每个时间步长进行不同的预测。的lstm_predict.m入口点函数取一个输入序列,并将其传递给经过训练的LSTM网络进行预测。具体来说,该函数使用示例中训练的LSTM网络利用深度学习对文本数据进行分类(文本分析工具箱).对象中加载网络对象textclassifernetwork.mat.文件化为持久变量,然后执行预测。在随后的调用中,函数将重用持久对象。

类型(“lstm_predict.m”
function out = lstm_predict(in) %#codegen % Copyright 2020 The MathWorks, Inc. persistent mynet;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('textClassifierNetwork.mat');End out = predict(mynet, in);结束

要显示网络架构的交互式可视化和关于网络层的信息,请使用分析(深度学习工具箱)函数。

生成墨西哥人

要生成代码,请为MEX目标创建一个代码配置对象,并将目标语言设置为c++。使用coder.deeplearningconfig功能创建MKL-DNN Deep Learing配置对象。将它分配给DeeplearningConfig代码配置对象的属性。

cfg = coder.config (墨西哥人的);cfg。TargetLang =“c++”;cfg.deeplearningconfig = coder.deeplearningconfig('mkldnn');

使用Coder.typeof.函数指定输入参数的类型和大小为入门点函数。在该示例中,输入具有双数据类型,具有1的特征尺寸值为1和变量序列长度。

matrixInput = coder.typeof(double(0),[1 inf],[false true]);

控件生成一个MEX函数codegen命令。

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

运行生成的mex.

调用lstm_predict_mex关于第一次观察。

ypred1 = lstm_predict_mex(xnew {1});

ypred1.包含四个类的概率。通过计算最大概率的索引来查找预测的类。

[~, maxIndex] = max(YPred1);

将最大概率的指数与相应的标签相关联。显示分类。从结果中,您可以看到网络预测第一个事件泄漏。

predictedLabels1 =标签(maxIndex);disp (predictedLabels1)
泄漏

生成接受多个观察的MEX

如果您想立即对许多观测执行预测,可以将观察分组在单元格数组中,并通过单元格阵列进行预测。单元阵列必须是列单元阵列,并且每个单元必须包含一个观察。输入的序列长度可能会有所不同。在这个例子中,XNew包含五个观察。生成一个可以接受的MEX函数XNew作为输入,将输入类型指定为5×1个单元格数组。指定每个单元格的类型为矩阵扣上

matrixInput = coder.typeof(double(0),[1 inf],[false true]);cellinput = coder.typeof({matrixInput},[5 1]);codegen配置cfglstm_predictarg游戏{cellInput}-报告
代码生成成功:查看报告

使用。运行生成的MEX函数XNew作为输入。

YPred2 = lstm_predict_mex (XNew);

ypred2.是5 × 4单元格阵列。找出对这五个输入中每一个有最大概率的指标,并对它们进行分类。

[〜,maxindex] = max(ypred2,[],2);predigedlabels2 =标签(maxindex);disp(predigedlabels2)
泄漏机械故障机械故障软件故障电子故障

使用有状态LSTM生成MEX

而不是将整个时间序列传递给预测在单一的步骤中,您可以通过一次在一次时间步进并使用该功能来运行对输入的预测predictAndUpdateState(深度学习工具箱).此函数接受输入,生成输出预测,并更新网络的内部状态,以便未来的预测将此初始输入考虑在内。

的入口点函数lstm_predict_and_update.m.接受单倍时间的输入并使用使用的输入predictAndUpdateState函数。的predictAndUpdateState函数返回输入时间步长的预测并更新网络,以便后续输入被视为相同示例的后续时间步长。每次传入一个时间步长之后,产生的输出与将所有时间步长作为单个输入传入的情况相同。

类型('lstm_predict_and_update.m'
offing = lstm_predict_and_update(in)%#codegen%copyright 2020 mathworks,Inc。持久性MyNet;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('textClassifierNetwork.mat');结束[MyNet,Out] = predictandanddatestate(Mynet,In);结束

生成的代码lstm_predict_and_update..因为这个函数在每次调用时接受一个时间步长,所以请指定矩阵扣上具有1的固定序列尺寸,而不是可变序列长度。

matrixInput = Coder.typeof(Double(0),[1 1]);codegen配置cfglstm_predict_and_update.arg游戏{matrixInput}-报告
代码生成成功:查看报告

在第一个观察结果上运行生成的MEX。

sequencelength = size(xnew {1},2);i = 1:Sequencelength intimestep = xnew {1}(:, i);ypred3 = lstm_predict_and_update_mex(intimestep);结束清除梅克斯

找到具有最高概率的索引并将其映射到标签。

[〜,maxindex] = max(ypred3);predigedlabels3 =标签(maxindex);disp(predigedlabels3)
泄漏

另请参阅

|||(文本分析工具箱)

相关话题