格拉姆角場(GAF)原理與實戰(zhàn):時序信號轉(zhuǎn)圖像用于軸承故障診斷
1. 項目概述從時序信號到圖像識別的故障診斷新思路格拉姆角場Gramian Angular Field GAF結(jié)合軸承故障診斷這個組合在工業(yè)預測性維護領域已經(jīng)不算新鮮但對于剛接觸的同學來說看到東南大學相關的代碼和數(shù)據(jù)集第一反應可能還是有點懵好好的振動信號為什么要費勁轉(zhuǎn)換成圖像直接用深度學習模型處理一維時序數(shù)據(jù)不行嗎我最初也有這個疑問。直到在實際項目中面對來自不同工況、帶有強噪聲的軸承振動數(shù)據(jù)傳統(tǒng)時頻分析方法比如FFT、小波變換的特征提取穩(wěn)定性遇到了瓶頸而基于GAF的方法展現(xiàn)出了獨特的優(yōu)勢。簡單來說GAF的核心思想是將一維時間序列通過坐標變換映射到極坐標系再通過三角運算構造出一種類圖像矩陣表示。這種表示方法巧妙地將時間序列的時序依賴性和數(shù)值關系“凝固”在一張圖上使得后續(xù)可以借助在圖像識別領域非常成熟的卷積神經(jīng)網(wǎng)絡CNN來進行特征學習和分類。這對于軸承故障診斷而言相當于開辟了一條“降維打擊”的新路徑——我們不再需要手工設計復雜的時域、頻域、時頻域特征而是讓CNN從這種“翻譯”過來的圖像中自動學習故障的視覺模式。東南大學在機械故障診斷領域的研究一直走在前列其公開的代碼和數(shù)據(jù)集為初學者和研究者提供了極佳的學習范本。本次解讀聚焦于“數(shù)據(jù)集解讀”部分因為這是整個流程的基石。如果數(shù)據(jù)都理解錯了后面的模型構建、訓練調(diào)參都是空中樓閣。我們將深入拆解代碼中數(shù)據(jù)加載、預處理、以及最關鍵的一步——如何將原始的振動信號樣本轉(zhuǎn)換為GAF圖像的全過程并分享我在復現(xiàn)和擴展過程中踩過的坑和總結(jié)的經(jīng)驗。2. 核心思路與方案選型為什么是GAF在深入代碼之前我們必須先搞清楚方案選型背后的邏輯。軸承故障診斷本質(zhì)上是一個模式識別問題我們需要從傳感器采集的振動信號中區(qū)分出“正?!薄ⅰ皟?nèi)圈故障”、“外圈故障”、“滾動體故障”等不同狀態(tài)。傳統(tǒng)方法流程固定原始信號 - 數(shù)字濾波降噪 - 特征提取如均方根、峭度、頻譜峰值 - 特征選擇/降維 - 輸入分類器如SVM、隨機森林。這個流程的瓶頸在于“特征提取”環(huán)節(jié)。手工設計的特征嚴重依賴專家經(jīng)驗且對于變工況、變負載、強噪聲的場景泛化能力往往不足。深度學習提供了一種端到端的解決方案但直接將一維振動信號喂給1D-CNN或RNN有時難以充分捕捉復雜的時序動態(tài)和長期依賴。這時GAF的優(yōu)勢就體現(xiàn)出來了。它的轉(zhuǎn)換過程可以概括為兩個核心步驟歸一化與極坐標映射將一維時間序列的數(shù)值歸一化到[-1, 1]或[0, 1]區(qū)間然后將每個數(shù)據(jù)點視為在單位圓上的一個點其角度由歸一化后的值通過反余弦函數(shù)決定半徑固定為1或由時間戳決定。這一步將時序信息編碼到了極角中。生成格拉姆矩陣通過計算每兩個點之間的三角和或差的余弦值生成一個格拉姆矩陣。這個矩陣是一個對稱矩陣其元素反映了原始序列中任意兩點之間的時序關系。這個矩陣就可以被視作一張灰度圖像。為什么選擇這個方案保留時序信息與直接將序列排列成圖像不同GAF的轉(zhuǎn)換過程本質(zhì)上是時序相關的矩陣中的每個點都包含了兩個原始時間點之間的關系。適合CNN處理生成的GAF圖像是結(jié)構化的、局域相關的二維數(shù)據(jù)這與CNN擅長的處理對象如圖像完美契合。CNN可以高效地從中提取空間層次化特征。對幅度縮放具有不變性由于先進行了歸一化GAF對信號的整體幅度變化不敏感更關注信號的形狀和相對變化這在工業(yè)環(huán)境中非常實用因為設備負載變化會導致信號幅度整體漂移。在東南大學的代碼實現(xiàn)中通常采用GAF的兩種變體格拉姆角和場GASF和格拉姆角差場GADF。簡單理解GASF使用余弦和圖像更強調(diào)序列的整體趨勢GADF使用正弦差對序列的局部變化和梯度更敏感。代碼中往往會同時生成這兩種圖像或者選擇其中一種作為輸入這需要根據(jù)具體數(shù)據(jù)特性進行實驗。3. 數(shù)據(jù)集深度解讀與預處理實戰(zhàn)拿到一個故障診斷數(shù)據(jù)集絕不能直接扔進模型。正確的打開方式是先像偵探一樣審視它。東南大學常用的數(shù)據(jù)集包括經(jīng)典的CWRU凱斯西儲大學軸承數(shù)據(jù)中心的數(shù)據(jù)也可能是其自有實驗臺的數(shù)據(jù)。我們以CWRU數(shù)據(jù)集為例進行深度解讀因為它的結(jié)構清晰應用廣泛。3.1 數(shù)據(jù)集結(jié)構與物理意義剖析CWRU數(shù)據(jù)集的目錄結(jié)構通常按驅(qū)動端風扇端、故障直徑、負載工況來組織。例如CWRU/ ├── 12k Drive End Bearing Fault Data/ # 12kHz采樣驅(qū)動端數(shù)據(jù) │ ├── Ball007/ # 滾動體故障直徑0.007英寸 │ ├── IR007/ # 內(nèi)圈故障 │ ├── OR007/ # 外圈故障 │ └── Normal/ # 正常狀態(tài) └── 48k Drive End Bearing Fault Data/ # 48kHz采樣數(shù)據(jù)每個子文件夾里是多個.mat文件每個文件對應一次采樣記錄通常包含一個名為DE驅(qū)動端加速度的變量也可能包含F(xiàn)E風扇端和BA基座加速度數(shù)據(jù)。關鍵參數(shù)解讀采樣頻率Fs常見12kHz和48kHz。這決定了信號的最高分析頻率根據(jù)奈奎斯特定理為Fs/2。對于軸承故障特征頻率通常幾百Hz到幾千Hz12kHz通常足夠。故障直徑如0.007、0.014、0.021英寸。故障尺寸直接影響振動信號的沖擊強度和調(diào)制現(xiàn)象。負載如0HP、1HP、2HP、3HP。電機負載不同軸承的受力狀態(tài)不同故障特征頻率的幅值會受負載調(diào)制這是模型泛化能力的重要考驗。代碼中的數(shù)據(jù)加載環(huán)節(jié)通常使用scipy.io.loadmat來讀取.mat文件。這里第一個注意事項就來了一定要確認加載后數(shù)據(jù)的維度和變量名。有時數(shù)據(jù)會被多層嵌套需要用.item()或索引來取出真正的振動信號數(shù)組。import numpy as np from scipy.io import loadmat # 示例加載一個.mat文件 file_path ‘path/to/your/data/Normal_0.mat‘ mat_data loadmat(file_path) # 關鍵查看mat文件中所有變量名 print(mat_data.keys()) # 通常振動數(shù)據(jù)存儲在 ‘DE‘ 這個鍵下 vibration_signal mat_data[‘DE‘].flatten() # 確保是一維數(shù)組 print(f“信號長度{len(vibration_signal)} 采樣頻率假設為 12kHz“)3.2 數(shù)據(jù)切片與樣本構建策略原始數(shù)據(jù)文件往往很長比如12kHz采樣下10秒就是12萬個點我們需要將其切割成多個固定長度的樣本用于訓練和測試。樣本長度segment_length的選擇是一個需要權衡的參數(shù)太短如1024點可能無法包含一個完整的故障沖擊周期信息不充分。太長如8192點或更長計算GAF圖像時矩陣尺寸過大n x n計算和存儲開銷劇增且可能包含過多的冗余信息或多種狀態(tài)的混合。經(jīng)驗值對于CWRU的12kHz數(shù)據(jù)我通常選擇2048或4096個點作為一個樣本。這對應約0.17秒或0.34秒的數(shù)據(jù)足以捕捉到幾次故障沖擊同時矩陣尺寸可控2048x2048的圖像已經(jīng)需要約33MB內(nèi)存存儲為float64通常需要下采樣或使用更小的切片。代碼中的切片操作需要注意重疊問題。為了增加樣本數(shù)量可以采用重疊切片。例如步長stride設為segment_length//2即50%的重疊率。def create_samples(signal, segment_length2048, stride1024): “”“將長序列切割成固定長度的樣本。 Args: signal: 一維振動信號數(shù)組。 segment_length: 每個樣本的長度。 stride: 滑動步長。 Returns: samples: 形狀為 (n_samples, segment_length) 的二維數(shù)組。 ”“” n_samples (len(signal) - segment_length) // stride 1 samples np.zeros((n_samples, segment_length)) for i in range(n_samples): start i * stride end start segment_length samples[i] signal[start:end] return samples注意務必確保每個樣本的標簽是正確的。如果從一個“內(nèi)圈故障”的數(shù)據(jù)文件中切出100個樣本那么這100個樣本的標簽都應該是“內(nèi)圈故障”。在構建最終數(shù)據(jù)集時需要將不同故障類型、不同工況的樣本和標簽分別堆疊起來并記得打亂順序在劃分訓練集和測試集之后打亂而不是之前。3.3 數(shù)據(jù)標準化被忽視的關鍵一步在將樣本送入GAF轉(zhuǎn)換之前對每個樣本進行獨立的標準化至關重要。這是因為GAF的第一步——歸一化到[-1,1]區(qū)間對輸入數(shù)據(jù)的尺度非常敏感。如果不同樣本的絕對幅值差異很大這在變工況數(shù)據(jù)中很常見直接使用全局的歸一化參數(shù)會導致部分樣本的信息被壓縮。正確的做法是對每個樣本進行局部標準化常用方法是減去均值除以標準差Z-score標準化或者最小-最大歸一化到[-1,1]。這樣能保證每個樣本自身都被規(guī)范到相同的尺度突出了其內(nèi)部的相對變化模式這正是GAF想要捕捉的。def normalize_sample(sample, method‘zscore‘): “”“標準化單個樣本。 Args: sample: 一維數(shù)組一個振動信號樣本。 method: ‘zscore‘ 或 ‘minmax‘。 ”“” if method ‘zscore‘: mean np.mean(sample) std np.std(sample) if std 1e-10: # 防止除零 std 1.0 return (sample - mean) / std elif method ‘minmax‘: min_val, max_val np.min(sample), np.max(sample) if max_val - min_val 1e-10: return sample * 0 return 2 * (sample - min_val) / (max_val - min_val) - 1 else: raise ValueError(“Method must be ‘zscore‘ or ‘minmax‘“)4. GAF圖像生成核心代碼逐行解讀這是整個流程的技術核心。我們將結(jié)合代碼詳細解釋每一步的數(shù)學含義和實現(xiàn)細節(jié)。4.1 極坐標映射從數(shù)值到角度假設我們有一個已經(jīng)標準化到[-1, 1]區(qū)間的樣本X {x1, x2, ..., xn}。GAF映射的第一步是計算每個點對應的角度φ。公式為φ_i arccos(x_i), 其中x_i ∈ [-1, 1] 因此φ_i ∈ [0, π]。為什么用反余弦因為它是一個在[-1,1]區(qū)間上單調(diào)遞減的函數(shù)能將數(shù)值唯一地映射到[0, π]的角度空間。同時由于余弦函數(shù)在[0, π]上是單調(diào)的這個映射是可逆的。import numpy as np def to_polar_coordinates(normalized_sample): “”“將歸一化后的樣本轉(zhuǎn)換為極坐標角度。 Args: normalized_sample: 歸一化到[-1,1]的一維數(shù)組。 Returns: phi: 對應的角度數(shù)組范圍[0, pi]。 ”“” # 防止數(shù)值誤差導致歸一化值略微超出[-1,1]范圍 normalized_sample np.clip(normalized_sample, -1, 1) phi np.arccos(normalized_sample) return phi4.2 生成格拉姆矩陣GASF與GADF得到角度數(shù)組φ后我們計算格拉姆矩陣。這里以**格拉姆角和場GASF**為例其元素定義為GASF_ij cos(φ_i φ_j)這個定義可以展開為cos(φ_i)cos(φ_j) - sin(φ_i)sin(φ_j)。注意cos(φ_i)就是我們的原始歸一化值x_i。因此GASF矩陣可以直接通過原始歸一化數(shù)據(jù)計算無需顯式計算角度效率更高GASF X^T · X - sqrt(1 - X^2)^T · sqrt(1 - X^2)其中X是歸一化樣本向量sqrt(1 - X^2)即sin(φ)。格拉姆角差場GADF的定義為GADF_ij sin(φ_i - φ_j)其高效計算方式為GADF sqrt(1 - X^2)^T · X - X^T · sqrt(1 - X^2)def gramian_angular_field(sample, method‘sum‘, scaleNone): “”“計算樣本的格拉姆角場。 Args: sample: 一維數(shù)組一個振動信號樣本建議已歸一化。 method: ‘sum‘ 對應 GASF ‘difference‘ 對應 GADF。 scale: 是否縮放圖像到[0, 255]區(qū)間用于可視化。默認不縮放。 Returns: GAF: 二維矩陣即GAF圖像。 ”“” # 確保輸入是一維且為浮點型 sample sample.astype(np.float64).flatten() n len(sample) # 方法1通過角度計算直觀但稍慢 # phi np.arccos(np.clip(sample, -1, 1)) # if method ‘sum‘: # # GASF # cos_sum np.cos(np.add.outer(phi, phi)) # return cos_sum # else: # # GADF # sin_diff np.sin(np.subtract.outer(phi, phi)) # return sin_diff # 方法2通過三角恒等式高效計算推薦 sample_clipped np.clip(sample, -1, 1) # 計算 sin(phi) sin_phi np.sqrt(1 - sample_clipped ** 2) # 注意這里隱含假設phi在[0, pi]sin(phi)0 if method ‘sum‘: # GASF cos(phi_i phi_j) x_i * x_j - sqrt(1-x_i^2)*sqrt(1-x_j^2) outer_prod np.outer(sample_clipped, sample_clipped) sin_outer np.outer(sin_phi, sin_phi) gaf outer_prod - sin_outer elif method ‘difference‘: # GADF sin(phi_i - phi_j) sqrt(1-x_j^2)*x_i - x_j*sqrt(1-x_i^2) # 利用外積計算 sin_phi^T * X - X^T * sin_phi term1 np.outer(sin_phi, sample_clipped) term2 np.outer(sample_clipped, sin_phi) gaf term1 - term2 else: raise ValueError(“Method must be ‘sum‘ or ‘difference‘“) if scale is not None: # 將GAF值線性縮放到[0, scale]區(qū)間便于保存為圖像 gaf_min, gaf_max gaf.min(), gaf.max() if gaf_max - gaf_min 1e-10: gaf (gaf - gaf_min) * scale / (gaf_max - gaf_min) else: gaf np.zeros_like(gaf) return gaf4.3 圖像下采樣與存儲優(yōu)化直接生成2048x2048的GAF圖像對于大批量訓練來說是巨大的內(nèi)存和計算負擔。一個常見的優(yōu)化技巧是在生成GAF之前先對一維樣本進行下采樣。例如將2048點的樣本通過滑動平均或直接每隔N個點采樣的方式降到更短的序列長度M如64 128 256。這樣生成的GAF圖像尺寸就是M x M大大減少了計算量。from scipy import signal def downsample_sample(sample, target_length256): “”“下采樣樣本到目標長度。 Args: sample: 一維樣本。 target_length: 下采樣后的目標長度。 Returns: 下采樣后的一維數(shù)組。 ”“” original_length len(sample) if original_length target_length: return sample # 方法1簡單的線性插值重采樣 # return np.interp(np.linspace(0, original_length-1, target_length), # np.arange(original_length), sample) # 方法2使用scipy.signal.resample基于FFT更適用于帶限信號 return signal.resample(sample, target_length)存儲格式生成的GAF矩陣是浮點型二維數(shù)組。如果直接保存為.npy文件體積較大。通常有兩種處理方式實時生成在模型訓練的數(shù)據(jù)加載器DataLoader中實時將一批一維樣本轉(zhuǎn)換為GAF圖像。這種方式靈活不占用額外磁盤空間但會增加每個epoch的訓練時間。預處理保存將所有訓練集和測試集的樣本預先轉(zhuǎn)換為GAF圖像并保存為圖像文件如.png.jpg或壓縮的數(shù)組文件如.npz。這種方式訓練速度快但需要大量的磁盤空間。對于256x256的灰度圖保存為uint8的PNG格式每張圖約65KB1萬張圖就是650MB尚可接受。在東南大學的代碼中為了流程清晰和實驗可復現(xiàn)通常采用第二種方式即先預處理生成一個完整的圖像數(shù)據(jù)集。5. 完整數(shù)據(jù)處理管道構建與經(jīng)驗分享將上述所有步驟串聯(lián)起來就構成了從原始.mat文件到最終GAF圖像數(shù)據(jù)集的數(shù)據(jù)處理管道Pipeline。這個管道的健壯性和效率直接影響后續(xù)實驗的順利進行。5.1 管道構建示例下面是一個簡化的端到端管道示例它遍歷指定目錄下的所有.mat文件生成對應標簽的GAF圖像并保存到以故障類別命名的文件夾中。import os import numpy as np from scipy.io import loadmat import cv2 # 用于保存圖像 import argparse def build_gaf_dataset(data_root_dir, output_img_dir, segment_len2048, stride1024, downsampled_len256, gaf_method‘sum‘): “”“構建GAF圖像數(shù)據(jù)集。 Args: data_root_dir: 原始.mat數(shù)據(jù)根目錄子文件夾為不同故障類別。 output_img_dir: 輸出圖像目錄內(nèi)部會按類別創(chuàng)建子文件夾。 segment_len: 樣本切片長度。 stride: 切片步長。 downsampled_len: 下采樣目標長度。 gaf_method: ‘sum‘ (GASF) 或 ‘difference‘ (GADF)。 ”“” # 獲取故障類別子文件夾名 fault_classes [d for d in os.listdir(data_root_dir) if os.path.isdir(os.path.join(data_root_dir, d))] fault_classes.sort() print(f“發(fā)現(xiàn)故障類別{fault_classes}“) for class_idx, class_name in enumerate(fault_classes): class_dir os.path.join(data_root_dir, class_name) output_class_dir os.path.join(output_img_dir, class_name) os.makedirs(output_class_dir, exist_okTrue) mat_files [f for f in os.listdir(class_dir) if f.endswith(‘.mat‘)] print(f“處理類別 ‘{class_name}‘ 共 {len(mat_files)} 個文件?!? sample_count 0 for mat_file in mat_files: file_path os.path.join(class_dir, mat_file) try: mat_data loadmat(file_path) # **關鍵確認數(shù)據(jù)鍵名這里假設為 ‘DE‘** vibration_signal mat_data[‘DE‘].flatten() except Exception as e: print(f“加載文件 {file_path} 失敗{e}“) continue # 1. 創(chuàng)建樣本切片 samples create_samples(vibration_signal, segment_len, stride) # 2. 對每個樣本進行處理 for i, sample in enumerate(samples): # 2.1 樣本標準化 (Z-score) norm_sample normalize_sample(sample, method‘zscore‘) # 2.2 下采樣 (可選但強烈推薦) if downsampled_len and len(norm_sample) downsampled_len: norm_sample downsample_sample(norm_sample, target_lengthdownsampled_len) # 2.3 生成GAF圖像 gaf_matrix gramian_angular_field(norm_sample, methodgaf_method) # 2.4 縮放到[0, 255]并轉(zhuǎn)換為uint8以便保存為圖像 gaf_img ((gaf_matrix 1) / 2 * 255).astype(np.uint8) # 假設GAF值在[-1,1] # 2.5 保存圖像文件名包含類別和索引信息 img_filename f“{class_name}_{sample_count:06d}.png“ img_path os.path.join(output_class_dir, img_filename) cv2.imwrite(img_path, gaf_img) sample_count 1 print(f“ 類別 ‘{class_name}‘ 處理完成生成 {sample_count} 張圖像。“)5.2 實操心得與避坑指南數(shù)據(jù)平衡問題不同故障類別的原始數(shù)據(jù)文件可能數(shù)量不等切片后樣本數(shù)差異可能更大。務必在構建最終數(shù)據(jù)集時檢查各類別的樣本數(shù)量。如果嚴重不平衡需要考慮過采樣如對少數(shù)類樣本進行隨機滑動窗口的多次切片、欠采樣或使用類別權重。GAF圖像的可視化檢查在管道運行后一定要隨機抽查幾張生成的GAF圖像用matplotlib顯示出來看看。正常的、不同故障的GAF圖像應該呈現(xiàn)出不同的紋理模式。如果所有圖像看起來都是模糊一片或噪聲很可能是在數(shù)據(jù)標準化或GAF計算環(huán)節(jié)出了問題。下采樣參數(shù)的權衡downsampled_len是核心超參數(shù)。太小如32會丟失過多細節(jié)太大如512則計算成本高。建議從128或256開始嘗試。下采樣方法也會影響效果scipy.signal.resample比簡單的線性插值更能保留頻域信息。內(nèi)存管理處理大規(guī)模數(shù)據(jù)時避免一次性將所有數(shù)據(jù)加載到內(nèi)存。上述管道是“流式”處理處理一個文件保存一批圖像是更安全的方式。如果使用實時生成策略在DataLoader中要確保轉(zhuǎn)換函數(shù)足夠高效。標簽編碼保存圖像時最好將類別標簽也單獨保存為一個.npy文件或csv文件與圖像路徑對應。更常見的做法是使用深度學習框架如PyTorch的ImageFolder能識別的目錄結(jié)構即每個類別的圖像放在一個子文件夾下框架會自動推斷標簽。GASF vs GADF沒有絕對的好壞。我的經(jīng)驗是對于沖擊特征明顯的故障如點蝕GADF有時能提供更清晰的邊緣信息??梢試L試將兩者作為兩個通道構建一個“2通道圖像”輸入CNN或者分別訓練模型然后集成。6. 常見問題與排查技巧實錄在實際復現(xiàn)和實驗過程中你幾乎一定會遇到下面這些問題。這里記錄了我的排查思路和解決方法。6.1 生成的GAF圖像全是灰色沒有紋理現(xiàn)象保存的PNG圖像看起來是均勻的灰色或者紋理非常微弱??赡茉蚺c排查數(shù)據(jù)標準化錯誤檢查normalize_sample函數(shù)。如果輸入信號本身非常平緩方差很小Z-score標準化后數(shù)值范圍可能仍然很窄比如在[-0.1, 0.1]導致arccos計算后角度變化不大生成的GAF矩陣元素值非常接近。解決打印幾個樣本標準化后的最大值和最小值。也可以嘗試改用最小-最大歸一化到[-1,1]看看是否改善。GAF值縮放錯誤在保存為圖像前需要將GAF矩陣的值線性映射到[0, 255]。如果映射前的GAF矩陣動態(tài)范圍很小映射后就會集中在中灰值附近。解決打印GAF矩陣的min()和max()。對于GASF理論范圍是[-1,1]但實際可能集中在某個小區(qū)間??梢試L試使用對比度拉伸例如用(gaf_matrix - gaf_matrix.min()) / (gaf_matrix.max() - gaf_matrix.min()) * 255。下采樣過于激進如果downsampled_len設得太小原始信號的特征模式在下采樣過程中被嚴重平滑掉了。解決增大下采樣長度或者先不做下采樣生成大圖看看是否有紋理。6.2 模型訓練準確率始終在“瞎猜”水平比如四分類準確率25%左右現(xiàn)象CNN模型訓練損失不下降驗證準確率徘徊在隨機猜測水平。可能原因與排查標簽錯亂這是最致命也最隱蔽的錯誤。檢查數(shù)據(jù)加載環(huán)節(jié)確保圖像路徑和標簽的對應關系絕對正確。一個快速驗證的方法是取出訓練集中每個類別的幾張圖像顯示出來并打印其標簽人工判斷是否匹配。數(shù)據(jù)泄露確保在切片生成樣本時沒有使用跨越不同.mat文件的連續(xù)索引。例如文件A的末尾和文件B的開頭被切到了一個樣本里這個樣本的標簽就無法定義。確保每個樣本完全來源于同一個數(shù)據(jù)文件。訓練/測試集劃分不當如果按文件順序劃分可能導致訓練集和測試集來自完全不同的工況比如訓練集全是0HP負載測試集全是3HP負載模型無法泛化。必須在樣本級別進行隨機打亂和分層劃分確保每個集合中各類別、各工況的數(shù)據(jù)比例大致相同。GAF轉(zhuǎn)換函數(shù)有數(shù)值錯誤使用一個小型人造信號測試你的gramian_angular_field函數(shù)。例如輸入一個簡單的正弦波觀察生成的GAF圖像是否具有預期的周期性結(jié)構。與公開的GAF實現(xiàn)如pyts庫的結(jié)果進行對比。6.3 處理速度太慢特別是實時生成GAF時現(xiàn)象數(shù)據(jù)預處理或訓練時的數(shù)據(jù)加載成為瓶頸。優(yōu)化技巧向量化操作確保gramian_angular_field函數(shù)中使用了NumPy的向量化操作如np.outer避免Python層面的for循環(huán)。預處理與緩存如非必要不要在每個epoch實時生成GAF?;ㄙM一些時間和磁盤空間進行預處理是值得的。使用更高效的數(shù)據(jù)加載如果使用PyTorch將預處理好的圖像數(shù)據(jù)集放在SSD硬盤上并使用torch.utils.data.DataLoader的多個工作進程num_workers和內(nèi)存固定pin_memoryTrue來加速數(shù)據(jù)從磁盤到GPU的傳輸。降低圖像分辨率這是最有效的提速方法。嘗試128x128甚至64x64的圖像很多情況下對分類精度影響不大但計算量和內(nèi)存占用呈平方級下降。6.4 不同故障類型的GAF圖像看起來區(qū)別不大現(xiàn)象人眼難以區(qū)分正常和故障的GAF圖像??赡茉蚺c對策故障特征微弱早期微弱故障或故障尺寸很小時振動信號中的沖擊成分可能被強烈的背景噪聲淹沒。GAF轉(zhuǎn)換并不能創(chuàng)造信息它只是換了一種表示方式。對策考慮在GAF轉(zhuǎn)換前先對信號進行降噪處理例如使用小波閾值去噪、自適應濾波等。需要更強大的特征提取器人眼難以區(qū)分不代表CNN學不到特征??梢岳^續(xù)訓練模型并利用Grad-CAM等可視化工具查看CNN到底關注圖像的哪些區(qū)域。如果CNN能學到區(qū)分性特征那就沒問題。嘗試其他時頻圖像表示如果GAF效果確實不佳可以對比其他方法如連續(xù)小波變換CWT生成的時頻譜圖、短時傅里葉變換STFT譜圖、馬爾可夫變遷場MTF等。有時不同的數(shù)據(jù)適合不同的表示方法。軸承故障診斷是一個理論與實踐緊密結(jié)合的領域。讀懂東南大學的這份代碼不僅僅是理解幾行Python更是要理解其背后將時序問題轉(zhuǎn)化為視覺問題的思想以及數(shù)據(jù)預處理中每一步的工程考量。從數(shù)據(jù)集的解讀、清洗、切片到GAF圖像的生成和優(yōu)化每一步都藏著影響最終模型效果的細節(jié)。希望這份超詳細的解讀和實錄的經(jīng)驗能幫你避開我當年踩過的那些坑更順暢地踏上基于GAF和深度學習的智能診斷研究之路。在實際項目中多可視化、多對比、從小規(guī)模實驗開始迭代是最高效的策略。

