Python軸承故障診斷 (四)基于EMD-CNN的故障分類

目錄

前言

1?經驗模態分解EMD的Python示例

2?軸承故障數據的預處理

2.1 導入數據

2.2 制作數據集和對應標簽

2.3 故障數據的EMD分解可視化

2.4 故障數據的EMD分解預處理

3?基于EMD-CNN的軸承故障診斷分類

3.1?訓練數據、測試數據分組,數據分batch

3.2 定義EMD-VGG1d網絡模型

3.3 設置參數,訓練模型

往期精彩內容:

Python-凱斯西儲大學(CWRU)軸承數據解讀與分類處理

Python軸承故障診斷 (一)短時傅里葉變換STFT

Python軸承故障診斷 (二)連續小波變換CWT

Python軸承故障診斷 (三)經驗模態分解EMD

前言

本文基于凱斯西儲大學(CWRU)軸承數據,進行經驗模態分解EMD的介紹與數據預處理,最后通過Python實現EMD-CNN對故障數據的分類。凱斯西儲大學軸承數據的詳細介紹可以參考下文:

Python-凱斯西儲大學(CWRU)軸承數據解讀與分類處理

經驗模態分解EMD的原理可以參考如下:? ?

Python軸承故障診斷 (三)經驗模態分解EMD

1?經驗模態分解EMD的Python示例

第一步,Python 中 EMD包的下載安裝:

# 下載
pip install EMD-signal# 導入
from PyEMD import EMD

切記,很多同學安裝失敗,不是 pip install EMD,也不是pip install PyEMD, 如果 pip list 中 已經有?emd,emd-signal,pyemd包的存在,要先 pip uninstall 移除相關包,然后再進行安裝。

第二步,導入相關包

importnumpyasnp
from PyEMD import EMD
importmatplotlib.pyplotasplt
importmatplotlib
matplotlib.rc("font", family='Microsoft YaHei')

第三步,生成一個信號示例

t = np.linspace(0, 1, 1000)
signal = np.sin(11*2*np.pi*t*t) + 6*t*t

第四步,創建EMD對象,進行分解

emd = EMD()# 對信號進行經驗模態分解IMFs = emd(signal)

第五步,繪制原始信號和每個本征模態函數(IMF)

plt.figure(figsize=(15,10))plt.subplot(len(IMFs)+1, 1, 1)plt.plot(t, signal, 'r')plt.title("原始信號")for num, imf in enumerate(IMFs):plt.subplot(len(IMFs)+1, 1, num+2)plt.plot(t, imf)plt.title("IMF "+str(num+1))plt.show()

2?軸承故障數據的預處理

2.1 導入數據

參考之前的文章,進行故障10分類的預處理,凱斯西儲大學軸承數據10分類數據集:

train_set、val_set、test_set 均為按照7:2:1劃分訓練集、驗證集、測試集,最后保存數據

上圖是數據的讀取形式以及預處理思路

2.2 制作數據集和對應標簽

第一步, 生成數據集

第二步,制作數據集和標簽

# 制作數據集和標簽
import torch# 這些轉換是為了將數據和標簽從Pandas數據結構轉換為PyTorch可以處理的張量,
# 以便在神經網絡中進行訓練和預測。def make_data_labels(dataframe):'''參數 dataframe: 數據框返回 x_data: 數據集     torch.tensory_label: 對應標簽值  torch.tensor'''# 信號值x_data = dataframe.iloc[:,0:-1]# 標簽值y_label = dataframe.iloc[:,-1]x_data = torch.tensor(x_data.values).float()y_label = torch.tensor(y_label.values, dtype=torch.int64)  # 指定了這些張量的數據類型為64位整數,通常用于分類任務的類別標簽return x_data, y_label# 加載數據
train_set = load('train_set')
val_set = load('val_set')
test_set = load('test_set')# 制作標簽
train_xdata, train_ylabel = make_data_labels(train_set)
val_xdata, val_ylabel = make_data_labels(val_set)
test_xdata, test_ylabel = make_data_labels(test_set)
# 保存數據
dump(train_xdata, 'trainX_1024_10c')
dump(val_xdata, 'valX_1024_10c')
dump(test_xdata, 'testX_1024_10c')
dump(train_ylabel, 'trainY_1024_10c')
dump(val_ylabel, 'valY_1024_10c')
dump(test_ylabel, 'testY_1024_10c')

2.3 故障數據的EMD分解可視化

選擇正常信號和?0.021英寸內圈、滾珠、外圈故障信號數據來做對比

第一步,導入包,讀取數據

