当前位置:   article > 正文

Pytorch-Transformer轴承故障一维信号分类(三)_pytorch使用transformer对一维信号

pytorch使用transformer对一维信号

目录

前言

1 数据集制作与加载

1.1 导入数据

第一步,导入十分类数据

第二步,读取MAT文件驱动端数据

第三步,制作数据集

第四步,制作训练集和标签

1.2 数据加载,训练数据、测试数据分组,数据分batch

2 Transformer分类模型和超参数选取

2.1 定义Transformer分类模型,采用Transformer架构中的编码器:

2.2 定义模型参数

2.3 模型结构

3 Transformer模型训练与评估

3.1 模型训练

3.2 模型评估


 往期精彩内容:

Python-凯斯西储大学(CWRU)轴承数据解读与分类处理

Python轴承故障诊断 (一)短时傅里叶变换STFT

Python轴承故障诊断 (二)连续小波变换CWT_pyts 小波变换 故障-CSDN博客

Python轴承故障诊断 (三)经验模态分解EMD_轴承诊断 pytorch-CSDN博客

Pytorch-LSTM轴承故障一维信号分类(一)_cwru数据集pytorch训练-CSDN博客

Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客

Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客

Python轴承故障诊断 (四)基于EMD-CNN的故障分类-CSDN博客

Python轴承故障诊断 (五)基于EMD-LSTM的故障分类-CSDN博客

Python轴承故障诊断 (六)基于EMD-Transformer的故障分类-CSDN博客

Python轴承故障诊断 (七)基于EMD-CNN-LSTM的故障分类-CSDN博客

Python轴承故障诊断 (八)基于EMD-CNN-GRU并行模型的故障分类-CSDN博客

基于FFT + CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客

基于FFT + CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客

大甩卖-(CWRU)轴承故障诊数据集和代码全家桶-CSDN博客

Python轴承故障诊断 (九)基于VMD+CNN-BiLSTM的故障分类-CSDN博客

Python轴承故障诊断 (十)基于VMD+CNN-Transfromer的故障分类-CSDN博客

Python轴承故障诊断 (11)基于VMD+CNN-BiGRU-Attenion的故障分类-CSDN博客

交叉注意力融合时域、频域特征的FFT + CNN -BiLSTM-CrossAttention轴承故障识别模型-CSDN博客

交叉注意力融合时域、频域特征的FFT + CNN-Transformer-CrossAttention轴承故障识别模型-CSDN博客

轴承故障诊断 (12)基于交叉注意力特征融合的VMD+CNN-BiLSTM-CrossAttention故障识别模型-CSDN博客

Python轴承故障诊断入门教学-CSDN博客

Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型-CSDN博客

Python轴承故障诊断 (14)高创新故障识别模型-CSDN博客

Python轴承故障诊断 (15)基于CNN-Transformer的一维故障信号识别模型-CSDN博客

前言

本文基于凯斯西储大学(CWRU)轴承数据,先经过数据预处理进行数据集的制作和加载,最后通过Pytorch实现Transformer模型对故障数据的分类,并介绍Transformer模型的超参数。凯斯西储大学轴承数据的详细介绍可以参考下文:

Python-凯斯西储大学(CWRU)轴承数据解读与分类处理

1 数据集制作与加载

1.1 导入数据

参考之前的文章,进行故障10分类的预处理,凯斯西储大学轴承数据10分类数据集:

第一步,导入十分类数据

  1. import numpy as np
  2. import pandas as pd
  3. from scipy.io import loadmat
  4. file_names = ['0_0.mat','7_1.mat','7_2.mat','7_3.mat','14_1.mat','14_2.mat','14_3.mat','21_1.mat','21_2.mat','21_3.mat']
  5. for file in file_names:
  6. # 读取MAT文件
  7. data = loadmat(f'matfiles\\{file}')
  8. print(list(data.keys()))

