本期代码非常详细,所占篇幅也非常多,所以分三次呈现给大家,该文章是本期第2篇文章,主要介绍西储大学数据集以及一些所需的深度学习基础知识,文章后半部分讲解了本期代码的数据预处理以及数据切割等部分。本期第1篇文章主要介绍了Python环境以及各个软件环境安装【初学者必看教程 | 手把手教你安装GPU版Pytorch环境及手把手带大家跑通第一个故障诊断案例!!!(上)】。第3篇文章主要构建1DCNN模型框架以及模型训练模型检测等内容。
1 引言
2 安装Anaconda
2.1 Anaconda介绍
2.2 Anaconda安装
3 配置Pytorch环境(CPU版)
3.1 Pytorch介绍
3.2 Pytorch配置教程(CPU版)
4 配置Pytorch环境(GPU版)
4.1 两种Pytorch区别(看是否支持GPU)
4.2 CUDA安装
4.3 Pytorch配置教程(GPU版)
5 配置代码编辑器
5.1 代码编辑器区别
5.2 VScode编辑器
5.3 Pycharm编辑器
5.4 JupyterNotebook编辑器
6 故障诊断代码示例 (重中之重)
6.1 代码介绍
6.2 检验Pytorch
6.3 故障诊断实战代码(数据提取及预处理部分)
注:小编能力有限,如有不恰之处,请多多指正~
6.1 代码介绍
6.1.1代码流程
数据提取部分代码,把.mat文件中正常数据和12kHz驱动端数据提取成Dataframe格式,接着通过预处理将数据划分为长度1024、重叠率0.5的多个样本。并转化为适合深度学习的tensor格式。模型搭建部分构建了1DCNN模型框架,然后模型训练部分调用基本1DCNN模型框架以及训练集验证集通过多次训练生成最佳模型,最后模型测试部分加载最佳模型和测试集并通过准确率,召回率,混淆矩阵等多指标检验模型效果。
6.1.2 基础知识
(1) 西储数据集
西储轴承故障数据集,常用于故障诊断和预测的研究。该数据集包含了来自不同故障模式和工作条件下的轴承振动数据。
图1 西储大学轴承数据集试验台
数据集分成四个部分分别是Normal Baseline Data(正常数据集),12k Drive End Bearing Fault Data(12k 驱动端轴承故障数据),48kDrive End Bearing Fault Data(48k 驱动端轴承故障数据),12k Fan End Bearing Fault Data(12k 风扇端轴承故障数据)。
图2 正常数据集
图3 12k驱动端轴承故障数据
图4 48k驱动端轴承故障数据
图5 12k风扇端轴承故障数据
本文代码涉及正常数据以及12k驱动端轴承数据,在正常数据集中有四部分分别是0马力,1马力,2马力,3马力。12k驱动端轴承数据中按照轴承故障尺寸分成0.007英寸、0.014英寸、0.021英寸、0.028英寸。其中每个故障尺寸包含0-3四个马力负载,每个负载测量内圈、滚珠、外圈(部分数据存在空缺,如0.028英寸故障中的外圈)。在外圈数据中,又分为6点钟、3点钟、12点钟。其中在0.007英寸、0.014英寸、0.021英寸中均包含6点钟的外圈故障。
文章所取数据为正常数据0hp,0.007英寸缺陷尺寸0hp(内圈,滚珠,6点钟外圈故障),0.014英寸缺陷尺寸0hp(内圈,滚珠,6点钟外圈故障),0.021英寸缺陷尺寸0hp(内圈,滚珠,6点钟外圈故障),总共10类,后面依次记标签为0-9。
图6 本文代码涉及数据集
注:官网下载原数据集以及本文代码涉及数据集均在文末提供。(本文代码数据集是在原数据基础上将需要的数据集整合到matfiles文件中,并对各数据重命名方便观察)
数据提取部分代码,把.mat文件中正常数据和12kHz驱动端提取到Dataframe格式并保存为CSV文件方便后续调用,在数据预处理阶段先对CSV文件里的数据进行划分并保存为train_set,val_set,test_set新的CSV文件,然后对这三部分进行转换,得到适合深度学习的张量格式。
其中,DataFrame 是 Pandas 库中的一种数据结构,用于存储和操作结构化数据。它是一个二维的、表格型的数据结构,可以看作是一个表格,其中每列可以是不同的数据类型(数值、字符串、布尔值等),类似于 Excel 中的电子表格或 SQL 中的表。CSV(Comma-Separated Values,逗号分隔值)是一种常见的文件格式,用于存储表格数据。CSV 文件由纯文本组成,其中数据项之间用逗号分隔,每行代表一个数据记录。许多应用程序和编程语言都可以读取和写入 CSV 文件。张量是多维数组,是深度学习框架(如 Pytorch 和 TensorFlow)中的基本数据结构。它可以表示标量(0 维张量)、向量(1 维张量)、矩阵(2 维张量)以及更高维度的数据。深度学习框架对张量提供了高效的数学运算支持,如加法、乘法、卷积等。在 Pytorch 等框架中,张量可以记录计算过程,自动计算梯度,这使得模型的训练和优化变得简单。
(3) 1DCNN
1DCNN 通过卷积层提取一维序列数据的局部特征,池化层降低特征维度并保留重要信息,激活函数引入非线性,全连接层整合特征并进行分类这些层共同协作,使得 1DCNN 能够有效地处理和分析序列数据,捕捉序列中的模式和时间依赖性,适用于各种序列建模任务。
其中卷积层是 CNN 的核心层,通过卷积操作来提取输入数据的局部特征。在 1DCNN 中,卷积层使用一维卷积核在序列上滑动,计算卷积核与序列局部区域的点积,生成特征图(激活图)。
池化层用于降低特征图的空间维度,减少计算量,同时保留重要特征信息。常见的池化操作有最大池化和平均池化。激活函数是用于引入非线性的函数,它对卷积层或全连接层的输出进行非线性变换。常用的激活函数有 ReLU、sigmoid、tanh 等。
全连接层是传统的神经网络层,其中每个神经元都与前一层的所有神经元相连。在 1DCNN 中,全连接层通常位于网络的最后几层,用于将前面卷积层和池化层提取的特征进行整合和分类。在分类任务中,全连接层输出每个类别的概率分布;在回归任务中,输出预测值。
6.2 检验Pytorch
(1) Win+R后输入cmd,管理员运行进入命令提示符,然后命令输入conda env list。
conda env list。
图7 运行结果
(2) 进入想查询的Python环境,输入activate python311。
activate python311
图8 运行结果
(3) 查询当前环境下的所有库,输入pip list。
pip list
图9 运行结果
(4) 查询pytorch
图10 查询结果
发现不带cuda版本,即该环境下pytorch为CPU版本。
(5) 退出当前环境,输入conda deactivate。
conda deactivate
图11 运行结果
(6) 进入想查询的其他Python环境,输入activate DL311。
activate DL311
图12 运行结果
(7) 查询当前环境下的所有库,输入pip list。
pip list
图13 运行结果
发现带cuda版本,即该环境下pytorch为GPU版本。
6.3 故障诊断实战代码
6.3.1 数据预处理
(1)数据提取
import numpy as np
import pandas as pd
from scipy.io import loadmat
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']
# 采用驱动端数据
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(f'matfiles\\{file_names[index]}')
dataList = data[data_columns[index]].reshape(-1)
data_12k_10c[columns_name[index]] = dataList[:119808]
print(data_12k_10c.shape)
data_12k_10c.set_index('de_normal',inplace=True)
data_12k_10c.to_csv('data_12k_10c.csv')
print(data_12k_10c.shape)
data_12k_10c
数据切割划分将data_12k_10c中数据按照步长1024,重叠率0.5划分,分成多个样本,并打上对应标签(0-9)。最后把数据按照3:1:1划分成训练集、验证集、测试集。最后保存分别命名为train_set,val_set,test_set。
def split_data_with_overlap(data, time_steps, lable, overlap_ratio=0.5):
stride = int(time_steps * (1 - overlap_ratio)) # 计算步幅
samples = (len(data) - time_steps) // stride + 1 # 计算样本数
# 用于存储生成的数据
Clasiffy_dataFrame = pd.DataFrame(columns=[x for x in range(time_steps + 1)])
data_list = []
for i in range(samples):
start_idx = i * stride
end_idx = start_idx + time_steps
temp_data = data[start_idx:end_idx].tolist()
temp_data.append(lable) # 对应哪一类
data_list.append(temp_data)
Clasiffy_dataFrame = pd.DataFrame(data_list, columns=Clasiffy_dataFrame.columns)
return Clasiffy_dataFrame
# 数据集的制作
def make_datasets(data_file_csv, split_rate = [0.6,0.2,0.2]):
# 1.读取数据
origin_data = pd.read_csv(data_file_csv)
# 2.分割样本点
time_steps = 1024 # 时间步长
overlap_ratio = 0.5 # 重叠率
# 用于存储生成的数据# 10个样本集 合
samples_data = pd.DataFrame(columns=[x for x in range(time_steps + 1)])
# 记录类别标签
label = 0
# 使用iteritems()方法遍历每一列
for column_name, column_data in origin_data.items():
# 划分样本点 window = 1024 overlap_ratio = 0.5 samples = 233 每个类有233个样本
split_data = split_data_with_overlap(column_data, time_steps, label, overlap_ratio)
label += 1 # 类别标签递增
samples_data = pd.concat([samples_data, split_data])
# 随机打乱样本点顺序
# 打乱索引并重置索引
samples_data = samples_data.sample(frac=1).reset_index(drop=True)
# 3.分割训练集-、验证集、测试集
sample_len = len(samples_data) # 每一类样本数量
train_len = int(sample_len*split_rate[0]) # 向下取整
val_len = int(sample_len*split_rate[1])
train_set = samples_data.iloc[0:train_len,:]
val_set = samples_data.iloc[train_len:train_len+val_len,:]
test_set = samples_data.iloc[train_len+val_len:,:]
return train_set, val_set, test_set, samples_data
# 生成数据集
train_set, val_set, test_set, samples_data = make_datasets('data_12k_10c.csv')
# 保存数据
dump(train_set, 'train_set')
dump(val_set, 'val_set')
dump(test_set, 'test_set')
print(train_set.shape)
print(val_set.shape)
print(test_set.shape)
(3)Pandas数据转换成张量
数据转换部分将train_set,val_set,test_set这些Pandas数据结构转化为适合深度学习模型的张量结构,最后保存。
def make_data_labels(dataframe):
# 信号值
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')
print('数据 形状:')
print(train_xdata.size(), train_ylabel.size())
print(val_xdata.size(), val_ylabel.size())
print(test_xdata.size(), test_ylabel.size())
图16 数据转换输出结果
(4)加载张量数据
该部分代码首先会检验运行环境是否支持GPU,如果支持则输出cuda,然后通过数据加载器,它将从xdata和 ylabel 中批量加载数据,每个批次包含 batch_size 个样本每个批次包含 batch_size 个样本,样本在每个训练周期开始时会被随机打乱,使用 workers 个子进程来加载数据,并且会丢弃最后一个不完整的批次。通过这种方式,可以高效地加载和处理训练数据,为模型的训练提供支持。
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 有GPU先用GPU训练
print(device)
# 加载数据集
def dataloader(batch_size, workers=2):
# 训练集
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(dataset=Data.TensorDataset(train_xdata, train_ylabel),
batch_size=batch_size, shuffle=True, num_workers=workers, drop_last=True)
val_loader = Data.DataLoader(dataset=Data.TensorDataset(val_xdata, val_ylabel),
batch_size=batch_size, shuffle=True, num_workers=workers, drop_last=True)
test_loader = Data.DataLoader(dataset=Data.TensorDataset(test_xdata, test_ylabel),
batch_size=batch_size, shuffle=True, num_workers=workers, drop_last=True)
return train_loader, val_loader, test_loader
batch_size = 32
# 加载数据
train_loader, val_loader, test_loader = dataloader(batch_size)
print(len(train_loader))#批次个数
print(len(val_loader))
print(len(test_loader))
图17 练集验证机测试集批次个数
如图,本次操作环境支持GPU加速(此处也可以作为检验是否支持cuda的方法),并且通过batch_size=32,丢弃最后一个不完整的批次设置后,训练集部分将存在43个批次,验证集存在14个批次,测试集存在14个批次。
文章剩余部分为1DCNN模型框架搭建,加载训练集验证集训练模型,测试集验证模型,并通过折线图以及准确率、召回率等指标检验模型结果,最后通过混淆矩阵进一步分析实验结果。详细内容及讲解将在第三篇呈现。
编辑:赵栓栓
校核:李正平、陈凯歌、曹希铭、赵学功、白亮、王金、陈莹洁、陈宇航、任超、海洋、Tina
该文资料搜集自网络,仅用作学术分享,不做商业用途,若侵权,后台联系小编进行删除
点击左下角阅读原文,即可在线阅读论文。