基于深度学习的航空发动机剩余寿命预测

背景介绍

近年来,随着微电子技术的进步与发展,传感器愈加智能化、微型化且价格低廉,相关产品在国防军工、机械装备、医疗电子以及环境治理等领域具有广泛的应用。传感器工作过程中能够产生大量的监测数据,工程师如何从数据中提取有用信息来辅助管理人员制定决策信息显得尤为关键。

基于数据驱动的RUL预测方法是大数据时代的产物,吸引了众多学者们的目光。该方法不必过度依赖于物理失效模型和领域专业知识,而是直接立足于传感器监测数据本身,运用信号处理等技术对其进行分析和挖掘,提取反映系统退化失效的特征,最终实现对设备的RUL预测,具体框架如下图所示:

图1 预测性维护系统的架构

系统框架

本项目利用CMAPSS开源数据集进行训练,通过LSTM模型对传感器采集的数据进行识别,预测出涡轮喷气发动机风扇的剩余寿命(RUL),后续和同学一起成功部署到边缘网关~

数据集介绍

CMAPSS数据集中有四个子集分别是FD001、FD002、FD003、FD004,数据是以文本形式给出,每个子数据集中的大概内容如下: 数据集的地址为:

columns = ['unit_number','time_in_cycles','setting_1','setting_2','TRA','T2','T24','T30',
           'T50','P2','P15','P30','Nf','Nc','epr','Ps3 0','phi','NRf','NRc','BPR','farB',
          'htBleed','Nf_dmd','PCNfR_dmd','W31','W32' ]

其中,unit_number表示发动机编号,范围是0-100;time_in_cycles可以代表时间相关的编号;setting_1,2,3操作设置,TRA,T2 ....... W32表示传感器采集的结果(21组)。

传感器数据归一化处理:

{x^1} = {{x - \min (x)} \over {\max (x) - \min (x)}}

程序算法

长短期记忆(LSTM)网络作为典型的深度学习模型,在机器翻译、时间序列预测等领域得到广泛应用。因此,本文通过构建LSTM网络,实现了基于数据驱动的健康状况评估建模方法和RUL预测方法。

数据预处理模块:最后得到的数据维度为[100,],具体采用的程序如下:

def _generate_test_from_unit_list(self,num_steps,unit_number_RUL_scaled_list,knee_point_np):
    
    # unit_number_RUL_scaled_list表示传感器采集的发动机所有数据;列表的维度为100,表示100组实验;每个组实验采集的数据为(n,22),n表示时间长度;
    test_X_list=[]
    test_Y_list=[]    
           
    for i in range(len(unit_number_RUL_scaled_list)):
        unit_number_i=unit_number_RUL_scaled_list[i]#取出第i台发动机的数据
        
        #print("unit_number_i=",np.shape(unit_number_i))
        
        unit_number_i_var=unit_number_i.var(axis=0)#计算各传感器的方差; axis = 0表示沿列的方差
        
        good_index_i=unit_number_i_var>-1   #返回值一个列表[ture,ture.....ture]
        
        unit_number_i_good=unit_number_i[:,good_index_i]
        
        #print("unit_number_i_good=",unit_number_i_good)
        #print("unit_number_i_good=",np.shape(unit_number_i_good))
        
        knee_point_i=knee_point_np[i,0] #表示设备寿命开始剧烈退化的时间点,也是工业中需要更换部件的时间点

        unit_number_i_good=unit_number_i_good[0:unit_number_i_good.shape[0],:]#没有考虑拐点因素,选取了所有的数据  #shape[0]表示行数
        test_X_i=[]
        test_Y_i=[]
        test_X_i,test_Y_i=self._generate_test_from_one_unit(unit_number_i_good,TIMESTEPS=num_steps)
        
        #print("test_X_i=",np.shape(test_X_i)) #(100,10,21)   #test_X_list= = (:, 10, 21)
        #print("test_X_i=",test_X_i[0][:][:])
        
        #print("test_Y_i=",np.shape(test_Y_i)) #(100,10,21)    #test_Y_i= (:, 1, 10)
        #print("test_Y_i=",test_Y_i[0][:][:])        #test_Y_i= [[第一列数值]]
        
        test_Y_i=np.transpose(test_Y_i,[0,2,1])
        test_X_list.append(test_X_i)
        test_Y_list.append(test_Y_i)
        
        #print("test_X_list=",np.shape(test_X_list))   #test_X_list= (100,)
        
    return test_X_list,test_Y_list
    
def _generate_test_from_one_unit(self,multi_seq,TIMESTEPS=10):
    X = []
    Y = []
    num_blocks=len(multi_seq)//TIMESTEPS #整除运算,结果向负无穷方向去,取最近的整数
    
    #print("TIMESTEPS",TIMESTEPS)        
    
    for i in range(len(multi_seq)//TIMESTEPS):
        X.append(multi_seq[len(multi_seq)-(num_blocks-i)*TIMESTEPS:len(multi_seq)-(num_blocks-i-1)*TIMESTEPS,0:multi_seq.shape[1]-1])#shape[1]表示列数
        Y.append([multi_seq[len(multi_seq)-(num_blocks-i)*TIMESTEPS:len(multi_seq)-(num_blocks-i-1)*TIMESTEPS,multi_seq.shape[1]-1]])
    return np.array(X, dtype=np.float32), np.array(Y, dtype=np.float32)        

模型结构:其中input_size表示传感器的通道数量,输入参数的种类;output_size表述为输出参数,具体为预测的剩余寿命(RUL);num_steps表述矩阵维度,需要大于最小长度;max_epoch表示模型训练相关的参数:增加max_epoch,可以提高准确性,但是设置过大会造成模型过拟合,增加训练成本和带来资源消耗问题等。

def __init__(self, sess,
             lstm_size=128,
             num_layers=1,
             num_steps=10,
             input_size=21,
             output_size=1,
             logs_dir="logs",
             plots_dir="figures",
             max_epoch=5):

    self.sess = sess
    self.lstm_size = lstm_size
    self.num_layers =num_layers
    self.num_steps = num_steps
    self.input_size=input_size
    self.output_size=output_size
    self.logs_dir = logs_dir
    self.plots_dir = plots_dir
    self.max_epoch=max_epoch
    self.build_graph()

结果展示

采用测试集数据对模型的准确性进行验证,具体的结果如下所示:

图2 基于LSTM模型的航空发动机寿命预测结果展示

原文地址:https://cloud.tencent.com/developer/article/2152864

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340