这个例子展示了如何为预先训练的长短期记忆(LSTM)网络生成代码,该网络使用英特尔深度神经网络数学内核库(MKL-DNN)。此示例生成一个MEX函数,该函数对输入时间序列的每个步骤进行预测。该示例演示了两种方法。第一种方法使用标准LSTM网络。第二种方法利用同一个LSTM网络的有状态行为。此示例使用了工厂事件的文本描述,这些事件可以分为以下四类之一:电子故障、泄漏、机械故障和软件故障。这个例子使用了一个预训练的LSTM网络。有关培训网络的更多信息,请参见利用深度学习对文本数据进行分类(文本分析工具箱).
英特尔深度神经网络数学内核库
有关支持MKL-DNN库的处理器列表,请参阅金宝appMKLDNN CPU支金宝app持
有关编译器和库支持版本的更多信息,请参见金宝app与Matlab编码器深入学习的先决条件
这个例子支持Mac®,Linux金宝app®和Windows®平台,不支持MATLAB在线。
加载wordEncoding
Mat文件。此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}-报告
代码生成成功:查看报告
调用lstm_predict_mex
关于第一次观察。
ypred1 = lstm_predict_mex(xnew {1});
ypred1.
包含四个类的概率。通过计算最大概率的索引来查找预测的类。
[~, maxIndex] = max(YPred1);
将最大概率的指数与相应的标签相关联。显示分类。从结果中,您可以看到网络预测第一个事件泄漏。
predictedLabels1 =标签(maxIndex);disp (predictedLabels1)
泄漏
如果您想立即对许多观测执行预测,可以将观察分组在单元格数组中,并通过单元格阵列进行预测。单元阵列必须是列单元阵列,并且每个单元必须包含一个观察。输入的序列长度可能会有所不同。在这个例子中,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)
泄漏机械故障机械故障软件故障电子故障
而不是将整个时间序列传递给预测
在单一的步骤中,您可以通过一次在一次时间步进并使用该功能来运行对输入的预测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)
泄漏
codegen
|coder.deeplearningconfig
|Coder.typeof.
|doc2sequence.
(文本分析工具箱)