主要内容

基于Intel mml - dnn的LSTM网络代码生成

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

第三方的先决条件

此示例支持Mac®,Linux®万博1manbetx和Windows®平台,不支持MATLAB Online。

准备输入

加载wordEncodingMAT-file。这个mat文件存储编码为数值索引的单词。这种编码是在网络训练期间进行的。有关更多信息,请参见使用深度学习分类文本数据(文本分析工具箱)

负载(“wordEncoding.mat”);

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

reportsNew = [...“冷却剂在分拣机下面。”“分拣机在启动时炸断保险丝。”“有一些非常响亮的咔嗒声从组装。”“有时机械排列软件会死机。”“混合器输出卡住了。”];

方法将输入字符串标记化preprocessText函数。

documentsNew = preprocessText(reportsNew);

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

XNew = doc2sequence(enc,documentsNew);标签=分类({“电子失败”“泄漏”“机械故障”软件故障的});

lstm_predict入口点函数

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

类型(“lstm_predict.m”
function out = lstm_predict(in) %#codegen %版权所有2020if isempty(mynet) mynet = code . loaddeeplearningnetwork ('textClassifierNetwork.mat');End out = predict(mynet, in);结束

要显示网络体系结构和有关网络层的信息的交互式可视化,请使用analyzeNetwork(深度学习工具箱)函数。

生成墨西哥人

要生成代码,请为MEX目标创建一个代码配置对象,并将目标语言设置为c++。使用编码器。DeepLearningConfig函数,创建mml - dnn深度学习配置对象。将其分配给DeepLearningConfig代码配置对象的属性。

CFG = code .config(墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“mkldnn”);

使用coder.typeof函数指定入口点函数的输入参数的类型和大小。在这个例子中,输入是双数据类型,特征维值为1,序列长度可变。

matrixInput = code .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 = labels(maxIndex);disp (predictedLabels1)
泄漏

生成接受多个观测值的MEX

如果希望同时对多个观测值进行预测,可以将观测值分组在单元格数组中,并将单元格数组传递给预测。单元格数组必须是列单元格数组,并且每个单元格必须包含一个观测值。输入的序列长度可能不同。在这个例子中,XNew包含五个观察结果。生成一个可以接受的MEX函数XNew作为输入,指定输入类型为5 × 1单元格数组。指定每个单元格具有相同的类型matrixInput

matrixInput = code .typeof(double(0),[1 Inf],[false true]);cellInput =编码器。typeof({matrixInput}, [5 1]);codegen配置cfglstm_predictarg游戏{cellInput}报告
代码生成成功:查看报告

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

YPred2 = lstm_predict_mex(XNew);

YPred2是5 × 4单元格数组。找出对五个输入中的每一个都有最大概率的指标,并对它们进行分类。

[~, maxIndex] = max(YPred2, [], 2);predictedLabels2 =标签(maxIndex);disp (predictedLabels2)
泄漏机械故障机械故障软件故障电子故障

使用有状态LSTM生成MEX

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

入口函数lstm_predict_and_update.m方法接受单时间步输入并处理输入predictAndUpdateState函数。的predictAndUpdateState函数返回对输入时间步长的预测,并更新网络,以便后续输入被视为同一样本的后续时间步。在一次一个地传入所有时间步长之后,所得到的输出与将所有时间步长作为单个输入传入的情况相同。

类型(“lstm_predict_and_update.m”
function out = lstm_predict_and_update(in) %#codegen %if isempty(mynet) mynet = code . loaddeeplearningnetwork ('textClassifierNetwork.mat');end [mynet, out] = predictAndUpdateState(mynet,in);结束

lstm_predict_and_update.由于此函数在每次调用时接受单个时间步长,因此指定matrixInput有一个固定的序列维数为1,而不是可变的序列长度。

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

在第一次观察时运行生成的MEX。

sequenceLength = size(XNew{1},2);i=1:sequenceLength inTimeStep = XNew{1}(:,i);YPred3 = lstm_predict_and_update_mex(inTimeStep);结束清晰的墨西哥人

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

[~, maxIndex] = max(YPred3);predictedLabels3 =标签(maxIndex);disp (predictedLabels3)
泄漏

另请参阅

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

相关的话题