系列文章
手把手教你:基於粒子群優化算法(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分以上。
五、完整代碼地址
由於項目代碼量和數據集較大,感興趣的同學可以下載完整代碼,使用過程中如遇到任何問題可以在評論區評論或者私信我,我都會一一解答。
完整代碼下載:
【代碼分享】手把手教你:基於深度學習的滾動軸承故障診斷