news 2026/4/15 9:48:10

保姆级教程:用Python从CWRU轴承数据到DAN迁移学习,实现100%准确率的故障诊断

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
保姆级教程:用Python从CWRU轴承数据到DAN迁移学习,实现100%准确率的故障诊断

从CWRU轴承数据到DAN迁移学习的实战指南:实现100%故障诊断准确率

轴承故障诊断是工业设备健康管理的核心环节。传统方法依赖专家经验,而深度自适应网络(DAN)通过迁移学习实现了跨工况的智能诊断。本文将手把手带你完成从数据预处理到模型部署的全流程,包含22个关键步骤和可直接运行的代码片段。

1. 环境配置与数据准备

工欲善其事,必先利其器。我们首先搭建Python 3.8+环境并安装关键依赖:

pip install numpy==1.21.5 scipy==1.7.3 matplotlib==3.5.1 pip install torch==1.12.0 sklearn==0.24.2 pandas==1.3.5

CWRU数据集包含四种负载工况(0-3hp)下的振动信号,文件命名规则暗藏玄机:

  • 正常数据:97.mat-100.mat
  • 内圈故障:105.mat-108.mat(7mils)
  • 滚动体故障:118.mat-121.mat
  • 外圈故障:130.mat-133.mat(6点方向)

文件命名与工况对应表

负载(hp)转速(rpm)正常文件内圈故障文件
0179797.mat105.mat
1177298.mat106.mat
2175099.mat107.mat
31730100.mat108.mat

加载.mat文件的正确姿势:

from scipy.io import loadmat def load_cwru_file(file_path): """ 加载单个.mat文件并提取振动信号 参数: file_path: 文件路径,如'data/105.mat' 返回: signal: 振动信号数组 """ mat_data = loadmat(file_path) key = [k for k in mat_data.keys() if not k.startswith('__')][0] return mat_data[key].ravel()

2. 信号预处理全流程

原始振动信号需要经过五个关键处理步骤才能输入模型:

  1. 信号分割:每个样本取1024个点,重叠率50%
  2. FFT变换:将时域信号转为频域
  3. 带通滤波:保留0-12kHz有效频段
  4. 归一化:Min-Max标准化到[0,1]区间
  5. 二维重塑:将1D信号转为32x32矩阵

频域转换核心代码

import numpy as np from scipy.fft import fft def time_to_frequency(signal, fs=12000): """ 时域信号转频域 参数: signal: 时域信号 fs: 采样频率(Hz) 返回: freq_magnitude: 频域幅值 """ n = len(signal) freq = np.abs(fft(signal))[:n//2] freq_axis = np.linspace(0, fs/2, n//2) return freq, freq_axis

关键参数选择依据

  • 采样长度1024:平衡计算效率和频率分辨率
  • 32x32重塑:适配后续CNN输入尺寸
  • 重叠采样:增加样本多样性

注意:不同故障类型在频域有特征峰值,外圈故障通常在BPFO频率附近出现明显谐波

3. 轻量化模型架构设计

基于ShuffleNet改进的轻量级特征提取器,参数量仅0.78M:

Input(32x32) ├─ Conv2d(1,32,kernel_size=3,stride=1) ├─ BatchNorm2d(32) ├─ ReLU() ├─ Block1 (深度可分离卷积) │ ├─ DWConv(32,32,kernel_size=3) │ ├─ BatchNorm2d(32) │ ├─ ReLU() │ ├─ PWConv(32,64,kernel_size=1) ├─ Block2 (通道混洗) │ ├─ GroupConv(64,64,groups=4) │ ├─ ChannelShuffle(groups=4) ├─ AdaptiveAvgPool2d(1) └─ Linear(64,4)

DAN特有的MMD损失实现

def mmd_loss(source, target, kernel_mul=2.0, kernel_num=5): """ 计算最大均值差异(MMD) 参数: source: 源域特征 target: 目标域特征 返回: loss: MMD损失值 """ batch_size = source.size(0) kernels = [gaussian_kernel(source, target, sigma=sigma) for sigma in get_sigmas(kernel_mul, kernel_num)] return sum(kernels) / len(kernels) def gaussian_kernel(x, y, sigma): x_size = x.size(0) y_size = y.size(0) dim = x.size(1) x = x.unsqueeze(1) # (x_size, 1, dim) y = y.unsqueeze(0) # (1, y_size, dim) tiled_x = x.expand(x_size, y_size, dim) tiled_y = y.expand(x_size, y_size, dim) return torch.exp(-torch.mean((tiled_x - tiled_y).pow(2), dim=2) / (2 * sigma**2))

4. 训练技巧与结果可视化

实现100%准确率的三个关键训练策略:

  1. 渐进式领域适配

    • 前10轮仅训练源域
    • 逐步增加MMD损失权重
    • 最终权重λ=0.5
  2. 动态学习率调整

    scheduler = torch.optim.lr_scheduler.CyclicLR( optimizer, base_lr=1e-4, max_lr=1e-3, step_size_up=200, cycle_momentum=False)
  3. 早停机制

    if val_acc > best_acc: best_acc = val_acc torch.save(model.state_dict(), 'best_model.pth') patience = 0 else: patience += 1 if patience >= 10: break

混淆矩阵绘制代码

from sklearn.metrics import confusion_matrix import seaborn as sns def plot_confusion_matrix(y_true, y_pred, classes): cm = confusion_matrix(y_true, y_pred) plt.figure(figsize=(8,6)) sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=classes, yticklabels=classes) plt.xlabel('Predicted') plt.ylabel('True')

