主要内容

生成通用的C / c++代码Sequence-to-Sequence回归使用深度学习

这个案例展示了如何生成普通的C / c++代码,不依赖于任何第三方深度学习库很长一段短期记忆(LSTM)网络。你生成一个墨西哥人函数接受时间序列数据代表各种传感器在一个引擎。墨西哥人函数然后让每一步预测输入的timeseries预测剩余寿命(原则)的引擎以周期。

下面的例子使用了涡扇发动机退化模拟数据集[1]中描述和pretrained LSTM网络来预测剩余使用寿命的引擎。网络训练模拟的时间序列数据为100系列发动机和相应的剩余使用寿命值在每个序列。每个在这训练数据序列都有不同的长度和对应于一个完整的运行失败(RTF)实例。训练网络的更多信息,请参阅示例使用深度学习Sequence-to-Sequence回归

定义入口点函数rulPredict

rulPredict入口点函数接受一个输入序列并将其传递到一个训练有素的sequence-to-sequence LSTM网络预测。加载的网络对象的函数rulNetwork.mat文件到一个持久变量和重用后续预测的持久对象调用。LSTM网络使得预测部分序列一个时间步。在每个时间步,此时使用价值的网络预测步骤,和上一次的网络状态计算步骤。每个预测之间的网络更新其状态。的预测函数返回一个序列的预测。预测的最后一个元素对应于局部序列的预测原则。

显示一个交互式可视化的网络体系结构和网络层的信息,使用analyzeNetwork函数。

类型rulPredict.m
函数= rulPredict () % # codegen %版权2020年MathWorks公司持久mynet;如果isempty (mynet) mynet = coder.loadDeepLearningNetwork (“rulNetwork.mat”);结束在输入预测方法% %通过防止函数添加填充数据,指定mini-batch大小1。出=预测(mynet, MiniBatchSize, 1);

下载和准备测试数据

本节总结的步骤下载这个示例使用和准备测试数据。更多信息在涡扇发动机退化模拟数据集和预处理步骤,看到的例子使用深度学习Sequence-to-Sequence回归

下载数据集

创建一个目录来存储涡扇发动机退化模拟数据集。

dataFolder = fullfile (tempdir,“涡扇”);如果~存在(dataFolder“dir”mkdir (dataFolder);结束

下载并提取涡扇发动机退化模拟数据集。

文件名= matlab.internal.examples.downloadSuppor金宝apptFile (“nnet”,“数据/ TurbofanEngineDegradationSimulationData.zip”);解压缩(文件名,dataFolder)

计算训练数据的平均值和标准偏差

在以下步骤中,您标准化测试预测使用训练数据的平均值和标准偏差。所以,你必须首先使用训练数据来计算这些归一化参数。

加载训练数据,每一列是一个观察,每一行是一个特性。删除常量值的特性。

filenamePredictors = fullfile (dataFolder,“Train_FD001.txt”);[XTrain] = processTurboFanDataTrain (filenamePredictors);m = min ([XTrain {:}], [], 2);M = max ([XTrain {:}], [], 2);idxConstant = M = = M;i = 1:元素个数(XTrain) XTrain{我}(idxConstant:) = [];结束

对所有观察计算平均值和标准偏差。

μ=意味着([XTrain {:}), 2);sig =性病([XTrain {}):, 0, 2);

准备测试数据

准备测试数据使用函数processTurboFanDataTest这个例子。这个函数processTurboFanDataTest提取的数据filenamePredictorsfilenameResponses细胞并返回数组XValidateYValidate包含测试预测和响应序列,分别。

filenamePredictors = fullfile (dataFolder,“test_FD001.txt”);filenameResponses = fullfile (dataFolder,“RUL_FD001.txt”);[XValidate, YValidate] = processTurboFanDataTest (filenamePredictors filenameResponses);

删除与常量值使用特性idxConstant从训练数据计算。标准化测试使用参数预测μ团体从训练数据计算。夹测试响应阈值150。使用同样的限幅阈值在训练数据训练网络。

用力推= 150;i = 1:元素个数(XValidate) XValidate{我}(idxConstant:) = [];XValidate{我}= (XValidate{我}-μ)。/团体;我YValidate {} (YValidate{我}>刺)=刺;结束

运行rulPredict在测试数据

的变量XValidate包含传感器读数的示例timeseries数据用于测试在MATLAB的入口点函数。在测试数据通过调用作出预测rulPredict方法。

YPred = rulPredict (XValidate);

可视化的一些预测在一个阴谋。

idx = randperm(元素个数(YPred), 4);图i = 1:元素个数(idx)次要情节(2,2,我)情节(YValidate {idx (i)},“——”)举行情节(YPred {idx (i)},“。”)举行ylim(175[0])标题(“测试观察”+ idx (i))包含(“时间步”)ylabel (“原则”)结束传奇([“测试数据”“预测”),“位置”,“东南”)

图包含4轴对象。坐标轴对象与标题测试观察82包含2线类型的对象。坐标轴对象与标题测试观察90包含2线类型的对象。坐标轴对象3标题测试观察13包含2线类型的对象。坐标轴对象4标题测试观察89包含2线类型的对象。这些对象代表测试数据,预测。

对于一个给定的部分序列,预测当前荷重软化是预测的最后一个元素序列。计算均方根误差(RMSE)的预测和可视化预测误差在一个柱状图。

YValidateLast = 0(1,元素个数(YValidate));YPredLast = 0(1,元素个数(YValidate));i = 1:元素个数(YValidate) YValidateLast (i) = YValidate{我}(结束);YPredLast (i) = YPred{我}(结束);结束图rmse =√意味着(YPredLast - YValidateLast) ^ 2))
rmse = 19.0286
直方图(YPredLast - YValidateLast)标题(" RMSE = "+ rmse) ylabel (“频率”)包含(“错误”)

