赞
踩
1D CNN 处理一维信号具有显著优势,已在很多领域得到初步应用:
心电图监测:将1DCNN应用于心脏病监测,其方法是针对每一个心脏病人的,即对于每个心律失常患者使用该患者特有的训练数据,专门训练出一个紧凑的1DCNN对心脏跳动数据进行实时监测,并分为起源于窦性模式的搏动、室上异位搏动、室性异位搏动、融合搏动和不可归类的节拍等5个心脏跳动状态。
建筑结构健康监测:有学者将1DCNN应用于建筑结构健康监测,通过在5m×6m的试验结构件上安装30个加速度计,每个加速度计负责监测其所属区域,结构的损失通过松动连接螺栓来模拟,该基于1DCNN的损伤监测方法可以在大量的单损伤和双损伤情况下进行性能测试,均取得了优异的监测效果;有学者将1DCNN和无线传感网络相结合,使其能够分析由三轴无线传感器测得的加速度信号,这样做是为了确定损伤敏感特征更加明显的方向。针对实验室结构引入的多种损伤场景,对改进的损伤检测技术进行了测试,试验结果表明,该方法能够从结构的环境振动响应中直接检测和定位损伤。
人体运动识别:有学者采用1DCNN提取可穿戴设备信号中人体运动特征,对人体不同的运动如骑车、打电话、吃早饭等进行准确识别;有学者利用三轴加速度计采集的数据,先经过巴特沃斯滤波器进行低通滤波,然后直接输入1DCNN进行人体行为识别,在11种人体活动的识别中平均准确率达到了98.7%。
语音识别:有学者针对2DCNN不能很好地反映出语音信号的一维特性,提出采用1DCNN进行车载语音识别,对比试验结果表明,1DCNN的识别准确率比2DCNN提高了10%—20%,在噪声环境下的泛化性能也明显优于后者。
鉴于此,提出一种基于1D-CNN的轴承故障诊断方法,并进行了TSNE特征可视化,运行环境为Python,采用部分西储大学轴承数据集,采用模块如下:
- import scipy.io # To use the '.mat' files
- import seaborn as sns
- import numpy as np
- import pandas as pd
- import os
- import matplotlib.pyplot as plt
- from tensorflow.keras.models import Sequential,Model
- from tensorflow.keras.layers import Input,Dense, Dropout, Flatten
- from tensorflow.keras.layers import Conv2D, MaxPooling2D,Conv1D,MaxPooling1D
- from sklearn.metrics import confusion_matrix
- from sklearn.manifold import TSNE
重要模块版本如下:
tensorflow版本2.8.0
keras版本2.8.0
sklearn版本1.0.2
部分代码如下:
- #############################################################CWRU_Bearing_1D_CNN基于1D-CNN德轴承故障识别
- import scipy.io
- import seaborn as sns
- import numpy as np
- import pandas as pd
- import os
- import matplotlib.pyplot as plt
- #加载轴承振动数据前处理生成的0hp_all_faults.csv文件
- df = pd.read_csv('0hp_all_faults.csv')
-
- from sklearn.preprocessing import LabelEncoder
- from tensorflow.keras.utils import to_categorical
-
- win_len=784 #窗口长度
- stride=300 #移动步长
-
- #设置训练数据X及标签Y
- X=[]
- Y=[]
-
-
- for k in df['fault'].unique():
-
- df_temp_2 = df[df['fault']==k]
-
- for i in np.arange(0,len(df_temp_2)-(win_len),stride):
- temp = df_temp_2.iloc[i:i+win_len,:-1].values
- temp = temp.reshape((1,-1))
- X.append(temp)
- Y.append(df_temp_2.iloc[i+win_len,-1])
-
- X=np.array(X)
- X=X.reshape((X.shape[0],-1,1))
- #X = np.repeat(X, 3, axis=3) # To repeat into 3 chanel format
-
-
- Y=np.array(Y)
- encoder= LabelEncoder()
- encoder.fit(Y)
- encoded_Y = encoder.transform(Y)
- OHE_Y = to_categorical(encoded_Y)
-
- X.shape
- #训练集和测试集划分
- from sklearn.model_selection import train_test_split
- X_train,X_test,y_train,y_test = train_test_split(X,OHE_Y,test_size=0.3,shuffle=True)
-
- from tensorflow.keras.models import Sequential,Model
- from tensorflow.keras.layers import Input,Dense, Dropout, Flatten
- from tensorflow.keras.layers import Conv2D, MaxPooling2D,Conv1D,MaxPooling1D
-
- #构建1D-CNN网络
- no_classes = len(df['fault'].unique())
-
- cnn_model = Sequential()
- cnn_model.add(Conv1D(filters=64, kernel_size=100, activation='relu', input_shape=(X.shape[1],X.shape[2])))
- cnn_model.add(Conv1D(filters=32, kernel_size=50, activation='relu'))
-
- cnn_model.add(MaxPooling1D(pool_size=4))
- cnn_model.add(Flatten())
- cnn_model.add(Dense(100, activation='relu'))
-
-
- cnn_model.add(Dense(no_classes, activation='softmax'))
-
- cnn_model.summary()
-
- cnn_model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'])
-
- #开始训练网络
- batch_size =300
- epochs = 10
- history = cnn_model.fit(X_train, y_train, batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(X_test,y_test),shuffle=True)
-
- #绘制混淆矩阵
- def inv_Transform_result(y_pred):
- y_pred = y_pred.argmax(axis=1)
- y_pred = encoder.inverse_transform(y_pred)
- return y_pred
-
-
-
- y_pred=cnn_model.predict(X_test)
-
-
- Y_pred=inv_Transform_result(y_pred)
- Y_test = inv_Transform_result(y_test)
-
-
-
-
- from sklearn.metrics import confusion_matrix
-
-
- plt.figure(figsize=(10,10))
- cm = confusion_matrix(Y_test, Y_pred,normalize='true')
- f = sns.heatmap(cm, annot=True,xticklabels=encoder.classes_,yticklabels=encoder.classes_)
- plt.show()
-
- dummy_cnn = Model(inputs=cnn_model.input,outputs=cnn_model.layers[5].output)
- y_viz = dummy_cnn.predict(X_train)
-
- # TSNE可视化
- from sklearn.manifold import TSNE
-
- X_t_sne = TSNE(n_components=2, learning_rate='auto',verbose=1, perplexity=40, n_iter=300).fit_transform(y_viz)
-
- tSNEdf = pd.DataFrame(data = X_t_sne, columns = ['T-SNE component 1', 'T-SNE component 2'])
-
- tSNEdf['Fault']=inv_Transform_result(y_train)
-
-
- #绘制第一主成分和第二主成分
- fig, ax = plt.subplots(figsize=(10,10))
- sns.scatterplot(x=tSNEdf['T-SNE component 1'],y=tSNEdf['T-SNE component 2'],hue='Fault',
- data=tSNEdf,
- legend="full",
- alpha=0.3)
- plt.show()

部分出图如下:
完整代码:Python环境下基于1D-CNN的轴承故障诊断及TSNE特征可视化
工学博士,担任《Mechanical System and Signal Processing》审稿专家,担任《中国电机工程学报》优秀审稿专家,《控制与决策》,《系统工程与电子技术》,《电力系统保护与控制》,《宇航学报》等EI期刊审稿专家。
擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。