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