图包含一个坐标轴对象。坐标轴对象与标题RMSE = 19.0286包含一个直方图类型的对象。

生成墨西哥人函数rulPredict

生成一个墨西哥人的功能rulPredict入口点函数,创建一个代码生成配置对象cfg对墨西哥人代码生成。创建一个指定的深度学习配置对象不需要目标库和附加这个深度学习配置对象cfg

cfg = coder.config (墨西哥人的);cfg。DeepLearningConfig = coder.DeepLearningConfig (“TargetLibrary”,“没有”);

默认情况下,目标语言设置为C。如果你想生成c++代码,显式地设置目标语言c++。

使用coder.typeof函数创建的入口点函数的输入类型rulPredict你使用arg游戏选项codegen命令。

的数据XValidate包含100个观察每一个观察是双重功能维度值的数据类型的17岁,一个变量序列长度。为了执行预测在一个函数调用几个这样的观察,你可以观察分组单元阵列,通过预测单元阵列。单元阵列必须列单元阵列,每个细胞必须包含一个观察。每个维度观察必须具有相同的特性,但序列长度都有可能不同的XValidate。指定的序列长度适应使我们能够对输入序列进行预测的任何长度。

matrixInput =编码器。类型of(0, [17 Inf],[false true]);%为单个观察输入类型cellInput =编码器。类型of({matrixInput}, [100 1]);%为多个观测输入类型

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

codegen配置cfgrulPredictarg游戏{cellInput}报告
代码生成成功:查看报告

墨西哥人代码生成默认情况下,生成的代码调用转化为矩阵运算,并使用OpenMP布拉斯特区图书馆图书馆(如果编译器支持OpenMP),这样循环的任何可平行的墨西哥人可以运行在多个线程导致更好的执行性能。金宝app而OpenMP是默认启用独立的代码生成,您必须提供一个定制的布拉斯特区回调表明MATLAB编码器™bla呼吁要生成矩阵运算中提到的步骤加快矩阵运算生成独立的代码通过使用布拉斯特区调用(MATLAB编码器)

墨西哥人函数生成测试数据上运行

作出预测的测试数据通过调用生成的墨西哥人的功能rulPredict_mex

YPredMex = rulPredict_mex (XValidate);

你可以想象一个阴谋的预测和以前一样。

i = 1:元素个数(idx)次要情节(2,2,我)情节(YValidate {idx (i)},“——”)举行情节(YPredMex {idx (i)},“。”)举行ylim(175[0])标题(“测试观察”+ idx (i))包含(“时间步”)ylabel (“原则”)结束传奇([“测试数据”“预测墨西哥人”),“位置”,“东南”)

图包含4轴对象。坐标轴对象与标题测试观察82包含2线类型的对象。坐标轴对象与标题测试观察90包含2线类型的对象。坐标轴对象3标题测试观察13包含2线类型的对象。坐标轴对象4标题测试观察89包含2线类型的对象。这些对象代表测试数据,预测墨西哥人。

计算均方根误差(RMSE)的预测和可视化预测误差在一个柱状图。

