主要内容

使用深度学习生成序列到序列回归的通用C/ c++代码

此示例演示了如何生成不依赖于长短期内存(LSTM)网络的任何第三方深度学习库的普通C / C ++代码。您生成了一个MEX函数,接受表示引擎中各种传感器的时间序列数据。然后,MEX功能对输入次数的每个步骤进行预测,以预测在循环中测量的发动机的剩余使用寿命(RUL)。

此示例使用如[1]中所述的TurboOman发动机劣化模拟数据集,并预先预先预测的LSTM网络,以预测发动机的剩余使用寿命。网络在模拟时间序列数据上培训了100个引擎的序列数据和每个序列末尾的剩余使用寿命的相应值。该训练数据中的每个序列具有不同的长度,并对应于完全运行到故障(RTF)实例。有关培训网络的更多信息,请参阅示例使用深度学习的序列到序列回归(深度学习工具箱)

定义入口点函数Rulpredict.

Rulpredict.入口点函数采用输入序列,并将其传递给训练的序列到序列LSTM网络以进行预测。该函数加载网络对象RULNETWORK.MAT.文件到持久性变量中,并在后续预测调用上重用持久对象。LSTM网络一次对部分序列进行预测一次。在每个时间步骤中,网络在此时间步骤中使用该值的值,以及从上一时间步骤计算的网络状态。网络在每个预测之间更新其状态。这预测函数返回这些预测的序列。预测的最后一个元素对应于预测的部分序列的RUL。

要显示网络架构的交互式可视化和有关网络层的信息,请使用分析(深度学习工具箱)功能。

类型rulPredict.m
函数= rulpredict(in)%#codegen%copyright 2020 mathworks,Inc。持久性MyNet;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('rulNetwork.mat');终端%通过输入以预测方法%,以防止功能将填充添加到数据中,指定迷你批量大小1. OUT =预测(MyNet,In,'Minibatchsize',1);

跑步Rulpredict.关于测试数据

加载turboofanrulvalidate.Mat文件。此Mat文件存储变量xvalidate.它包含用于传感器读数的采样时间序列数据,用于在MATLAB中测试入口点函数。对测试数据进行预测,调用Rulpredict.方法。

加载TurboFanRULValidate.matypred = rulpredict(xvalidate);

可视化绘图中的一些预测。

