使用LSTM实现C-MAPSS数据集里面的剩余寿命预测(Pytorch)

源代码

背景

在现代工业生产中,提高效率和降低成本是最重要的追求的目标。同时,对。提出了越来越高的要求设备的安全性和可靠性。系统一旦出现故障,将造成巨大的损失以人力和财力。故障排除有助于确定原因设备或系统出现问题时,精确定位单个部件。这速度加快维修流程,减少停机时间,提高生产效率。预测性维护通过监测设备状况来防止损坏并降低维修成本和性能数据,预测可能出现的故障,并在故障发生之前制定维护计划。因此,可以大大减少故障排除和预测性维护计划节省了人力,提高了可靠性、可用性和可维护性设备效率。

CMAPSS数据集

数据集:FD001
训练轨迹:100
测试轨迹:100
条件:一个(海平面)
故障模式:ONE(HPC降级)

1)单位编号
2)时间,以周期为单位
3)操作设定1
4)操作设定2
5)操作设置3
6)传感器测量1
7)传感器测量2

26)传感器测量26

在这里插入图片描述

模型结构

class BDLSTM(nn.Module):
    def __init__(self,hidden_size=50,input_size=17,seq_selected=30):
        super(BDLSTM, self).__init__()
        self.seq_selected=seq_selected
        self.hidden_size=hidden_size
        self.lstm = nn.LSTM(batch_first=True, input_size=input_size, hidden_size=50, num_layers=1,bidirectional=True)
        self.attenion = Attention3dBlock(seq_selected)
        self.linear = nn.Sequential(
            nn.Linear(in_features=seq_selected*self.hidden_size*2, out_features=50),
            nn.ReLU(inplace=True),
            nn.Dropout(p=0.2),
            nn.Linear(in_features=50, out_features=10),
            nn.ReLU(inplace=True)
        )
        self.mslinear = nn.Sequential(
            nn.Linear(in_features=input_size*2, out_features=10),
            nn.ReLU(inplace=True),
            nn.Dropout(p=0.2)
        )

        self.output = nn.Sequential(
            # nn.Linear(in_features=10, out_features=1)
            nn.Linear(in_features=20, out_features=1)
        )

    def forward(self, inputs):#256,31,17
        mean=torch.mean(inputs,dim=1)#256,17
        std=torch.std(inputs,dim=1)#256,17
        mean_std_feature=torch.concat((mean,std),dim=1)#256,34
        y = self.mslinear(mean_std_feature)
        x, (hn, cn) = self.lstm(inputs)#256,31,50
        x = self.attenion(x)#256, 31, 50
        # flatten
        x = x.reshape(-1, self.seq_selected*self.hidden_size*2)#256, 1550
        x = self.linear(x)#256, 10
        out = torch.concat((x, y), dim=1)
        # out=x
        out = self.output(out)
        return out

在这里插入图片描述

实验结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
每轮训练后测试集误差
score:445.4610 334.5140 358.6489 365.9250 331.4520 283.3463 460.4766 314.7196 325.5950 452.3746
RMSE:16.3614 14.8254 14.9796 15.5157 14.7853 14.2053 16.2834 14.6757 14.7481 15.8802

结论

由实验结果可知,MS-BLSTM 的预测误差均为最低水平,并且实际训练过程中收敛速度较快,涡扇发动机接近损坏时预测准确率较高。与传统机器学习方法相比,深度学习模型如CNN 和 LSTM的预测误差相对较小。而本文所提的 MS-BLSTM 混合深度学习预测模型进一步提高了 RUL 预测精度,,这得益于 MS-BLSTM 混合模型有效利用了时间段内传感器测量值的均值和方差与RUL的相关性,并使用 BLSTM学习历史数据和未来数据的长程依赖。本文所提的 MS-BLSTM 剩余使用寿命预测模型预测精度高,可有力支撑涡扇发动机的健康管理与运维决策。

源代码

