基于卷积神经网络(CNN)的滚动轴承故障诊断
1.数据集
python代码免费获取(包含包版本及数据处理过程中数据维度变化),此代码仅供参考,禁止转载。
使用凯斯西储大学轴承数据集。选择正常状态、内圈故障、外圈故障、滚动体故障下采集的滚动轴承信号进行故障诊断。
2.数据预处理
选择CWRU数据集中98.mat、106.mat、119.mat、131.mat四个数据进行试验,分别为轴承正常、内圈故障、外圈故障、滚动体故障的信号。
首先使用上一篇文章中编写的CWRU数据集预处理代码(read_mat)对选择的数据进行处理,输出带标签的数据。
关于read_mat函数的获取及参数解释可以查看此链接:
"""
https://mp.weixin.qq.com/s?__biz=MzkzMTY5NzM1Nw==&mid=2247483690&idx=1&sn=d72f831229975f9d4fbe3992052211d2&chksm=c2664688f511cf9e42ed75bf8cf635820135a575da12e8a856803e50b4532da86cd5c56764af#rd
"""
此函数可以完成数据的归一化以及打标签。
fault_0 = read_mat(r'98.mat',1,0,3,120000,1200,100,0)
从原始振动信号中选取120000个数据参与试验,并将数据reshape为(1200,100)的形状,即有100个样本,每个样本长度为1200,将每个样本的数据归一化到[0,1]之间。98.mat文件是正常信号,使用0作为标签。四种状态的轴承数据分别标签为0、1、2、3、4。
注意此时输出的’fault_0’形状为(1201,100),每个样本的第1201个数据为标签。
数据集划分,这里每个mat文件共生成100个样本,选择60个样本作为训练集,20个样本作为验证集,20个样本作为测试集。
train_index = 60
valid_index = 80
#正常数据的训练集、验证集、测试集样本划分。
# 关注VX公众号:慢慢的不急 回复cwru_cnn获取代码
train_fault_0 = fault_0[:, :train_index]
valid_fault_0 = fault_0[:, train_index:valid_index]
test_fault_0 = fault_0[:, valid_index:]
将四种故障的训练集、验证集、测试集样本分别拼接到一起。
train = np.column_stack((train_fault_0, train_fault_1, train_fault_2, train_fault_3))#包含四种故障的训练集
将样本与标签分开,并对标签使用one-hot编码。
x_train = train[:1200,:]#训练集
# 关注VX公众号:慢慢的不急 回复cwru_cnn获取代码
y_train = train[1200,:]#训练集标签
y_train = np_utils.to_categorical(y_train,4)#训练集标签one-hot编码
需要注意的是此时训练集的形状是(1200,100),且需要将其输入一维CNN,因此对其进行维度转换并添加一个维度。
卷积输入可以理解为(样本数量,特征长度,特征数量),根据这个理解维度转换及添加。
x_train = np.transpose(x_train)#shape从(1200,240)-->(240, 1200)
x_train = np.reshape(x_train, (240,1200,1))#添加一个维度,shape从(240,1200)-->(240,1200,1)
3.创建网络
这里搭建一个简单的CNN网络用于分类,基于tensorflow框架搭建CNN网络,使用softmax函数作为分类函数,adam作为优化器,交叉熵函数作为损失函数,准确率作为评价指标,训练100个epoch。
使用summary函数查看模型结构。
可以看到搭建了两层卷积且每层卷积后跟随最大池化层,然后使用flatten进行展平并进行分类。
4.模型训练与结果可视化
模型训练与分类。
使用history保存模型训练中的各种信息,'work.fit’训练模型,'work.evaluate’为测试模型在测试集上的效果。
history = work.fit(x_train, y_train,epochs=100,batch_size=16,validation_data = (x_valid,y_valid))
result2 = work.evaluate(x_test, y_test)
绘制训练集与验证集损失函数与准确率图像。下图分别为训练集与验证机准确率及损失函数变化曲线,可以看到随着epoch的增加,损失函数曲线逐渐收敛。
5.代码使用
获取代码后仅需要更改98.mat、106.mat、119.mat、131.mat四个文件的地址为你电脑上的地址即可运行。
fault_0 = read_mat(r'E:\98.mat',1,0,3,120000,1200,100,0)
# 关注VX公众号:慢慢的不急 回复cwru_cnn获取代码
fault_1 = read_mat(r'E:\106.mat',1,0,3,120000,1200,100,1)
fault_2 = read_mat(r'E:\119.mat',1,0,3,120000,1200,100,2)
fault_3 = read_mat(r'E:\131.mat',1,0,3,120000,1200,100,3)
6.使用的包版本及python环境
tensorflow-gpu 2.6.0
scipy 1.10.1
python 3.8.19
matplotlib 3.5.3
numpy 1.19.5
scikit-learn 1.3.0
keras 2.6.0
7.代码获取
回复cwru_cnn获取代码。免费获取。