相關新聞

MNIST數(shù)據(jù)集下載與預處理全攻略:從入門到工程實踐

MNIST數(shù)據(jù)集下載與預處理全攻略:從入門到工程實踐

1. 從“Hello World”到“Hello MNIST”:為什么它依然是機器學習的入門基石 如果你剛開始接觸機器學習,或者正準備從理論轉(zhuǎn)向?qū)嵺`,那么“MNIST”這個名字你大概率已經(jīng)聽過無數(shù)遍了。它就像一個技術圈的“Hello World”,幾乎出現(xiàn)在…

2026/8/2 14:46:16 閱讀更多
5分鐘掌握My-TODOs:你的跨平臺桌面任務管理神器

5分鐘掌握My-TODOs:你的跨平臺桌面任務管理神器

5分鐘掌握My-TODOs:你的跨平臺桌面任務管理神器 【免費下載鏈接】My-TODOs A cross-platform desktop To-Do list. 跨平臺桌面待辦小工具 項目地址: https://gitcode.com/gh_mirrors/my/My-TODOs 還在為繁雜的待辦事項而煩惱嗎?想要一款既簡潔又強…

2026/8/2 15:46:23 閱讀更多
Jmeter接口自動化全流程:從腳本到持續(xù)集成的工程實踐

Jmeter接口自動化全流程:從腳本到持續(xù)集成的工程實踐

1. 項目概述:從腳本錄制到自動化執(zhí)行的完整閉環(huán)如果你已經(jīng)用Jmeter錄制或編寫了一些接口測試腳本,并且手動執(zhí)行了幾輪,那么接下來最自然的問題就是:如何讓這些腳本“自己跑起來”?這就是接口自動化測試要解決的核心問題…

2026/8/2 15:46:23 閱讀更多
終極網(wǎng)盤直鏈下載助手:無需客戶端,瀏覽器一鍵獲取九大網(wǎng)盤真實下載鏈接

終極網(wǎng)盤直鏈下載助手:無需客戶端,瀏覽器一鍵獲取九大網(wǎng)盤真實下載鏈接

終極網(wǎng)盤直鏈下載助手:無需客戶端,瀏覽器一鍵獲取九大網(wǎng)盤真實下載鏈接 【免費下載鏈接】Online-disk-direct-link-download-assistant 一個基于 JavaScript 的網(wǎng)盤文件下載地址獲取工具。基于【網(wǎng)盤直鏈下載助手】修改 ,支持 百度網(wǎng)盤 / 阿里…

2026/8/2 15:46:23 閱讀更多
氣體流量計廠家怎么選?

氣體流量計廠家怎么選?

工業(yè)氣體計量廣泛用于壓縮空氣、天然氣、氮氣、蒸汽、煙氣、沼氣等介質(zhì),是空壓能耗統(tǒng)計、燃氣貿(mào)易結(jié)算、環(huán)保監(jiān)測、工藝配氣管控的核心設備。很多采購人員采購時只對比價格,忽略廠家研發(fā)實力、計量資質(zhì)、工況適配能力,最終出現(xiàn)儀表精度漂移、…

2026/8/2 15:36:22 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應用材料(Applied Materials)公司生產(chǎn)的一款用于半導體設備的I/O信號分配電路板。該型號(0100-02186)的核心特點如下:專用于Endura等半導體工藝腔室。集成信號路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機,適用于自動化設備及通用機械驅(qū)動。該型號(FFMN-32L-10-T0 40AX)的核心特點如下:三相交流異步電動機。額定…

2026/8/2 2:52:49 閱讀更多