主要内容

树莓派上LSTM网络的代码生成

这个示例展示了如何为使用ARM®计算库的预训练长短期记忆(LSTM)网络生成代码,并将代码部署到树莓派™目标上。在本例中,LSTM网络预测机器的剩余使用寿命(RUL)。该网络将表示引擎中各种传感器的时间序列数据集作为输入。网络返回引擎的剩余使用寿命,以周期为单位,作为输出。

本例使用[1]中描述的涡扇发动机退化模拟数据集。该数据集包含100个训练观测值和100个测试观测值。训练数据包含100台发动机的模拟时间序列数据。每个序列有17个特征,长度不同,对应于一个完整的运行到故障(RTF)实例。测试数据包含100个部分序列,以及每个序列末尾对应的剩余使用寿命值。

本例使用预训练的LSTM网络。有关如何训练LSTM网络的更多信息,请参见示例使用深度学习的序列分类

本例演示了使用LSTM网络执行预测的两种不同方法:

  • 第一种方法使用标准的LSTM网络,并在一组时间序列数据上运行推理。

  • 第二种方法利用相同LSTM网络的有状态行为。在这种方法中,每次传递数据的单个时间步长,并让网络在每个时间步长更新其状态。

本例使用基于PIL的工作流生成一个MEX函数,该函数依次调用MATLAB中在目标硬件中生成的可执行文件。

注:

  • 本例中的代码行被注释掉了。在运行示例之前取消注释。

  • 本例使用的ARM Compute库版本可能不是代码生成支持的最新版本。金宝app有关编译器和库的受支持版本的信息,请参见金宝app第三方软硬件(MATLAB编码器)

  • 此示例在MATLAB Online中不支金宝app持。

先决条件

  • MATLAB®编码器™

  • 嵌入式编码器®

  • 深度学习工具箱™

  • 深度学习库的MATLAB编码器接口。要安装此支持包,请使用金宝app扩展浏览器

  • 树莓派硬件的M金宝appATLAB支持包。要安装此支持包,请使用金宝app扩展浏览器

  • 树莓派硬件

  • ARM计算库(在目标ARM硬件上)

  • 编译器和库的环境变量。有关设置环境变量,请参见环境变量(MATLAB编码器)

为静态库设置代码生成配置对象

要为指定的入口点函数生成PIL MEX函数,请为静态库创建代码配置对象,并将验证模式设置为'PIL'。将目标语言设置为c++。

% CFG =编码器。Config ('lib', 'ecoder', true);% cfg。VerificationMode = 'PIL';% cfg。TargetLang = ' c++ ';

设置深度学习代码生成配置对象

创建一个编码器。ARMNEONConfig对象。指定计算库版本和arm架构。在这个例子中,假设树莓派硬件中的ARM计算库是19.05版本。

% dlcfg = code . deeplearningconfig ('arm-compute');% dlcfg。ArmComputeVersion = '19.05';% dlcfg。ArmArchitecture = 'armv7';

设置DeepLearningConfig将代码生成配置对象配置为深度学习配置对象。

% cfg。DeepLearningConfig = dlcfg;

创建到树莓派的连接

使用MATLAB支持包实现树莓金宝app派支持包功能,raspi来创建与树莓派的连接。在下面的代码中,替换:

  • raspiname树莓派的名字

  • 用户名用你的用户名

  • 密码用你的密码

% r = raspi('raspiname','username','password');

配置树莓派的代码生成硬件参数

创建一个编码器。硬件对象,并将其附加到代码生成配置对象。

% hw =编码器。硬件(覆盆子π);% cfg。硬件= hw;

第一种方法:为LSTM网络生成PIL MEX函数

在这种方法中,您为入口点函数生成代码rul_lstmnet_predict

rul_lstmnet_predict.m入口点函数将整个时间序列数据集作为输入,传递给网络进行预测。具体来说,该函数使用示例中训练的LSTM网络使用深度学习的序列分类.方法加载网络对象rul_lstmnet.mat文件转换为持久变量,并在后续的预测调用中重用此持久对象。序列到序列的LSTM网络使您能够对数据序列的每个单独时间步做出不同的预测。

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

