基于卷积神经网络的航空发动机剩余寿命预测Matlab实现

本文利用NASA提供的涡扇发动机退化数据集,进行数据预处理,构建训练样本和测试样本,然后搭建卷积神经网络(Convolutional Neural Network,CNN),学习训练数据,最后利用测试数据,分析神经网络模型预测剩余使用寿命(Remaining useful life,RUL)的效果。

1.卷积神经网络

卷积神经网络(Convolutional Neural Networks,CNNs)是一种深度学习模型,它在图像处理、语音识别、自然语言处理等多个领域都有着广泛的应用。

CNNs的设计灵感来源于人类视觉系统的工作原理,它特别适合处理具有网格状拓扑结构的数据,比如图像,著名的卷积神经网络模型有AlexNet、InceptionNet、VGGNet和ResNet等。

值得注意是,上述的这些卷积神经网络是对图片进行卷积操作,它会利用当前位置的前后四周的数据。而在本文案例中,在进行卷积操作时,处理的对象是时间序列,如果还按照上述的卷积方式,会将未来数据带入计算,这是矛盾的,因此需要改变卷积网络的参数。

图片

该数据集为C-MAPSS模拟数据,该数据是模拟大型商用涡扇发动机的数据, 发动机简图如上图所示。该数据的代码采用了MATLAB及其Simulink模块。

2.方法具体流程

2.1 数据预处理

读取航空发动机的退化数据集,并开展数据预处理操作,整理训练样本和测试样本。

clc
close all
clear all%数据变量的维度的含义
% data文件夹现在包含包含26列数字的文本文件,用空格分隔。
% 每一行都是在单个操作周期中获取的数据,每列表示不同的变量:
% 列 1 —  发动机单元编号
% 列 2 —  时间步
% 列 3–5 —  运行设置
% 列 6–26 —   传感器1–21
% 数据介绍页面(数据集A) https://mp.weixin.qq.com/s/RPToBmMvt5EJth42eXL2JA   %% 数据预处理
dataFolder = "D:\我的文档\硕士\信息\副业\公众号\公众号" + ..."\20240518基于卷积神经网络的航空发动机剩余寿命预测方法\" + ..."20240518基于卷积神经网络的航空发动机剩余寿命预测方法\data";
filenameTrainPredictors = fullfile(dataFolder,"train_FD001.txt");
rawTrain = localLoadData(filenameTrainPredictors);  %训练样本 Table类型数据head(rawTrain.X{1},8)   %展示部分数据的输入rawTrain.Y{1}(1:8)    %展示部分数据的输出(RUL标签)stackedplot(rawTrain.X{1},[3,5,6,7,8,15,16,24],XVariable='timeStamp')  %展示部分数据在单个样本周期的趋势prog = prognosability(rawTrain.X,"timeStamp");% 判断单个样本全寿命周期中不随时间周期变换的特征,即无用的输入idxToRemove = prog.Variables==0 | isnan(prog.Variables);   %无用的输入的索引
featToRetain = prog.Properties.VariableNames(~idxToRemove);
for i = 1:height(rawTrain)rawTrain.X{i} = rawTrain.X{i}{:,featToRetain};         %有用的输入
end[~,Xmu,Xsigma] = zscore(vertcat(rawTrain.X{:}));         %归一化输入,准备进行Z标准化,
preTrain = table();
for i = 1:numel(rawTrain.X)                              %Z标准化preTrain.X{i} = (rawTrain.X{i} - Xmu) ./ Xsigma;
endrulThreshold = 150;                                      %设置最大的RUL标签为150,过大的RUL没有指导意义,合适的RUL也有利于网络训练的收敛
for i = 1:numel(rawTrain.Y)                              %输出标签预处理preTrain.Y{i} = min(rawTrain.Y{i},rulThreshold);
endfor i = 1:size(preTrain,1)preTrain.X{i} = preTrain.X{i}';    %这是第一个维度为输入数据的特征维度preTrain.Y{i} = preTrain.Y{i}';    %输出也需要sequence = preTrain.X{i};sequenceLengths(i) = size(sequence,2); 
end[sequenceLengths,idx] = sort(sequenceLengths,'descend');   %按照样本的时间长短进行排序,对网络训练有用
%  在后续trainingOptions中,每次epoch都不打乱样本的顺序(Shuffle='never'),这是排序是因为每次训练都是一个batch,
% 由于长度不同往往需要一个统一的长度,才能一同送入网络中,当根据样本长度差异较大,需要补0操作,占据存储空间且不利于网络的学习真正有用的特征
% 当排序后,需要补充的0少,所以相对于不排序是具有优势的
XTrain = preTrain.X(idx);
YTrain = preTrain.Y(idx); 

