基于Intel MKL-DNN的LSTM网络代码生成
这个例子展示了如何为预训练的长短时记忆(LSTM)网络生成代码,该网络使用了深度神经网络(MKL-DNN)的英特尔数学内核库。这个示例生成一个MEX函数,该函数对输入时间序列的每一步进行预测。该示例演示了两种方法。第一种方法使用标准的LSTM网络。第二种方法利用同一LSTM网络的有状态行为。这个例子使用了工厂事件的文本描述,这些事件可以分为以下四类:电子故障、泄漏、机械故障和软件故障。该示例使用预先训练的LSTM网络。有关培训网络的更多信息,请参见使用深度学习对文本数据进行分类(文本分析工具箱).
第三方的先决条件
Intel深度神经网络数学内核库(MKL-DNN)
有关支持MKL-DNN库的处理器列表,请参见MKLDNN CPU支持
有关编译器和库的支持版本的更多信息,请参见用MATLAB编码器进行深度学习的先决条件
此示例支持Mac®,Linux®和Windows®平台,不支持MATLAB Online。
准备输入
加载wordEncoding
MAT-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)
泄漏
另请参阅
编码器。DeepLearningConfig
|doc2sequence
(文本分析工具箱)|coder.typeof
|codegen
相关的话题
- 使用深度学习对文本数据进行分类(文本分析工具箱)
- 用MATLAB编码器进行深度学习的先决条件