跳到正文
博客园· 小屋打AI·· 3 小时前AI 评分22

手把手教你:基于深度学习的滚动轴承故障诊断|第 4 篇 · 数据预处理源码走读:从原始信号到可训练样本

手把手教你:基于深度学习的滚动轴承故障诊断|第 4 篇 · 数据预处理源码走读:从原始信号到可训练样本 - 小屋打AI

AI 导读

滚动轴承故障诊断系列第 4 篇走读 data_load 源码:对 CWRU 数据集的 DE、FE 两路信号分别做 MinMax 归一化到 [0,1],配对成双通道后按每 1000 点滑窗切分,每类随机抽取 1400 条配平,最终产出形状为 (5600, 1000, 2) 的 train_data.npy 与 5600 个标签的 label.npy,供后续三个模型通用。

正文

本文是《滚动轴承故障诊断》系列的第 4 篇(数据预处理)。
系列完整目录见文末【专栏导航】。本篇讲解的 data_load 核心逻辑,配套的完整可运行脚本与报错速查见公众号:大雾的小屋。

一、为什么原始信号不能直接喂给模型

回顾第 3 篇:我们拿到的是一整条很长的振动时间序列。

但分类模型要的是"一条一条的样本",每条有一个明确的标签(属于哪类故障)。所以预处理的核心任务就一句:把一整条信号,切成很多条有标签的小样本。

顺带还要解决两个工程问题:

  1. 幅值尺度不统一:不同转速、不同工况下,振幅大小差很多,不处理模型会"以大欺小";
  2. 类别不平衡:不同文件切出的样本数不一样,不均衡会让模型偏科。

这三件事,就是 preprocess.py 干的活。

二、核心函数 data_load 的思路拆解

我们来看这个函数做了哪几件事(这是全系列第一个值得逐行读的代码):

def data_load(path, data_name, cut_num, label):
    # ① 读入 .mat 文件
    data = loadmat(path + str(data_name) + '.mat')

    # ② 取出驱动端 DE 与风扇端 FE 两路信号
    org_DE = data['X' + name + '_DE_time']
    org_FE = data['X' + name + '_FE_time']

    # ③ 各自归一化到 [0,1]
    list_DE_n = MinMaxScaler().fit_transform(org_DE)
    list_FE_n = MinMaxScaler().fit_transform(org_FE)

    # ④ 打包成双通道,再按窗口切分
    signal = [[d, f] for d, f in zip(list_DE, list_FE)]
    for i in range(len(signal) // cut_num):
        data_cut.append(signal[i*cut_num : (i+1)*cut_num])
        label_cut.append(label)
    return data_cut, label_cut

四个动作,对应三件事 + 一个输出。下面逐一拆:

三、归一化:为什么压到 0~1

把 DE、FE 各自做 MinMax 归一化,把所有值压到 0~1。

为什么要做?

  • 消除尺度差异:同一台机器不同转速,振幅可能差好几倍。若不归一化,模型会把"振幅大小"当成重要特征,而它其实只是工况,不是故障;
  • 利于训练稳定:神经网络里数值过大容易让梯度爆炸/不收敛,压到 0~1 是标准做法;
  • 两份信号各归各的:DE、FE 是不同传感器、不同量纲,必须分开归一化,不能混在一起算。

归一化用的是 MinMaxScaler().fit_transform()——它先"学"这段数据的最小/最大,再整体缩放到 0~1。

四、双通道:为什么用 DE + FE 两路

把归一化后的 DE 和 FE,逐点配对成 [DE, FE],一条样本就成了 1000 点 × 2 通道。

  • 两个传感器一个装在驱动端、一个装在风扇端,从不同角度"听"同一台轴承;
  • 双通道信息互补,比只用一个通道更稳、更能抗干扰;
  • 这也解释了第 2 篇为什么强调要装全依赖——(1000, 2) 这个输入形状后面模型都用。

五、滑窗切分:一条信号 → 一堆样本

关键步骤:for i in range(len(signal) // cut_num),每 cut_num(本项目 1000)个点切一段。

  • 每 1000 个点是一条样本,一条长长的信号能被切成很多条;
  • 这本身就是最简单的数据增广:一条信号"变"出几十上百条样本,数据量一下就上来了;
  • 也解释了为什么 CWRU 才 40 个文件,最后却有 5600 条样本——全是切窗切出来的。

六、类别均衡:每类固定 1400 条

切完之后,每个文件产出的样本数不一样(文件长度不同),所以最后要"齐步走":

  • 统计每类样本数;
  • 每类随机抽取固定数量(本项目 1400 条),把四类配平。

配平的价值:防止模型"偷懒"。如果某类样本特别多,模型可能"反正大多数是这类,全猜这类也高分"——这样整体准确率虚高,但小类几乎全错。均衡后,四类被公平对待,指标才真实可信。

七、产出与交接

预处理跑完,项目目录多出两个文件:

文件 内容
train_data.npy 5600 条样本,形状 (5600, 1000, 2)
label.npy 5600 个标签(0~3)

预处理一次,三个模型通用——第 5、6、7 篇都从这两个文件读数据。

八、本篇小结

  • 预处理 = 归一化 + 双通道 + 滑窗切分 + 类别均衡;
  • 归一化消除工况差异、双通道增信息、切窗做增广、均衡防偏头;
  • 完整脚本、运行方法、报错速查:关注公众号。

滑窗切分示意:一条信号切出很多条 1000 点样本

归一化前后波形对比(内圈故障 105.mat 前 800 点

专栏导航

篇次 主题 状态
1 项目总览与三模型对比 ✅
2 环境部署 ✅
3 CWRU 数据集深度解析 ✅
4 数据预处理源码走读(本文) ✅
5 随机森林实战 排期中
6 一维卷积与残差模块 排期中
7 模型训练与评估 排期中
8 可视化诊断系统 排期中
9 论文报告与答辩话术 排期中

下一篇预告:《随机森林实战:传统方法为什么也要做》,看这个"不深度学习"的基线方法为什么在论文里必不可少。


版权说明:CWRU 数据集版权归凯斯西储大学所有,仅限学习研究使用。

来源:博客园 · cnblogs.com