这展示了部分数据的输入和输出,上图为部分数据的部分输入。从图中能发现,一些变量在全寿命周期没有变换,因此剔除与不随时间变换的无用特征。因为随着时间的增长RUL是单调递减的,这些特征不发生变化,那么它们对预测RUL是没有意义的,所以需要剔除掉。

除此之外,进行了Z标准化,RUL的标签进行了规整,限制输出的RUL标签最大为150,这有利于网络的收敛,可根据具体实际进行调制,过大的RUL对工程指导意义不大(个人观点)。

对数据进行了排序,这样对网络的收敛是有利的。不进行排序,同时训练参数的shuffle改为every-epoch,会发现网络很难收敛。最终的训练集输入和输出分别保存在变量XTrain和YTrain。

2.2 搭建网络模型

搭建卷积神经网络模型,并利用训练数据训练神经网络模型。 

%% 构建神经网络
numFeatures = size(XTrain{1},1);   %输入特征的个数,numResponses = 1;
%神经网络结构
layers = [                              sequenceInputLayer(numFeatures)convolution1dLayer(5,32,Padding="causal")  %这里采用了因果填充的方式,确保模型的输出不会违反时间上的因果关系,参考时间卷积神经网络中的因果卷积batchNormalizationLayer()reluLayer()convolution1dLayer(7,64,Padding="causal")batchNormalizationLayerreluLayer()convolution1dLayer(11,128,Padding="causal")batchNormalizationLayerreluLayer()convolution1dLayer(13,256,Padding="causal")batchNormalizationLayerreluLayer()convolution1dLayer(15,512,Padding="causal")batchNormalizationLayerreluLayer()fullyConnectedLayer(100)reluLayer()dropoutLayer(0.5)fullyConnectedLayer(numResponses)regressionLayer()];maxEpochs = 40; %最大Epoch数
miniBatchSize = 16;  %最小batchsizeoptions = trainingOptions('adam',...LearnRateSchedule='piecewise',...MaxEpochs=maxEpochs,...MiniBatchSize=miniBatchSize,...InitialLearnRate=0.01,...GradientThreshold=1,...Shuffle='never',...Plots='training-progress',...Verbose=0);net = trainNetwork(XTrain,YTrain,layers,options);  %训练神经网络模型
%网络结构展示
figure;
lgraph = layerGraph(net.Layers);
plot(lgraph)

卷积神经网络的训练过程: 

图片

从上图结果看,RSME有待进一步提高。多次运行代码,网络收敛的曲线较为接近,无明显差异。修改学习率、Epoch、batchsize大小,结果无明显变化,可能需要进一步进行网络结构的优化,增加新的输入层,提出更好的网络模型。

2.3 剩余寿命预测

采用已训练的神经网络模型,预测测试样本的剩余使用寿命,并采用RMSE评估网络的预测效果。

值得注意是,这个代码里面有两个函数:localLoadData(加载数据用的,同时制作RUL标签)和localLambdaPlot(画图函数)。