类型(“rul_lstmnet_predict.m”
版权所有2019 The MathWorks, Inc. persistent mynet;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('rul_lstmnet.mat');End out = mynet.predict(in);

方法生成代码codegen(MATLAB编码器)命令,使用coder.typeof(MATLAB编码器)函数指定入口点函数的输入参数的类型和大小。在本例中,输入是双数据类型,特征维值为17,序列长度可变。将序列长度指定为可变大小,以对任何长度的输入序列执行预测。

% matrixInput = code .typeof(double(0),[17 Inf],[false true]);

运行codegen命令生成基于PIL的mex函数rul_lstmnet_predict_pil在主机平台上。

% codegen -config cfg rul_lstmnet_predict -args {matrixInput} -report

在测试数据上运行生成的PIL MEX函数

加载mat文件RULTestData.这个mat文件存储变量XTest而且欧美其中包含传感器读数的示例时间序列,您可以在其上测试生成的代码。该测试数据取自示例使用深度学习的序列分类经过数据预处理。

负载RULTestData

XTest变量包含100个输入观测值。每个观测值具有17个不同序列长度的特征。

XTest (1:5)
ans =5×1单元格数组{17×31 double} {17×49 double} {17×126 double} {17×106 double} {17×98 double}

欧美变量包含100个输出观察值XTest输入变量。对于整个序列中的每个时间步数据,每个输出观测值都是一个剩余有用寿命(RUI)值,以周期为单位测量。

欧美(1:5)
ans =5×1单元格数组{(142 141 140 139 138 137 136 135 134 133 132 131 130 129 128 127 126 125 124 123 122 121 120 119 118 117 116 115 114 113 112]} {(146 145 144 143 142 141 140 139 138 137 136 135 134 133 132 131 130 129 128 127 126 125 124 123 122 121 120 119 118 117 116 115 114 113 112 111 110 109 108 107 106 105 104 103 102 101 100 99 98]} {[150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150150 150 150 149 148 147 146 145 144 143 142 141 140 139 138 137 136 135 134 133 132 131 130 129 128 127 126 125 124 123 122 121 120 119 118 117 116 115 114 113 112 111 110 109 108 107 106 105 104 103 102 101 100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69]} {(150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 149 148 147 146 145 144 143 142 141140 139 138 137 136 135 134 133 132 131 130 129 128 127 126 125 124 123 122 121 120 119 118 117 116 115 114 113 112 111 110 109 108 107 106 105 104 103 102 101 100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82]} {[150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 149 148 147 146 145 144 143 142 141 140 139 138 137 136 135 134 133 132 131 130 129 128 127 126 125 124 123 122 121 120119 118 117 116 115 114 113 112 111 110 109 108 107 106 105 104 103 102 101 100 99 98 97 96 95 94 93 92 91]}

运行生成的MEX函数rul_lstmnet_predict_pil在随机测试数据集上。

% idx = randperm(数字(XTest), 1);% inputData = XTest{idx};% YPred1 = rul_lstmnet_predict_pil(inputData);

比较预测和测试数据

使用图表将MEX输出数据与测试数据进行比较。

% figure('Name', 'Standard LSTM', 'NumberTitle', 'off');%的阴谋(欧美{idx},“—”)%坚持%的阴谋(YPred1“。”)%延迟% ylim([0 175])% title("试验观察" + idx)% xlabel("时间步长")% ylabel(“以周期为单位测量的RUL”)

明确公益诉讼

% clear rul_lstmnet_predict_pil;

第二种方法:为有状态LSTM网络生成PIL MEX函数

而不是一次性将整个时间序列数据传递给预测,可以通过按段流式处理输入数据来运行预测predictAndUpdateState函数。

入口函数rul_lstmnet_predict_and_update.m方法接受单时间步输入并对其进行处理predictAndUpdateState函数。predictAndUpdateState返回对输入时间步长的预测并更新网络,以便输入的后续部分被视为同一样本的后续时间步。

类型(“rul_lstmnet_predict_and_update.m”
版权所有2019 The MathWorks, Inc. persistent mynet;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('rul_lstmnet.mat');end [mynet, out] = predictAndUpdateState(mynet, in);结束

类的输入类型codegen命令。因为rul_lstmnet_predict_and_update在每次调用中接受单个时间步数据,指定输入类型matrixInput固定的序列长度为1,而不是可变的序列长度。

% matrixInput = code .typeof(double(0),[17 1]);

运行codegen命令生成基于PIL的mex函数rul_lstmnet_predict_and_update_pil在主机平台上。

% codegen -config cfg rul_lstmnet_predict_and_update -args {matrixInput} -report

在测试数据上运行生成的PIL MEX函数

%分别运行生成的MEX函数(|rul_lstmnet_predict_and_update_pil|)inputData序列中的%时间步长数据。% sequenceLength = size(inputData,2);% YPred2 = 0 (1, sequenclength);% for i=1: sequenclength% inTimeStep = inputData(:,i);% YPred2(:, i) = rul_lstmnet_predict_and_update_pil(inTimeStep);%结束

将所有时间步骤一次一个地传递到rul_lstmnet_predict_and_update函数,则结果输出与第一个方法中的输出相同,在该方法中一次性传递所有输入。

比较预测和测试数据

使用图表将MEX输出数据与测试数据进行比较。

% figure('Name', ' state - full LSTM', 'NumberTitle', 'off');%的阴谋(欧美{idx},“—”)%坚持%的阴谋(YPred2“。”)%延迟% ylim([0 175])% title("试验观察" + idx)% xlabel("时间步长")% ylabel(“以周期为单位测量的RUL”)

明确公益诉讼

% clear rul_lstmnet_predict_and_update_pil;

参考文献

Saxena, Abhinav, Kai Goebel, Don Simon和Neil Eklund。飞机发动机运行故障模拟的损伤传播模型。《预测与健康管理》,2008年。2008年榜单。国际会议,第1-9页。IEEE 2008。

另请参阅

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

相关的话题