import numpy as np
from scipy.io import loadmat
import numpy as np
from scipy.signal import stft
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc("font", family='Microsoft YaHei')# 讀取MAT文件  
data1 = loadmat('0_0.mat')  # 正常信號
data2 = loadmat('21_1.mat') # 0.021英寸 內圈
data3 = loadmat('21_2.mat') # 0.021英寸 滾珠
data4 = loadmat('21_3.mat') # 0.021英寸 外圈
# 注意,讀取出來的data是字典格式,可以通過函數type(data)查看。

第二步,數據集中統一讀取?驅動端加速度數據,取一個長度為1024的信號進行后續觀察和實驗

# DE - drive end accelerometer data 驅動端加速度數據
data_list1 = data1['X097_DE_time'].reshape(-1)
data_list2 = data2['X209_DE_time'].reshape(-1)  
data_list3 = data3['X222_DE_time'].reshape(-1)
data_list4 = data4['X234_DE_time'].reshape(-1)
# 劃窗取值(大多數窗口大小為1024)
time_step= 1024
data_list1 = data_list1[0:time_step]
data_list2 = data_list2[0:time_step]
data_list3 = data_list3[0:time_step]
data_list4 = data_list4[0:time_step]

第三步,進行數據可視化

plt.figure(figsize=(20,10))
plt.subplot(2,2,1)
plt.plot(data_list1)
plt.title('正常')
plt.subplot(2,2,2)
plt.plot(data_list2)
plt.title('內圈')
plt.subplot(2,2,3)
plt.plot(data_list3)
plt.title('滾珠')
plt.subplot(2,2,4)
plt.plot(data_list4)
plt.title('外圈')
plt.show()

第四步,首先對正常數據進行EMD分解

import numpy as np
import matplotlib.pyplot as plt
from PyEMD import EMDt = np.linspace(0, 1, time_step)
data = np.array(data_list1)
# 創建 EMD 對象
emd = EMD()# 對信號進行經驗模態分解
IMFs = emd(data)# 繪制原始信號和每個本征模態函數(IMF)
plt.figure(figsize=(15,10))
plt.subplot(len(IMFs)+1, 1, 1)
plt.plot(t, data, 'r')
plt.title("Original signal", fontsize=10)for num, imf in enumerate(IMFs):plt.subplot(len(IMFs)+1, 1, num+2)plt.plot(t, imf)plt.title("IMF "+str(num+1), fontsize=10)# 增加第一排圖和第二排圖之間的垂直間距
plt.subplots_adjust(hspace=0.4, wspace=0.2)
plt.show()

其次,內圈故障EMD分解:

然后,滾珠故障EMD分解:

最后,外圈故障EMD分解:

注意,在信號的制作過程中,信號長度的選取比較重要,選擇信號長度為1024,既能滿足信號在時間維度上的分辨率,也能在后續的EMD分解中分解出數量相近的IMF分量,為進一步做故障模式識別打下基礎。

2.4 故障數據的EMD分解預處理

對于EMD分解出的IMF分量個數,并不是所有的樣本信號都能分解出8個分量,需要做一下定量分析:

import numpy as np
from PyEMD import EMD# 加載訓練集
train_xdata = load('trainX_1024_10c')
data = np.array(train_xdata)# 創建 EMD 對象
emd = EMD()print("測試集:", len(data))
count_min = 0
count_max = 0
count_7 = 0
# 對數據進行EMD分解
for i in range(1631):imfs = emd(data[i], max_imf=8)  # max_imf=8if len(imfs) > 8 :count_max += 1elif len(imfs) < 7:count_min += 1elif len(imfs) == 7:count_7 += 1print("分解結果IMF大于8:", count_max)
print("分解結果IMF小于7:", count_min)
print("分解結果IMF等于7:", count_7)

由結果可以看出,大部分信號樣本 都分解出8個分量,將近1/3的信號分解的不是8個分量。EMD設置不了分解出模態分量的數量(函數自適應),為了使一維信號分解,達到相同維度的分量特征,有如下3種處理方式:

  • 刪除分解分量不統一的樣本(少量存在情況可以采用);

  • 對于分量個數少的樣本采用0值或者其他方法進行特征填充,使其對齊其他樣本分量的維度(向多兼容);

  • 合并分量數量多的信號(向少兼容);

本文采用第二、三條結合的方式進行預處理,即刪除分量小于7的樣本,對于分量大于7的樣本,把多余的分量進行合并,使所有信號的分量特征保持同樣的維度。

3?基于EMD-CNN的軸承故障診斷分類

下面基于EMD分解后的軸承故障數據,通過CNN進行一維卷積作為的分類方法進行講解:

3.1?訓練數據、測試數據分組,數據分batch