%% 测试模型
filenameTestPredictors = fullfile(dataFolder,'test_FD001.txt');
filenameTestResponses = fullfile(dataFolder,'RUL_FD001.txt');
dataTest = localLoadData(filenameTestPredictors,filenameTestResponses);
%测试数据进行Z标准化
for i = 1:numel(dataTest.X)dataTest.X{i} = dataTest.X{i}{:,featToRetain};dataTest.X{i} = (dataTest.X{i} - Xmu) ./ Xsigma;dataTest.Y{i} = min(dataTest.Y{i},rulThreshold);
endpredictions = table(Size=[height(dataTest) 2],VariableTypes=["cell","cell"],VariableNames=["Y","YPred"]);
%预测
for i=1:height(dataTest)unit = dataTest.X{i}';   predictions.Y{i} = dataTest.Y{i}';predictions.YPred{i} = predict(net,unit,MiniBatchSize=1);
end%计算RMSE 评估网络
for i = 1:size(predictions,1)predictions.RMSE(i) = sqrt(mean((predictions.Y{i} - predictions.YPred{i}).^2));
end
%RMSE直方图
figure;
histogram(predictions.RMSE,NumBins=10);
title("RMSE ( Mean: " + round(mean(predictions.RMSE),2) + " , StDev: " + round(std(predictions.RMSE),2) + " )");
ylabel('Frequency');
xlabel('RMSE');
%% 展示预测曲线
figure;
localLambdaPlot(predictions,"random");
figure;
localLambdaPlot(predictions,"best");
figure;
localLambdaPlot(predictions,"worst");
figure;
localLambdaPlot(predictions,"average");%% 加载数据的函数
function data = localLoadData(filenamePredictors,varargin)if isempty(varargin)filenameResponses = [];
elsefilenameResponses = varargin{:};
endrawData = readtable(filenamePredictors);
% 输入数据的名称
VarNames = {...'id', 'timeStamp', 'op_setting_1', 'op_setting_2', 'op_setting_3', ...'sensor_1', 'sensor_2', 'sensor_3', 'sensor_4', 'sensor_5', ...'sensor_6', 'sensor_7', 'sensor_8', 'sensor_9', 'sensor_10', ...'sensor_11', 'sensor_12', 'sensor_13', 'sensor_14', 'sensor_15', ...'sensor_16', 'sensor_17', 'sensor_18', 'sensor_19', 'sensor_20', ...'sensor_21'};
rawData.Properties.VariableNames = VarNames;if ~isempty(filenameResponses)RULTest = readmatrix(filenameResponses);
endIDs = rawData{:,1};
nID = unique(IDs);
numObservations = numel(nID);% 初始化
data = table(Size=[numObservations 2],...VariableTypes={'cell','cell'},...VariableNames={'X','Y'});for i=1:numObservationsidx = IDs == nID(i);data.X{i} = rawData(idx,:);if isempty(filenameResponses)% 计算RULdata.Y{i} = flipud(rawData.timeStamp(idx))-1;elsesequenceLength = sum(idx);endRUL = RULTest(i);data.Y{i} = [endRUL+sequenceLength-1:-1:endRUL]'; end
end
end%%
function localLambdaPlot(predictions,lambdaCase)if isnumeric(lambdaCase)idx = lambdaCase;
elseswitch lambdaCase   %展示结果case {"Random","random","r"}idx = randperm(height(predictions),1);case {"Best","best","b"}idx = find(predictions.RMSE == min(predictions.RMSE)); case {"Worst","worst","w"}idx = find(predictions.RMSE == max(predictions.RMSE)); case {"Average","average","a"}err = abs(predictions.RMSE-mean(predictions.RMSE));idx = find(err==min(err),1);end
end
y = predictions.Y{idx};
yPred = predictions.YPred{idx};
x = 0:numel(y)-1;
plot(x,y,x,yPred)
legend("True RUL","Predicted RUL")
xlabel("Time stamp (Test data sequence)")
ylabel("RUL (Cycles)")title("RUL for Test engine #"+idx+ " ("+lambdaCase+" case)")
end

 上图为测试样本的RMSE偏差分布的直方图,从图中能发现测试样本的RMSE偏差集中在10-15之间,有待进一步优化和提高。

下图为部分样本的RUL预测结果,分别对应了随机选择样本的RUL预测结果、RMSE偏差最小样本的RUL预测结果、RMSE偏差最大样本的预测结果和RMSE偏差适中样本的预测结果。

 随机选择样本的RUL预测结果

 RMSE偏差最小样本的RUL预测结果

图片

RMSE偏差最大样本的预测结果

图片

