基于深度学习的航空发动机剩余寿命预测
背景介绍
近年来,随着微电子技术的进步与发展,传感器愈加智能化、微型化且价格低廉,相关产品在国防军工、机械装备、医疗电子以及环境治理等领域具有广泛的应用。传感器工作过程中能够产生大量的监测数据,工程师如何从数据中提取有用信息来辅助管理人员制定决策信息显得尤为关键。
基于数据驱动的RUL预测方法是大数据时代的产物,吸引了众多学者们的目光。该方法不必过度依赖于物理失效模型和领域专业知识,而是直接立足于传感器监测数据本身,运用信号处理等技术对其进行分析和挖掘,提取反映系统退化失效的特征,最终实现对设备的RUL预测,具体框架如下图所示:
系统框架
本项目利用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组)。
传感器数据归一化处理:
程序算法
长短期记忆(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()
结果展示
采用测试集数据对模型的准确性进行验证,具体的结果如下所示:
![](https://jkboy.com/wp-content/uploads/2021/10/Pasted-11.png)