IDX = RANDPERM(NUMER(YPRED),4);数字为了i = 1:numel(idx)子图(2,2,i)plot(yvalidate {idx(i)},' - ')举行绘图(ypred {idx(i)},'.-')举行离开ylim([0 175])标题(“测试观察”+ idx(i))xlabel(“时间步骤”) ylabel (“原则”结尾传奇([“测试数据”“预测”],“位置”'东南'

图中包含4个轴。标题为“测试观察82”的轴1包含2个类型为line的对象。标题为“测试观察90”的轴2包含2个类型为line的对象。标题为测试观察13的轴3包含2个类型为line的对象。标题为测试观察89的轴4包含2个类型为line的对象。这些对象代表预测的测试数据。

对于给定的部分序列,预测的当前RUL是预测序列的最后一个元素。计算预测的根均方误差(RMSE),并在直方图中可视化预测误差。

Yvalidatelast =零(1,Numel(YValidate));ypredlast = zeros(1,numel(yvalidate));为了i = 1:numel(yvalidate)yvalidatelast(i)= yvalidate {i}(结束);ypredlast(i)= ypred {i}(结束);结尾图rmse = sqrt(mean((YPredLast - YValidateLast).^2))
RMSE = 19.0286.
直方图(ypredlast  -  yvalidatelast)标题(" RMSE = "+ RMSE)Ylabel(“频率”)包含(“错误”

图包含轴。具有标题RMSE = 19.0286的轴包含类型直方图的对象。

生成MEX功能Rulpredict.

为此产生MEX函数Rulpredict.入口点函数,创建代码生成配置对象CFG.用于MEX代码生成。创建一个深度学习配置对象,指定不需要目标库,并将此深度学习配置对象附加到该对象上CFG.

cfg = coder.config('mex');cfg.deeplearningconfig = coder.deeplearningconfig('targetlibrary''没有任何');

默认情况下,目标语言设置为C.如果要生成C ++代码,则将目标语言显式设置为C ++。

使用Coder.typeof.用于创建入口点函数的输入类型的功能Rulpredict.你用的- args.选项Codegen.命令。

的数据xvalidate.包含100个观察数据,其中每个观察数据为双数据类型,特征维值为17,序列长度可变。为了在一个函数调用中对几个这样的观测结果执行预测,可以将这些观测结果分组到一个单元数组中,并传递单元数组进行预测。单元格数组必须是列单元格数组,并且每个单元格必须包含一个观察结果。每个观测必须具有相同的特征维数,但序列长度可能会随情况而变化xvalidate..将序列长度指定为可变大小使我们能够对任意长度的输入序列执行预测。

matrixInput =编码器。类型of(0, [17 Inf],[false true]);单个观察的输入类型cellinput = coder.typeof({matrixInput},[100 1]);%输入类型用于多个观察

运行codegen命令。指定输入类型细胞

Codegen.-Config.CFG.Rulpredict.-  args.{cellinput}-报告
代码生成成功:要查看报告,打开('codegen/mex/rulPredict/html/report.mldatx')。

默认情况下,对于MEX代码生成,生成的代码调用到矩阵操作的Blas库中,并使用OpenMP库(如果编译器支持OpenMP),以便MEX中的循环中的任何并行能力可以在多个线程上运行,导致更好的执行性能。金宝app默认情况下,默认为独立代码生成启用OpenMP,您必须提供自定义Blas回调,以向Matlab Coder™指示您想要在提到的步骤后生成矩阵操作的BLAS调用矩阵操作通过使用BLAS调用加速生成的独立代码中的矩阵运算

在测试数据上运行生成的MEX功能

通过调用生成的MEX函数来对测试数据进行预测rulPredict_mex

ypredmex = rulpredict_mex(xvalidate);

您可以在绘图中可视化与之前相同的预测。

数字为了i = 1:numel(idx)子图(2,2,i)plot(yvalidate {idx(i)},' - ')举行绘图(ypredmex {idx(i)},'.-')举行离开ylim([0 175])标题(“测试观察”+ idx(i))xlabel(“时间步骤”) ylabel (“原则”结尾传奇([“测试数据”“预测MEX”],“位置”'东南'

图中包含4个轴。标题为“测试观察82”的轴1包含2个类型为line的对象。标题为“测试观察90”的轴2包含2个类型为line的对象。标题为测试观察13的轴3包含2个类型为line的对象。标题为测试观察89的轴4包含2个类型为line的对象。这些对象代表测试数据,预测的MEX。

计算预测的根均方误差(RMSE),并在直方图中可视化预测误差。

ypredlastmex = zeros(1,numel(yvalidate));为了i = 1:numel(YValidate) YPredLastMex(i) = YPredMex{i}(end);结尾图Rmse = sqrt(均值((ypredlastmex  -  yvalidateLast)。^ 2))
RMSE = 19.0286.
直方图(Ypredlastmex  -  Yvalidatelast)标题(" RMSE = "+ RMSE)Ylabel(“频率”)包含(“错误”

图包含轴。具有标题RMSE = 19.0286的轴包含类型直方图的对象。

使用有状态LSTM生成MEX函数

而不是通过整个次数来预测一步,而是可以通过使用一次一步一步进行预测predictandanddatestate.(深度学习工具箱).当您具有到达流的时间步骤的值时,这很有用。这predictandanddatestate.函数接收一个输入,产生一个输出预测,并更新网络的内部状态,以便将来的预测将这个初始输入考虑在内。通常,对完整序列进行预测比一次预测一个时间步骤要快得多。

入口点函数rulpredictanddate.采用单倍时间的输入并使用该输入处理输入predictandanddatestate.功能。predictandanddatestate.输出对输入时间的预测,并更新网络,以便后续输入被视为同一样本的后续时间。在一次一次传递一次的时间后,产生的输出与所有TimeSteps作为单个输入传递相同。

类型rulPredictAndUpdate.m
function out = rulPredictAndUpdate(in) %#codegen % Copyright 2020 The MathWorks, Inc. persistent mynet;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('rulNetwork.mat');end % pass in input to predictAndUpdateState method [mynet, out] = predictAndUpdateState(mynet, in);

在此新的入口点函数上运行Codegen。自从我们每次呼叫中进行一次时间,我们指定矩阵扣上具有1的固定序列尺寸,而不是可变序列长度。

matrixInput = Coder.typeof(Double(0),[17 1]);Codegen.-Config.CFG.rulpredictanddate.-  args.{matrixInput}-报告
代码生成成功:要查看报告,打开('codegen/mex/rulPredictAndUpdate/html/report.mldatx')。

对测试数据进行预测,调用rulpredictanddate.Matlab的功能D.生成MEX功能Rulpredictanddate_mex.

ypredstatefulmex = cell(numel(idx),1);为了iSample = 1:numel(idx) sample = XValidate{idx(iSample)};numTimeStepsTest = size(sample, 2);为了isstep = 1:numTimeStepsTest YPredStatefulMex{iSample}(1, iStep) = rulPredictAndUpdate_mex(sample(:, iStep));结尾结尾

再次您可以在绘图中以前可视化状态MEX的预测。

数字为了i = 1:numel(idx)子图(2,2,i)plot(yvalidate {idx(i)},' - ')举行绘图(YpredStatefulmex {i},'.-')举行离开ylim([0 175])标题(“测试观察”+ idx(i))xlabel(“时间步骤”) ylabel (“原则”结尾传奇([“测试数据”“预测MEX有状态LSTM”],“位置”'东南'

图中包含4个轴。标题为“测试观察82”的轴1包含2个类型为line的对象。标题为“测试观察90”的轴2包含2个类型为line的对象。标题为测试观察13的轴3包含2个类型为line的对象。标题为测试观察89的轴4包含2个类型为line的对象。这些对象表示测试数据、预测MEX有状态LSTM。

最后,您还可以在任何特定样本中与Matlab预测一起可视化两个不同MEX功能的结果。

图()sampleIdx = Idx(1);plot(yvalidate {sampleIdx},' - ')举行plot(ypred {sampledx},'O-')绘图(ypredmex {sampleIdx},'^  - ')绘图(ypredstatefulmex {1},'X-')举行离开ylim([0 175])标题(“测试观察”+ idx(i))xlabel(“时间步骤”) ylabel (“原则”)传说([“测试数据”“在Matlab预测”“预测MEX”“预测MEX有状态LSTM”],“位置”'东南'

图包含轴。具有标题测试观察89的轴包含4个类型的线。这些对象代表了在Matlab,预测的MEX中预测的测试数据,预测MEX预测MEX,具有有状态LSTM。

参考文献

  1. Saxena,Abhinav,Kai Goebel,Don Simon和Neil Eklund。“飞机发动机碰到故障模拟的损伤传播建模。”在预测和健康管理,2008年。2008年PHM。国际会议,pp。1-9。IEEE,2008。

也可以看看

||

相关的话题