第二步,读取MAT文件驱动端数据

  1. # 采用驱动端数据
  2. data_columns = ['X097_DE_time', 'X105_DE_time', 'X118_DE_time', 'X130_DE_time', 'X169_DE_time',
  3. 'X185_DE_time','X197_DE_time','X209_DE_time','X222_DE_time','X234_DE_time']
  4. columns_name = ['de_normal','de_7_inner','de_7_ball','de_7_outer','de_14_inner','de_14_ball','de_14_outer','de_21_inner','de_21_ball','de_21_outer']
  5. data_12k_10c = pd.DataFrame()
  6. for index in range(10):
  7. # 读取MAT文件
  8. data = loadmat(f'matfiles\\{file_names[index]}')
  9. dataList = data[data_columns[index]].reshape(-1)
  10. data_12k_10c[columns_name[index]] = dataList[:119808] # 121048 min: 121265
  11. print(data_12k_10c.shape)
  12. data_12k_10c

第三步,制作数据集

train_set、val_set、test_set 均为按照7:2:1划分训练集、验证集、测试集,最后保存数据

第四步,制作训练集和标签

  1. # 制作数据集和标签
  2. import torch
  3. # 这些转换是为了将数据和标签从Pandas数据结构转换为PyTorch可以处理的张量,
  4. # 以便在神经网络中进行训练和预测。
  5. def make_data_labels(dataframe):
  6. '''
  7. 参数 dataframe: 数据框
  8. 返回 x_data: 数据集 torch.tensor
  9. y_label: 对应标签值 torch.tensor
  10. '''
  11. # 信号值
  12. x_data = dataframe.iloc[:,0:-1]
  13. # 标签值
  14. y_label = dataframe.iloc[:,-1]
  15. x_data = torch.tensor(x_data.values).float()
  16. y_label = torch.tensor(y_label.values.astype('int64')) # 指定了这些张量的数据类型为64位整数,通常用于分类任务的类别标签
  17. return x_data, y_label
  18. # 加载数据
  19. train_set = load('train_set')
  20. val_set = load('val_set')
  21. test_set = load('test_set')
  22. # 制作标签
  23. train_xdata, train_ylabel = make_data_labels(train_set)
  24. val_xdata, val_ylabel = make_data_labels(val_set)
  25. test_xdata, test_ylabel = make_data_labels(test_set)
  26. # 保存数据
  27. dump(train_xdata, 'trainX_1024_10c')
  28. dump(val_xdata, 'valX_1024_10c')
  29. dump(test_xdata, 'testX_1024_10c')
  30. dump(train_ylabel, 'trainY_1024_10c')
  31. dump(val_ylabel, 'valY_1024_10c')
  32. dump(test_ylabel, 'testY_1024_10c')

1.2 数据加载,训练数据、测试数据分组,数据分batch

  1. import torch
  2. from joblib import dump, load
  3. import torch.utils.data as Data
  4. import numpy as np
  5. import pandas as pd
  6. import torch
  7. import torch.nn as nn
  8. # 参数与配置
  9. torch.manual_seed(100) # 设置随机种子,以使实验结果具有可重复性
  10. device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 有GPU先用GPU训练
  11. # 加载数据集
  12. def dataloader(batch_size, workers=2):
  13. # 训练集
  14. train_xdata = load('trainX_1024_10c')
  15. train_ylabel = load('trainY_1024_10c')
  16. # 验证集
  17. val_xdata = load('valX_1024_10c')
  18. val_ylabel = load('valY_1024_10c')
  19. # 测试集
  20. test_xdata = load('testX_1024_10c')
  21. test_ylabel = load('testY_1024_10c')
  22. # 加载数据
  23. train_loader = Data.DataLoader(dataset=Data.TensorDataset(train_xdata, train_ylabel),
  24. batch_size=batch_size, shuffle=True, num_workers=workers, drop_last=True)
  25. val_loader = Data.DataLoader(dataset=Data.TensorDataset(val_xdata, val_ylabel),
  26. batch_size=batch_size, shuffle=True, num_workers=workers, drop_last=True)
  27. test_loader = Data.DataLoader(dataset=Data.TensorDataset(test_xdata, test_ylabel),
  28. batch_size=batch_size, shuffle=True, num_workers=workers, drop_last=True)
  29. return train_loader, val_loader, test_loader
  30. batch_size = 32
  31. # 加载数据
  32. train_loader, val_loader, test_loader = dataloader(batch_size)

