一、项目简介本文主要介绍如何使用python搭建:一个基于深度学习的滚动轴承故障诊断系统 项目中涉及使用了多种方法对比检测结果,包括:
如各位童鞋需要更换训练数据,完全可以根据源码将图像和标注文件更换即可直接运行。 博主也参考过网上故障检测的相关文章,但大多是理论大于方法。很多同学肯定对原理不需要过多了解,只需要搭建出一个基于深度学习的轴承故障预测系统即可。 也正是因为我发现网上大多的帖子只是针对原理进行介绍,功能实现的相对很少。 如果您有以上想法,那就找对地方了! 不多废话,直接进入正题! 二、数据介绍本次项目的数据是使用的凯斯西储大学(Case Western Reserve University)轴承数据中心的开源数据集。 数据文件采用Matlab格式。每个文件都包含风扇和驱动端振动数据以及电机转速。对于所有文件,变量名称中的以下项表示:
2.1 故障类型图示2.2 数据图示2.3 查看单个数据文件情况2.4 数据分布情况博主对:
四种不同情况下轴承的数据分布进行了可视化展示,由于图示较多,这里只展示内圈故障的一个文件的数据分布情况,其他情况感兴趣的同学可以下载完整代码运行看看。 三、数据预处理通过可视化观察发现数据波长周期基本上为100-200左右,博主这边使用1000作为采样长度,对所有轴承数据进行采样,并构建label。我们这次需要学习并预测的是输入的轴承数据是为:正常、内圈故障、外圈故障、滚动体故障。中哪一类,因此是一个4分类的任务。处理后数据分布如下:
然后对数据进行采样,保证每类数据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 mdimport 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分以上。 五、完整代码地址 |
|