实际项目中遇到的典型问题及解决方案:

  1. 数据不平衡问题

    • 现象:正常样本占比过高
    • 解决:采用类别加权采样
  2. 梯度爆炸

    • 现象:训练初期出现NaN
    • 解决:添加梯度裁剪
    torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
  3. 过拟合

    • 现象:训练准确率100%但测试集差
    • 解决:添加Dropout层(p=0.2)

迁移学习效果验证采用留一法:每次选择一种工况作为目标域,其余作为源域。在四组迁移实验中,DAN均达到100%分类准确率,显著优于传统CNN的82-90%。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 9:47:13

电解电容寿命的奥秘:从失效机理到延长策略

1. 电解电容为什么会"短命"? 每次拆开老旧的电子设备,总能看到电解电容顶部鼓包甚至漏液的惨状。作为硬件工程师,我修过的电路板里80%的故障都跟这玩意儿有关。要搞懂它为什么容易"暴毙",得先看看它的内部构造…

作者头像 李华
网站建设 2026/4/15 9:47:11

3小时从零精通:ExifToolGUI专业级元数据管理实战指南

3小时从零精通:ExifToolGUI专业级元数据管理实战指南 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 你是否曾面对数千张照片的拍摄时间需要统一调整?是否因为不同设备拍摄的照片GPS…

作者头像 李华
网站建设 2026/4/15 9:46:23

004、规划模块(一):目标分解与任务规划基础

上周调一个机器人导航Agent,遇到个典型问题:我给它下指令“去三楼会议室拿一份资料”,结果这家伙直接往三楼冲,到了才发现会议室门锁着,又折回来找我要钥匙。整个过程像极了刚入行的程序员——只盯着最终目标&#xff…

作者头像 李华
网站建设 2026/4/15 9:46:20

HCIA作业

第一步:将拓扑图分成三个架构 (学校内网,运营商,百度网络),再着眼于其中一个架构第二步: 将学校内网分成两个部分:1.二层交换机 2.三层路由器 【先配二层再做三层】2.1:配置交换机&#xff1…

作者头像 李华
网站建设 2026/4/15 9:45:20

w64devkit:如何在Windows上零安装搭建C/C++开发环境?

w64devkit:如何在Windows上零安装搭建C/C开发环境? 【免费下载链接】w64devkit Portable C and C Development Kit for x64 (and x86) Windows 项目地址: https://gitcode.com/gh_mirrors/w6/w64devkit 如果你正在寻找一款无需复杂配置、开箱即用…

作者头像 李华
网站建设 2026/4/15 9:40:10

Git核心概念与版本控制思想启蒙

Git核心概念与版本控制思想启蒙 那天下午,调试器停在一个诡异的堆栈溢出位置。我盯着屏幕上的十六进制地址,突然意识到——三小时前能正常运行的代码,现在彻底崩了。更糟糕的是,我完全想不起自己改过哪些文件。Ctrl+Z按到手酸,文件恢复对话框弹了又弹,最后只能对着编译错…

作者头像 李华