RMSE偏差适中样本的预测结果

从上图中能发现,虽然第二个样本的RMSE偏差最小,但预测的RUL较真实的RUL偏差较大。相反,第四个图片展示的结果,随着RUL的减小,预测的RUL不断逼近、跟踪真实的RUL,这表明了CNN网络在预测RUL方面也有一定的可行性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18287.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

day02(单片机高级)单片机控制ESP8266连接阿里云

目录 单片机控制ESP8266连接阿里云物联平台 MQTT协议简介 订阅和发布 cJSON简介 云平台搭建 注册和登录 实例的开通和创建 产品和设备的创建 创建产品 添加设备 功能定义 发布上线 MQTTFX工具使用 发布和订阅 订阅 发布 MQTT固件烧录 AT指令验证 调试验证订阅 单片机控制ESP826…

社交电商的优势及其与 AI 智能名片小程序、S2B2C 商城系统的融合发展

摘要:本文深入分析了社交电商相较于传统电商的优势,包括门槛低、易操作、更生活化和可团队化运作等特点。同时,探讨了 AI 智能名片小程序和 S2B2C 商城系统在社交电商发展中的作用,以及它们与社交电商融合所带来的新机遇和发展前景…

uni-app快速入门(八)--常用内置组件(上)

uni-app提供了一套基础组件&#xff0c;类似HTML里的标签元素&#xff0c;不推荐在uni-app中使用使用div等HTML标签。在uni-app中&#xff0c;对应<div>的标签是view&#xff0c;对应<span>的是text&#xff0c;对应<a>的是navigator&#xff0c;常用uni-app…

Jmeter的后置处理器(二)

5--JSR223 PostProcessor 功能特点 自定义后处理逻辑&#xff1a;使用脚本语言编写自定义的后处理逻辑。支持多种脚本语言&#xff1a;支持 Groovy、JavaScript、BeanShell 等脚本语言。动态参数传递&#xff1a;将提取的数据存储为变量&#xff0c;供后续请求使用。灵活性高…

基于SpringBoot3+mybatis搭建的历史上的今天API接口服务 及 Mybatis 应该有个更好的方法来隐藏 Pojo 类中的字段

一、Mybatis有没有比较好的方法隐藏 Pojo 类中的字段 使用 Mybatis 时&#xff0c;为了实现通用的CURD&#xff0c;在定义实体类pojo时&#xff0c;会尽量将能用得上的数据库字段都定义到 pojo中&#xff0c;但是在查询的时候却有不一样的需求。mybatis的文档地址链接&#xff…

SLAM-evo 评估

文章目录 1.evo介绍1.1.evo安装1.1.2.evo的安装(evo共有两种安装方式)1.1.2.1.采用pip安装&#xff0c;直接安装最新的稳定发行版&#xff08;在翻墙的情况下可以使用&#xff09;将路径添加到系统 PATH 中1.1.2.2.源码安装 &#xff0c;下载源码进行安装&#xff08;必须翻墙&…

【机器学习chp3】判别式分类器:线性判别函数、线性分类器、广义线性分类器、分段线性分类器

前言&#xff1a; 本文遗留问题&#xff1a;&#xff08;1&#xff09;对最小平方误差分类器的理解不清晰.&#xff08;2&#xff09;分段线性判别函数的局部训练法理解不清晰。 推荐文章1&#xff0c;其中有关于感知机的分析 【王木头从感知机到神经网络】-CSDN博客 推荐文…

04 搭建linux驱动开发环境

虽然 petalinux 功能很全面&#xff0c;但是其编译速度较慢&#xff0c;不适用于驱动调试阶段&#xff08;因为驱动调试阶段会频繁修改驱动模块、内核、设备树等&#xff09;&#xff0c;因此本章将采用分步编译的方式来编译启动开发板所需要的各种镜像文件&#xff0c;虽然步骤…

Linux性能优化之火焰图的起源

Linux火焰图的起源与性能优化专家 Brendan Gregg 密切相关&#xff0c;他在 2011 年首次提出这一工具&#xff0c;用于解决性能分析过程中可视化和数据解读的难题。 1. 背景&#xff1a;性能优化的需求 在现代计算中&#xff0c;性能优化往往需要对程序执行中的热点和瓶颈进行…