2 Transformer分类模型和超参数选取

2.1 定义Transformer分类模型,采用Transformer架构中的编码器:

注意:输入数据进行了堆叠 ,把一个1*1024 的序列 进行划分堆叠成形状为 32 * 32, 就使输入序列的长度降下来了

2.2 定义模型参数

  1. # 模型参数
  2. input_dim = 32 # 输入维度
  3. hidden_dim = 512 # 注意力维度
  4. output_dim = 10 # 输出维度
  5. num_layers = 4 # 编码器层数
  6. num_heads = 8 # 多头注意力头数
  7. batch_size = 32
  8. # 模型
  9. model = TransformerModel(input_dim, output_dim, hidden_dim, num_layers, num_heads, batch_size)
  10. model = model.to(device)
  11. loss_function = nn.CrossEntropyLoss(reduction='sum') # loss
  12. learn_rate = 0.0003
  13. optimizer = torch.optim.Adam(model.parameters(), lr=learn_rate) # 优化器

2.3 模型结构

3 Transformer模型训练与评估

3.1 模型训练

训练结果

100个epoch,准确率将近90%,Transformer模型分类效果良好,参数过拟合了,适当调整模型参数,降低模型复杂度,还可以进一步提高分类准确率。

注意调整参数:

  • 可以适当增加 Transforme编码器层数 和隐藏层的维度,微调学习率;

  • 调整多头注意力的头数,增加更多的 epoch (注意防止过拟合)

  • 可以改变一维信号堆叠的形状(设置合适的长度和维度)

3.2 模型评估

  1. # 模型 测试集 验证
  2. import torch.nn.functional as F
  3. # 加载模型
  4. model =torch.load('best_model_transformer.pt')
  5. # model = torch.load('best_model_cnn2d.pt', map_location=torch.device('cpu'))
  6. # 将模型设置为评估模式
  7. model.eval()
  8. # 使用测试集数据进行推断
  9. with torch.no_grad():
  10. correct_test = 0
  11. test_loss = 0
  12. for test_data, test_label in test_loader:
  13. test_data, test_label = test_data.to(device), test_label.to(device)
  14. test_output = model(test_data)
  15. probabilities = F.softmax(test_output, dim=1)
  16. predicted_labels = torch.argmax(probabilities, dim=1)
  17. correct_test += (predicted_labels == test_label).sum().item()
  18. loss = loss_function(test_output, test_label)
  19. test_loss += loss.item()
  20. test_accuracy = correct_test / len(test_loader.dataset)
  21. test_loss = test_loss / len(test_loader.dataset)
  22. print(f'Test Accuracy: {test_accuracy:4.4f} Test Loss: {test_loss:10.8f}')
  23. Test Accuracy: 0.9570 Test Loss: 0.12100271

代码、数据如下:

对数据集和代码感兴趣的,可以关注最后一行

  1. # 加载数据
  2. import torch
  3. from joblib import dump, load
  4. import torch.utils.data as Data
  5. import numpy as np
  6. import pandas as pd
  7. import torch
  8. import torch.nn as nn
  9. # 参数与配置
  10. torch.manual_seed(100) # 设置随机种子,以使实验结果具有可重复性
  11. device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
  12. #代码和数据集:https://mbd.pub/o/bread/ZZecl5ps

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/838676
推荐阅读
相关标签
  

闽ICP备14008679号