主要内容

基于Intel MKL-DNN的LSTM网络代码生成

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

第三方的先决条件

此示例支持Mac®,Linux®和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 % Copyright 2020 The MathWorks, Inc. persistent mynet;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('textClassifierNetwork.mat');End out =预测(mynet, in);结束

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

生成墨西哥人

要生成代码,为MEX目标创建一个代码配置对象,并将目标语言设置为c++。使用编码器。DeepLearningConfig命令,创建MKL-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 = coder。typeof({matrixInput}, [5 1]);codegen配置cfglstm_predictarg游戏{cellInput}报告
代码生成成功:查看报告

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

YPred2 = lstm_predict_mex(XNew);

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

[~, maxIndex] = max(YPred2, [], 2);predictedLabels2 = labels(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 %版权所有2020 The MathWorks, Inc. persistent mynet;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 = labels(maxIndex);disp (predictedLabels3)
泄漏

另请参阅

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

相关的话题

Baidu
map