半桥驱动芯片调试中的问题

结论&#xff1a;低于12V的场景应用分立的MOS驱动电路压根不合适&#xff0c;选用集成桥臂的芯片合适。 HIN的输入电平不能是长时间的高电平&#xff0c;否则自举电容没法充放电从而没办法自举升压&#xff0c;上管无法控制&#xff1a; 电容C2的容值应该尽可能大&#xff…

【C++】类和对象-深度剖析默认成员函数-上

> &#x1f343; 本系列为初阶C的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:[小编的个人主页])小编的个人主页 > &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 > ✌️ &#x1f91e; &#x1…

RabbitMQ黑马笔记

目录 1.初识MQ 1.1.同步和异步通讯 1.1.1.同步通讯 1.1.2.异步通讯 1.2.技术对比&#xff1a; 2.快速入门 2.1.安装RabbitMQ 2.2.RabbitMQ消息模型 2.3.导入Demo工程 2.4.入门案例 2.4.1.publisher实现 2.4.2.consumer实现 2.5.总结 3.SpringAMQP 3.1.Basic Queu…

麒麟KylinServer的网站,并部署一套主从DNS服务器提供域名解析服务

一、KylinServer网站搭建 ifconfig Copy 注意:根据实际网卡设备名称情况调整代码!不同环境下网卡名称略有不同! 获取本机IP地址,记住IP地址用于之后的配置填写。 ifconfig enp0s2 Copy 下载nginx源码包,并解压缩 wget http://10.44.16.102:60000/allfiles/Kylin/ng…

解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件

勾选Auto-detect proxy setting并填入 https://plugins.jetbrains.com 代理URL&#xff0c;可以先做检查连接&#xff1a;

AWTK-WIDGET-WEB-VIEW 发布

awtk-widget-web-view 是通过 webview 提供的接口&#xff0c;实现的 AWTK 自定义控件&#xff0c;使得 AWTK 可以方便的显示 web 页面。 项目网址&#xff1a; https://gitee.com/zlgopen/awtk-widget-web-view webview 提供了一个跨平台的 webview 接口&#xff0c;是一个非…

Pandas教程之Pandas 简介

Pandas 简介 接下来一段时间&#xff0c;我会持续发布并完成Pandas教程 Pandas 是一个功能强大的开源 Python 库。Pandas 库用于数据操作和分析。Pandas 由数据结构和函数组成&#xff0c;可对数据执行有效的操作。 本免费教程将概述 Pandas&#xff0c;涵盖 Python Pandas 的基…

【linux】网络基础 ---- 数据链路层

用于两个设备(同一种数据链路节点)之间进行传递 数据链路层解决的问题是&#xff1a;直接相连的主机之间&#xff0c;进行数据交付 1. 认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标准&#xff1a; 既包含了数据链路层的内容, 也包含了一些物理层的内容…

i春秋-FUZZ(python模板注入、base64编码命令执行)

练习平台地址 竞赛中心 题目描述 题目内容 很直接就是要fuzz参数 参数字典 dpaste/eH2Z1 (Plain Text) BP爆破参数 发现存在name参数 尝试sql注入 发现输入啥就回显啥&#xff0c;猜测是模板注入 测试是不是模板注入 虽然9*9没有被执行&#xff0c;但是config执行了&#…

另外一种缓冲式图片组件的用法

文章目录 1. 概念介绍2. 使用方法2.1 基本用法2.2 缓冲原理3. 示例代码4. 内容总结我们在上一章回中介绍了"FadeInImage组件"相关的内容,本章回中将介绍CachedNetworkImage组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的CachedNetwo…

Java中的CAS

目录 一.问题提出 1.1解决思路-锁 1.2解决思路-无锁 二.什么是CAS 三.CAS的特点 四.ABA问题 4.1解决方案-AtomicStampedReference 4.2解决方案-AtomicMarkableReference 一.问题提出 如何保证 withdraw 取款方法的线程安全 public class Cas {public static void mai…