基于卷积神经网络(CNN)的滚动轴承故障诊断

基于卷积神经网络(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获取代码。免费获取。

在MATLAB中,我们可以使用深度学习库如Deep Learning Toolbox来编写基于卷积神经网络(CNN)的滚动轴承故障诊断代码。以下是一个简化的示例,展示如何构建一个基本的CNN模型并进行预测: ```matlab % 导入所需的工具箱 import deepLearning.* import neuroboros.* % 加载数据集 (假设你的数据存储在VariableSpeedBearingData.mat文件) load('VariableSpeedBearingData.mat'); % 数据预处理:将信号转换成适合CNN的二维数组(如果需要) data = extract_features(X, fs); % 提取特征函数自行定义 data = imresize(data, [height, width]); % 根据需要调整图像尺寸 % 划分训练集和测试集 [trainImages, trainLabels, testImages, testLabels] = splitEachLabel(data, labels, 'HoldOut', 0.2); % 定义CNN结构 layers = [ imageInputLayer([height width channels]) convolution2dLayer(filterSize, numFilters, 'Padding', 'same') % 例如filterSize=3, numFilters=64 batchNormalizationLayer reluLayer maxPooling2dLayer(poolSize, 'Stride', 2) % 例如poolSize=2 fullyConnectedLayer(numClasses) % numClasses取决于故障类别数 softmaxLayer classificationLayer]; % 编译模型 options = trainingOptions('adam', 'MaxEpochs', epochs, 'MiniBatchSize', miniBatchSize); net = trainNetwork(trainImages, trainLabels, layers, options); % 预测测试集 predictedProbabilities = classify(net, testImages); predictedClasses = categorical(predictedProbabilities(:, 1)); % 计算故障概率 probabilities = predictedProbabilities; [~, failurePredictions] = max(probabilities, [], 2); failureProbability = sum(failurePredictions == 1) / numel(testLabels); % 输出结果 disp("预测的滚动轴承故障概率: " + failureProbability);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢慢的不急

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值