系列文章
手把手教你:玩转图像分类和目标检测系统
手把手教你:图像识别的垃圾分类系统
手把手教你:基于粒子群优化算法(PSO)优化卷积神经网络(CNN)的文本分类
一、项目简介
本文主要介绍如何使用python搭建:一个基于深度学习的滚动轴承故障诊断系统
项目中涉及使用了多种方法对比检测结果,包括:
- 传统机器学习方法:随机森林
- 深度学习方法:CNN
- 增加残差模块后的深度学习方法:CNN+ResBlock
如各位童鞋需要更换训练数据,完全可以根据源码将图像和标注文件更换即可直接运行。
博主也参考过网上故障检测的相关文章,但大多是理论大于方法。很多同学肯定对原理不需要过多了解,只需要搭建出一个基于深度学习的轴承故障预测系统即可。
也正是因为我发现网上大多的帖子只是针对原理进行介绍,功能实现的相对很少。
如果您有以上想法,那就找对地方了!
不多废话,直接进入正题!
二、数据介绍
本次项目的数据是使用的凯斯西储大学(Case Western Reserve University)轴承数据中心的开源数据集。
数据文件采用Matlab格式。每个文件都包含风扇和驱动端振动数据以及电机转速。对于所有文件,变量名称中的以下项表示:
- DE - 驱动端加速计数据
- FE - 风扇端加速计数据
- BA - 基础加速计数据
- time - 时间序列数据
- RPM- 测试期间的转速
2.1 故障类型图示
2.2 数据图示
2.3 查看单个数据文件情况
2.4 数据分布情况
博主对:
- 正常
- 内圈故障
- 外圈故障
- 滚动体故障
四种不同情况下轴承的数据分布进行了可视化展示,由于图示较多,这里只展示内圈故障的一个文件的数据分布情况,其他情况感兴趣的同学可以下载完整代码运行看看。
三、数据预处理
通过可视化观察发现数据波长周期基本上为100-200左右,博主这边使用1000作为采样长度,对所有轴承数据进行采样,并构建label。我们这次需要学习并预测的是输入的轴承数据是为:正常、内圈故障、外圈故障、滚动体故障。中哪一类,因此是一个4分类的任务。处理后数据分布如下:
- 正常样本:1696个
- 内圈故障样本:1455个
- 滚动体故障样本:1457个
- 外圈故障样本: 1457个
然后对数据进行采样,保证每类数据1400个。
data_train = np.asarray(data_normal[:1400] + data_inner[:1400] + data_ball[:1400] + data_outer[:1400],dtype = \'float64\')
label = np.asarray(label_normal[:1400] + label_inner[:1400] + label_ball[:1400] + label_outer[:1400],dtype = \'int64\')
print(\"处理后样本shape:\",data_train.shape)
print(\"处理后数据类别分布:\",Counter(label))
# 保存数据
np.save(\"train_data/train_data.npy\",data_train)
np.save(\"train_data/label.npy\",label)
print(\"数据保存成功,位置:/train_data/\")
四、模型训练及评估
4.1 加载数据
def load_data():
# 读取数据
x = np.load(\'train_data/train_data.npy\')
y = np.load(\'train_data/label.npy\')
num = len(Counter(y))
print(\"类别数量为:\", num)
return x, y, num
# 读取数据
data, label, label_count = load_data()
# 生成训练集测试集,70%用作训练,30%用作测试
train_data, train_label, val_data, val_label = create_train_data(data, label, 0.7)
print(\"*\"*10)
print(\"训练集数量:\",len(train_label))
print(\"测试集数量:\",len(val_label))
4.2 随机森林
# 模型参数设置
rfc = RandomForestClassifier(n_estimators = 50,min_samples_split = 5,min_samples_leaf = 4,max_depth = 5)
# 模型准确率和损失值
acc_list = []
loss_list = []
train_acc_list = []
print(\"开始训练\")
for i in range(1,epoch +1):
# 模型训练
rfc.fit(m_train,train_label)
# # 训练集
# y_train = rfc.predict(m_train)
# 测试集
y_pred = np.asarray(rfc.predict(m_val),dtype = \'int64\')
# 计算准确率
acc = round(accuracy_score(val_label, y_pred),3)
# 训练集
y_pred = np.asarray(rfc.predict(m_train),dtype = \'int64\')
# 计算准确率
train_acc = round(accuracy_score(train_label, y_pred),3)
# print(\'测试集准确率:\', round(accuracy_score(val_label, y_pred),3))
acc_list.append(acc)
train_acc_list.append(train_acc)
# 计算损失值
# 使用one-hot编码计算损失值
noe_hot = OneHotEncoder(sparse = False)
y_pred_o = noe_hot.fit_transform(y_pred.reshape(1, -1))
val_label_o = noe_hot.fit_transform(val_label.reshape(1, -1))
# loss = round(log_loss(val_label_o,y_pred_o),3)
# print(\"loss:\",round(log_loss(val_label,y_pred),3))
# loss_list.append(loss)
print(\"完成第\",i,\"轮训练,测试集准确率:\",acc)
4.2.1 模型训练
4.2.2 模型测试
4.3 CNN
构建一个CNN网络,结构如下:
4.3.1 模型训练
4.3.2 模型测试
可以看到,使用原始cnn模型训练后准确率只有83。类标2即“内圈故障”的召回率较低,无法准确有效识别。
4.4 CNN+ResBlock
模型构建:
import n_model as md
import tensorflow as tf
# 模型参数
model_param = {
\"a_shape\": 1000,
\"b_shape\": 2,
\"label_count\": 4,
\"num_b\":5
}
data_shape=(model_param[\'a_shape\'],model_param[\'b_shape\'])
# 模型实例化
model = md.CNN_ResNet_model(model_param[\'label_count\'] , model_param[\'num_b\'] , data_shape=data_shape)
# 使用学习率进行训练
res_model = model.model_create(learning_rate = 1e-4)
# 模型网络结构
print(\"实例化模型成功,网络结构如下:\")
print(res_model.summary())
# 设置模型log输出地址
log_dir = os.path.join(\"logs/ResNet\")
if not os.path.exists(log_dir):
os.mkdir(log_dir)
4.4.1 模型训练
4.4.2 模型测试
可以看到,增加了残差模块的CNN网络已经能准确对不同故障类型进行分类,准确率和召回率均在95分以上。
五、完整代码地址
由于项目代码量和数据集较大,感兴趣的同学可以下载完整代码,使用过程中如遇到任何问题可以在评论区评论或者私信我,我都会一一解答。
完整代码下载:
【代码分享】手把手教你:基于深度学习的滚动轴承故障诊断
来源:https://www.cnblogs.com/dawudexiaowu/p/16172915.html
本站部分图文来源于网络,如有侵权请联系删除。