https://download.csdn.net/download/qq_61908212/88643920
https://github.com/xizhihina/Turbofan-RUL-Prediction

  • 18
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
以下是使用pytorch实现lstm使用NSL-KDD数据集的示例代码: ```python import torch import torch.nn as nn import numpy as np import pandas as pd from sklearn.preprocessing import LabelEncoder, OneHotEncoder, StandardScaler from sklearn.model_selection import train_test_split # 加载数据集 data = pd.read_csv('KDDTrain+.txt', header=None) data.columns = ['duration', 'protocol_type', 'service', 'flag', 'src_bytes', 'dst_bytes', 'land', 'wrong_fragment', 'urgent', 'hot', 'num_failed_logins', 'logged_in', 'num_compromised', 'root_shell', 'su_attempted', 'num_root', 'num_file_creations', 'num_shells', 'num_access_files', 'num_outbound_cmds', 'is_host_login', 'is_guest_login', 'count', 'srv_count', 'serror_rate', 'srv_serror_rate', 'rerror_rate', 'srv_rerror_rate', 'same_srv_rate', 'diff_srv_rate', 'srv_diff_host_rate', 'dst_host_count', 'dst_host_srv_count', 'dst_host_same_srv_rate', 'dst_host_diff_srv_rate', 'dst_host_same_src_port_rate', 'dst_host_srv_diff_host_rate', 'dst_host_serror_rate', 'dst_host_srv_serror_rate', 'dst_host_rerror_rate', 'dst_host_srv_rerror_rate', 'label'] # 将标签列转换为分类变量 data['label'] = data['label'].apply(lambda x: 'normal' if x == 'normal.' else 'attack') le = LabelEncoder() data['protocol_type'] = le.fit_transform(data['protocol_type']) data['service'] = le.fit_transform(data['service']) data['flag'] = le.fit_transform(data['flag']) data['label'] = le.fit_transform(data['label']) # 对数据集进行标准化 scaler = StandardScaler() data.iloc[:, :41] = scaler.fit_transform(data.iloc[:, :41]) # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(data.iloc[:, :41], data['label'], test_size=0.2, random_state=42) # 将数据集转换为张量 X_train = torch.tensor(X_train.values, dtype=torch.float32) X_test = torch.tensor(X_test.values, dtype=torch.float32) y_train = torch.tensor(y_train.values, dtype=torch.int64) y_test = torch.tensor(y_test.values, dtype=torch.int64) # 定义LSTM模型 class LSTM(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super(LSTM, self).__init__() self.hidden_dim = hidden_dim self.lstm = nn.LSTM(input_dim, hidden_dim, batch_first=True) self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): h0 = torch.zeros(1, x.size(0), self.hidden_dim).requires_grad_() c0 = torch.zeros(1, x.size(0), self.hidden_dim).requires_grad_() out, (hn, cn) = self.lstm(x, (h0.detach(), c0.detach())) out = self.fc(out[:, -1, :]) return out # 定义模型参数 input_dim = 41 hidden_dim = 32 output_dim = 2 lr = 0.001 epochs = 10 # 实例化模型和损失函数 model = LSTM(input_dim, hidden_dim, output_dim) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=lr) # 训练模型 for epoch in range(epochs): optimizer.zero_grad() outputs = model(X_train) loss = criterion(outputs, y_train) loss.backward() optimizer.step() if epoch % 2 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, epochs, loss.item())) # 在测试集上进行评估 with torch.no_grad(): outputs = model(X_test) _, predicted = torch.max(outputs.data, 1) accuracy = (predicted == y_test).sum().item() / y_test.size(0) print('Test Accuracy: {:.2f}%'.format(accuracy * 100)) ``` 在上面的代码中,我们首先使用pandas加载NSL-KDD数据集,然后将标签列转换为分类变量,并对数据集进行标准化。接下来,我们将数据集分为训练集和测试集,并将它们转换为PyTorch张量。然后,我们定义了一个LSTM模型,其中包含一个LSTM层和一个全连接层。接着,我们定义了模型参数,实例化了模型和损失函数,并使用Adam优化器训练了模型。最后,我们在测试集上进行评估,并输出了准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值