import torch
from joblib import dump, load
import torch.utils.data as Data
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
# 參數與配置
torch.manual_seed(100)  # 設置隨機種子,以使實驗結果具有可重復性
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 有GPU先用GPU訓練# 加載數據集
def dataloader(batch_size, workers=2):# 訓練集train_xdata = load('trainX_1024_10c')train_ylabel = load('trainY_1024_10c')# 驗證集val_xdata = load('valX_1024_10c')val_ylabel = load('valY_1024_10c')# 測試集test_xdata = load('testX_1024_10c')test_ylabel = load('testY_1024_10c')# 加載數據train_loader = Data.DataLoader(dataset=Data.TensorDataset(train_xdata, train_ylabel),batch_size=batch_size, shuffle=True, num_workers=workers, drop_last=True)val_loader = Data.DataLoader(dataset=Data.TensorDataset(val_xdata, val_ylabel),batch_size=batch_size, shuffle=True, num_workers=workers, drop_last=True)test_loader = Data.DataLoader(dataset=Data.TensorDataset(test_xdata, test_ylabel),batch_size=batch_size, shuffle=True, num_workers=workers, drop_last=True)return train_loader, val_loader, test_loaderbatch_size = 32
# 加載數據
train_loader, val_loader, test_loader = dataloader(batch_size)

3.2 定義EMD-VGG1d網絡模型

3.3 設置參數,訓練模型

200個epoch,準確率將近96%,用淺層的VGG效果明顯,繼續調參可以進一步提高分類準確率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211737.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211737.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211737.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

D : DS查找——折半查找求平方根

Description 假定輸入y是整數&#xff0c;我們用折半查找來找這個平方根。在從0到y之間必定有一個取值是y的平方根&#xff0c;如果我們查找的數x比y的平方根小&#xff0c;則x2<y&#xff0c;如果我們查找的數x比y的平方根大&#xff0c;則x2>y&#xff0c;我們可以據此…

stu05-前端的幾種常用開發工具

前端的開發工具有很多&#xff0c;可以說有幾十種&#xff0c;包括記事本都可以作為前端的開發工具。下面推薦的是常用的幾種前端開發工具。 1.DCloud HBuilder&#xff08;輕量級&#xff09; HBuilder是DCloud&#xff08;數字天堂&#xff09;推出的一款支持HTML5的web開發…

硬件開發筆記(十四):RK3568底板電路LVDS模塊、MIPI模塊電路分析、LVDS硬件接口、MIPI硬件接口詳解

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134634186 紅胖子網絡科技博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬…

linux 關于$-的解釋(帖子搜索合集)

在學習Linux的時候&#xff0c;今天遇到了$-&#xff0c;什么意思呢&#xff1f;網上搜索了一些帖子&#xff1a; 帖子1&#xff1a; linux命令 $- 是什么意思 $- 是什么意思&#xff1f;有什么用&#xff1f;可以判斷什么交互式shell&#xff1f; $-記錄著當前設置的shell…

軟考高級備考-系統架構師(機考后新版教材的備考過程與資料分享)

軟考高級-系統架構設計師 考試復盤1.考試結果2.備考計劃3.個人心得 資料分享 考試復盤 1.考試結果 三科壓線過&#xff0c;真是太太太太太太太幸運了。上天對我如此眷顧&#xff0c;那不得不分享下我的備考過程以及一些備考資料&#xff0c;幫助更多小伙伴通過考試。 2.備考…

time模塊(python)

一.sleep休眠 [rootrhel8 day04]# vim demo01_time.py import time def banzhuan():print("搬磚")time.sleep(3.5) #讓程序休眠3.5秒print("結束")banzhuan()[rootrhel8 day04]# python3 demo01_time.py 搬磚 結束運行時&#xff0c;會發現程序中間暫停…

【3DsMax】制作簡單的骨骼動畫

效果 步驟 首先準備4個板子模型展開放置好 添加一個4段的骨骼 選中其中的一塊板子添加蒙皮命令 在蒙皮的參數面板中&#xff0c;設置每塊板子對應哪塊骨骼 設置好后你可以發現此時就已經可以通過骨骼來控制模型了 接下來就可以制作動畫 點擊左下角“時間配置”按鈕 設置一下動…

HarmonyOS--ArkTS(1)--基本語法(1)

目錄 基本語法概述 聲明式UI描述 自定義組件 創建自定義組件 自定義組件的結構--struct &#xff0c;Component&#xff0c;build()函數 生命周期 基本語法概述 裝飾器&#xff1a; 用于裝飾類、結構、方法以及變量&#xff0c;并賦予其特殊的含義。如上述示例中Entry、C…

