网站怎么做筛选功能的代码,手机端搜索引擎排名,小说网站建设模板,哈尔滨住房和城乡建设厅网站目录
前言
1 数据集制作与加载
1.1 导入数据
第一步#xff0c;导入十分类数据
第二步#xff0c;读取MAT文件驱动端数据
第三步#xff0c;制作数据集
第四步#xff0c;制作训练集和标签
1.2 数据加载#xff0c;训练数据、测试数据分组#xff0c;数据分batch…目录
前言
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
Python轴承故障诊断 (三)经验模态分解EMD
Python轴承故障诊断 (四)基于EMD-CNN的故障分类
Python轴承故障诊断 (五)基于EMD-LSTM的故障分类
Pytorch-LSTM轴承故障一维信号分类(一)
Pytorch-CNN轴承故障一维信号分类(二)
前言
本文基于凯斯西储大学CWRU轴承数据先经过数据预处理进行数据集的制作和加载最后通过Pytorch实现Transformer模型对故障数据的分类并介绍Transformer模型的超参数。凯斯西储大学轴承数据的详细介绍可以参考下文
Python-凯斯西储大学CWRU轴承数据解读与分类处理
1 数据集制作与加载
1.1 导入数据
参考之前的文章进行故障10分类的预处理凯斯西储大学轴承数据10分类数据集 第一步导入十分类数据
import numpy as np
import pandas as pd
from scipy.io import loadmatfile_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]for file in file_names:# 读取MAT文件data loadmat(fmatfiles\\{file})print(list(data.keys())) 第二步读取MAT文件驱动端数据
# 采用驱动端数据
data_columns [X097_DE_time, X105_DE_time, X118_DE_time, X130_DE_time, X169_DE_time,X185_DE_time,X197_DE_time,X209_DE_time,X222_DE_time,X234_DE_time]
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]
data_12k_10c pd.DataFrame()
for index in range(10):# 读取MAT文件data loadmat(fmatfiles\\{file_names[index]})dataList data[data_columns[index]].reshape(-1)data_12k_10c[columns_name[index]] dataList[:119808] # 121048 min: 121265
print(data_12k_10c.shape)
data_12k_10c第三步制作数据集 train_set、val_set、test_set 均为按照721划分训练集、验证集、测试集最后保存数据
第四步制作训练集和标签
# 制作数据集和标签
import torch# 这些转换是为了将数据和标签从Pandas数据结构转换为PyTorch可以处理的张量
# 以便在神经网络中进行训练和预测。def make_data_labels(dataframe):参数 dataframe: 数据框返回 x_data: 数据集 torch.tensory_label: 对应标签值 torch.tensor# 信号值x_data dataframe.iloc[:,0:-1]# 标签值y_label dataframe.iloc[:,-1]x_data torch.tensor(x_data.values).float()y_label torch.tensor(y_label.values.astype(int64)) # 指定了这些张量的数据类型为64位整数通常用于分类任务的类别标签return x_data, y_label# 加载数据
train_set load(train_set)
val_set load(val_set)
test_set load(test_set)# 制作标签
train_xdata, train_ylabel make_data_labels(train_set)
val_xdata, val_ylabel make_data_labels(val_set)
test_xdata, test_ylabel make_data_labels(test_set)
# 保存数据
dump(train_xdata, trainX_1024_10c)
dump(val_xdata, valX_1024_10c)
dump(test_xdata, testX_1024_10c)
dump(train_ylabel, trainY_1024_10c)
dump(val_ylabel, valY_1024_10c)
dump(test_ylabel, testY_1024_10c)
1.2 数据加载训练数据、测试数据分组数据分batch
import torch
from joblib import dump, load
import torch.utils.data as Data
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
# 参数与配置
torch.manual_seed(100) # 设置随机种子以使实验结果具有可重复性
device torch.device(cuda if torch.cuda.is_available() else cpu) # 有GPU先用GPU训练# 加载数据集
def dataloader(batch_size, workers2):# 训练集train_xdata load(trainX_1024_10c)train_ylabel load(trainY_1024_10c)# 验证集val_xdata load(valX_1024_10c)val_ylabel load(valY_1024_10c)# 测试集test_xdata load(testX_1024_10c)test_ylabel load(testY_1024_10c)# 加载数据train_loader Data.DataLoader(datasetData.TensorDataset(train_xdata, train_ylabel),batch_sizebatch_size, shuffleTrue, num_workersworkers, drop_lastTrue)val_loader Data.DataLoader(datasetData.TensorDataset(val_xdata, val_ylabel),batch_sizebatch_size, shuffleTrue, num_workersworkers, drop_lastTrue)test_loader Data.DataLoader(datasetData.TensorDataset(test_xdata, test_ylabel),batch_sizebatch_size, shuffleTrue, num_workersworkers, drop_lastTrue)return train_loader, val_loader, test_loaderbatch_size 32
# 加载数据
train_loader, val_loader, test_loader dataloader(batch_size)
2 Transformer分类模型和超参数选取
2.1 定义Transformer分类模型采用Transformer架构中的编码器 注意输入数据进行了堆叠 把一个1*1024 的序列 进行划分堆叠成形状为 32 * 32 就使输入序列的长度降下来了
2.2 定义模型参数
# 模型参数
input_dim 32 # 输入维度
hidden_dim 512 # 注意力维度
output_dim 10 # 输出维度
num_layers 4 # 编码器层数
num_heads 8 # 多头注意力头数
batch_size 32
# 模型
model TransformerModel(input_dim, output_dim, hidden_dim, num_layers, num_heads, batch_size)
model model.to(device)
loss_function nn.CrossEntropyLoss(reductionsum) # loss
learn_rate 0.0003
optimizer torch.optim.Adam(model.parameters(), lrlearn_rate) # 优化器
2.3 模型结构 3 Transformer模型训练与评估
3.1 模型训练 训练结果 100个epoch准确率将近90%Transformer模型分类效果良好参数过拟合了适当调整模型参数降低模型复杂度还可以进一步提高分类准确率。 注意调整参数 可以适当增加 Transforme编码器层数 和隐藏层的维度微调学习率 调整多头注意力的头数增加更多的 epoch 注意防止过拟合 可以改变一维信号堆叠的形状设置合适的长度和维度
3.2 模型评估
# 模型 测试集 验证
import torch.nn.functional as F# 加载模型
model torch.load(best_model_transformer.pt)
# model torch.load(best_model_cnn2d.pt, map_locationtorch.device(cpu))# 将模型设置为评估模式
model.eval()
# 使用测试集数据进行推断
with torch.no_grad():correct_test 0test_loss 0for test_data, test_label in test_loader:test_data, test_label test_data.to(device), test_label.to(device)test_output model(test_data)probabilities F.softmax(test_output, dim1)predicted_labels torch.argmax(probabilities, dim1)correct_test (predicted_labels test_label).sum().item()loss loss_function(test_output, test_label)test_loss loss.item()test_accuracy correct_test / len(test_loader.dataset)
test_loss test_loss / len(test_loader.dataset)
print(fTest Accuracy: {test_accuracy:4.4f} Test Loss: {test_loss:10.8f})Test Accuracy: 0.9570 Test Loss: 0.12100271