YPredLastMex = 0(1,元素个数(YValidate));i = 1:元素个数(YValidate) YPredLastMex (i) = YPredMex{我}(结束);结束图rmse =√意味着(YPredLastMex - YValidateLast) ^ 2))
rmse = 19.0286
直方图(YPredLastMex - YValidateLast)标题(" RMSE = "+ rmse) ylabel (“频率”)包含(“错误”)

图包含一个坐标轴对象。坐标轴对象与标题RMSE = 19.0286包含一个直方图类型的对象。

生成与状态LSTM墨西哥人功能

而不是通过整个timeseries预测在一个步骤,你可以预测一个时间步使用predictAndUpdateState。这是有用的,当你有时间的值到达流的步骤。的predictAndUpdateState函数的输入,产生一个输出预测和更新网络的内部状态,以便未来预测考虑初始输入。通常是更快的做出预测全序列相比,预测一个时间步。

的入口点函数rulPredictAndUpdate以在single-timestep输入和过程输入使用predictAndUpdateState函数。predictAndUpdateState输出对输入的步伐的预测和更新网络,以便后续的输入被视为后续相同样品的步伐。经过所有的步伐一次,由此产生的输出是一样的,如果步伐都是作为一个输入传递。

类型rulPredictAndUpdate.m
函数= rulPredictAndUpdate () % # codegen %版权2020年MathWorks公司持久mynet;如果isempty (mynet) mynet = coder.loadDeepLearningNetwork (“rulNetwork.mat”);结束%通过输入predictAndUpdateState方法[mynet,] = predictAndUpdateState (mynet,);

上运行codegen这个新的入口点函数。因为我们正在一个步伐每个调用,我们指定matrixInput有一个固定的序列维度1而不是一个变量序列长度。

matrixInput = coder.typeof(双(0),[1]17日);codegen配置cfgrulPredictAndUpdatearg游戏{matrixInput}报告
代码生成成功:查看报告

在测试数据通过调用作出预测rulPredictAndUpdate在MATLAB函数d的墨西哥人函数生成rulPredictAndUpdate_mex

YPredStatefulMex =细胞(元素个数(idx), 1);iSample = 1:元素个数(idx)示例= XValidate {idx (iSample)};numTimeStepsTest =大小(样品,2);iStep = 1: numTimeStepsTest YPredStatefulMex {iSample} (1, iStep) = rulPredictAndUpdate_mex(样本(:,iStep));结束结束

再一次你可以想象预测状态之前的墨西哥人的阴谋。

i = 1:元素个数(idx)次要情节(2,2,我)情节(YValidate {idx (i)},“——”)举行情节(YPredStatefulMex {},“。”)举行ylim(175[0])标题(“测试观察”+ idx (i))包含(“时间步”)ylabel (“原则”)结束传奇([“测试数据”“墨西哥人状态LSTM预测”),“位置”,“东南”)

图包含4轴对象。坐标轴对象与标题测试观察82包含2线类型的对象。坐标轴对象与标题测试观察90包含2线类型的对象。坐标轴对象3标题测试观察13包含2线类型的对象。坐标轴对象4标题测试观察89包含2线类型的对象。这些对象代表测试数据,预测墨西哥人有状态LSTM。

最后你也可以想象结果为两个不同的墨西哥人以及MATLAB函数预测在任何特定样本的阴谋。

图()sampleIdx = idx (1);情节(YValidate {sampleIdx},“——”)举行情节(YPred {sampleIdx},“啊——”)情节(YPredMex {sampleIdx},' ^ - ')情节(YPredStatefulMex {1},“x -”)举行ylim(175[0])标题(“测试观察”+ idx (i))包含(“时间步”)ylabel (“原则”)传说([“测试数据”“在MATLAB预测”“预测墨西哥人”“与有状态LSTM预测墨西哥人”),“位置”,“东南”)

图包含一个坐标轴对象。坐标轴对象标题测试观察89包含4线类型的对象。这些对象代表测试数据,在MATLAB预测,预测墨西哥人,预测和状态LSTM墨西哥人。

引用

  1. Saxena,阿凯Goebel唐西门,和尼尔·埃克伦。“损害传播为航空发动机建模run-to-failure模拟。”In预测和健康管理,2008年。2008年榜单。国际会议上1 - 9页。IEEE 2008。

另请参阅

(MATLAB编码器)|(MATLAB编码器)|(MATLAB编码器)

相关的话题