VSCode安裝與使用

VS Code 安裝及使用 1、下載 進入VS Code官網&#xff1a;地址&#xff0c;點擊 DownLoad for Windows下載windows版本 注&#xff1a; Stable&#xff1a;穩定版Insiders&#xff1a;內測版 2、安裝 雙擊安裝包&#xff0c;選擇我同意此協議&#xff0c;再點擊下一步 選擇你…

SQL Server查詢計劃(Query Plan)——SQL處理過程

6. 查詢計劃(Query Plan) 6.1. SQL處理過程 就SQL語句的處理過程而言,各關系庫間大同小異,尤其是商業庫之間實現機制和細節差別更小些,其功能及性能支持方面也更加強大和完善。SQL Server作為商業庫中的后起之秀,作為SQL語句處理過程的主要支撐和保障,其優化器及相關機…

【Vulnhub 靶場】【hacksudo: ProximaCentauri】【簡單 - 中等】【20210608】

1、環境介紹 靶場介紹&#xff1a;https://www.vulnhub.com/entry/hacksudo-proximacentauri,709/ 靶場下載&#xff1a;https://download.vulnhub.com/hacksudo/hacksudo-ProximaCentauri.zip 靶場難度&#xff1a;簡單 - 中等 發布日期&#xff1a;2021年06月08日 文件大小&…

第9節:Vue3 指令

如何在UniApp中使用Vue3的指令&#xff1a; <template> <view> <!-- 使用指令 --> <text v-show"isVisible" click"toggleVisibility">點擊隱藏/顯示</text> <button v-on:click"incrementCount">點擊…

【LeetCode:70. 爬樓梯 | 遞歸 -> 記憶化搜索 -> DP】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

【圖片版】計算機組成原理考前復習題【第3章 存儲系統-2(Cache)】

目錄 前言 考前復習題&#xff08;必記&#xff09; 結尾 前言 在計算機組成原理的學習過程中&#xff0c;我們深入探索了計算機系統概述這一重要領域。計算機系統作為現代科技的核心&#xff0c;是整個計算機科學的基石。我們將學到的知識與理論轉化為了能夠解決現實問題…

web api性能測試使用wrk

web api性能測試 這邊簡單的給出shell腳本 注意先安裝&#xff1a;wrk和gnuplot #!/bin/bash# Copyright 2020 Lingfei Kong <colin404foxmail.com>. All rights reserved. # Use of this source code is governed by a MIT style # license that can be found in the…

vue 學習 -- day39(vue3 — reactive 對比 ref)

從定義數據角度對比&#xff1a; ref用來定義&#xff1a;基本類型數據。reactive用來定義&#xff1a;對象&#xff08;或數組&#xff09;類型數據。備注&#xff1a;ref也可以用來定義對象&#xff08;或數組&#xff09;類型數據, 它內部會自動通過reactive轉為代理對象。從…

如何防止惡意調用和攻擊對抖音商品詳情API的影響?

防止惡意調用和攻擊對抖音商品詳情API的影響是開發者和平臺必須關注的問題。惡意調用和攻擊可能導致服務中斷、數據泄露或其他安全問題&#xff0c;對平臺和用戶造成損失。本文將介紹一些常見的惡意調用和攻擊方式&#xff0c;并提出相應的防范措施&#xff0c;以確保抖音商品詳…

JavaScript函數概念、聲明、調用

JavaScript函數是一段可以重復使用的代碼塊&#xff0c;用于執行特定的任務。函數封裝了一定的邏輯&#xff0c;可以接收輸入參數并返回結果&#xff0c;使得代碼更加模塊化&#xff0c;可讀性更高。 函數聲明可以使用function關鍵字來創建&#xff0c;通常包括函數名、參數列…

python畫動漫形象(魔法少女小圓曉美焰,super beautiful)

1.源代碼 import turtle as te import time WriteStep 15 # 貝塞爾函數的取樣次數 Speed 5 Width 600 # 界面寬度 Height 500 # 界面高度 Xh 0 # 記錄前一個貝塞爾函數的手柄 Yh 0 def Bezier(p1, p2, t): # 一階貝塞爾函數 return p1 * (1 - t) p2 * t def Bezier_2(x1…

stu06-VSCode里的常用快捷鍵

Alt Z&#xff1a;文字自動換行。當一行的文字太長時&#xff0c;可以使用。或者查看→自動換行Alt Shift ↓ &#xff1a;快速復制當前行到下一行Alt Shift ↑ &#xff1a;快速復制當前行到上一行Alt B&#xff1a;在默認瀏覽器中打開當前.html文件Ctrl Enter&#xf…