新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于CNN的滚动轴承故障诊断:从时频图到准确率复现全攻略

发布时间:2026/9/30 12:24:10来源:尧图网络
基于CNN的滚动轴承故障诊断:从时频图到准确率复现全攻略
简介这份PDF论文直面滚动轴承故障特征难以准确表征的难题系统提出基于卷积神经网络的故障诊断方案适合机械故障诊断、深度学习建模等方向的研究生与工程技术人员参考。针对奇异值分解、多尺度模糊熵、经验模态分解等传统方法只能部分表征故障信息的问题研究从振动信号短时平稳特性出发给出分帧、加窗、DFT与图像编码生成振谱图的完整流程并设计深度卷积神经网络完成特征提取与故障模式识别。包体为1个PDF文件大小约1.28MB全文涵盖方法原理、网络结构、训练步骤与实验验证条理清晰便于精读。基于美国凯斯西储大学公开实测振动信号的实验显示故障识别准确率达100%为深度学习在设备故障诊断领域的落地提供了可复现的技术思路。该资源已有571人学习适合希望快速掌握DCNN故障诊断建模流程的读者深挖参考。1. 这标题不是新东西但九成的人复现不出论文里的准确率“基于卷积神经网络的滚动轴承故障诊断研究.pdf”这类标题在知网和万方上一搜一大把。它本质上是一类套路成熟、天花板清晰的研究型项目用振动信号当输入用CNN自动提特征把正常、内圈故障、外圈故障、滚动体故障这几类状态分出来。你看到它的第一反应不应该是“这能发什么顶会”而是“这条技术路线值不值得我抄、能不能在我自己的数据上复现出九成以上的准确率”。这件事真正的门槛不在CNN本身而在三个地方数据怎么切、标签怎么对齐、以及验证集有没有“作弊”。很多人都栽在第三个坑上——训练集和验证集来自同一段信号的重叠切片导致准确率虚高到99%一上现场就崩。这篇文章要做的就是带着你把这条链路完整走一遍从数据预处理、时频图构造到CNN结构设计、参数调整再到最后的验证和避坑全部用可运行的代码和参数说话。适合正在做设备故障诊断课题的学生也适合工厂里想用深度学习替代传统特征工程的设备工程师。2. 为什么用CNN做滚动轴承诊断从振动信号到故障特征的“无需手工提取”2.1 传统诊断方法的瓶颈在哪过去做轴承故障诊断主流手段是先算时域特征均方根、峰值因子、峭度再算频域特征频谱幅值、边频带能量最后用BP神经网络或SVM分类。这套流程的问题不在模型而在特征工程不同转速、不同负载下同一类故障的特征分布会漂移手工特征很难覆盖所有工况。比如内圈故障在轻载时边频带不明显在重载时又会被噪声淹没你调的阈值换个工况就得重来一遍。CNN的思路是把“特征提取”这个环节也交给网络自己学。你不需要告诉它“二阶边频带更关键”这种规则只需要给它足够多的、带正确标签的样本它会自动组合出一组耐工况变化的滤波器。这也是为什么基于卷积神经网络的滚动轴承故障诊断研究在这几年集中爆发——不是CNN变强了而是数据采集和标注的成本降下来了GPU也让训练变得可行。2.2 CNN到底在看信号的什么很多初学者有个误解以为CNN是直接吃原始波形。实际上绝大多数论文的输入是“时频图”——把一维振动信号通过短时傅里叶变换STFT转成二维图像让CNN像看图片一样去识别故障模式。这背后的直觉是不同故障类型在时频图上的能量分布形态差异明显。内圈故障的冲击会周期性出现在特定频率带上外圈故障的旋转调制更规则滚动体故障则是间歇性的无规律冲击。你没必要自己设计这些形态特征CNN的卷积核会自动去匹配。第一层卷积核学到的是类似边缘检测的局部模式后面的层会把局部模式组合成“内圈故障典型图谱”这样更抽象的语义。所以整个诊断流程的精髓是信号转图、图进CNN、分类出结果。后面所有代码和参数都围绕这一步展开。2.3 输入选择原始波形、FFT谱和时频图怎么取舍不是所有论文都用时频图有些工作直接把原始波形分段后扔进一维CNN也能出结果。三类输入的取舍我给出一个经验判断输入形式信息量模型复杂度典型准确率上界适用场景原始波形一维低调制信息需深层网络去学较低1D卷积约90%-95%数据量大、转速稳定FFT频谱中丢掉时序信息低约92%-96%稳态工况诊断类别少STFT时频图二维高保留时频联合分布较高需预训练或加深约97%-100%变速变载、多工况诊断我的做法是优先选STFT时频图理由很现实它和论文复现的匹配度最高而且可视化效果好调试时能直观看出网络到底学了什么。下面第三部分就直接围绕这个输入展开。3. 把原始振动信号变成CNN能吃的样本数据切分与STFT参数3.1 公开数据集怎么选CWRU和帕德博恩的差异做这类研究数据基本来自两个公开集美国凯斯西储大学CWRU轴承数据集和德国帕德博恩数据集。CWRU的优点是故障类别标准、采样频率12kHz/48kHz可选、负载分级清晰绝大多数论文都用它做基准缺点是数据采集年代早信号偏干净和现场噪声差距大。帕德博恩数据集的信号更接近真实工况有变速变载的工况设计但标注体系复杂新手容易搞混故障编码。如果你只是复现论文、发一篇毕业设计用CWRU就够用。做法是按负载0到3马力分别取正常、内圈、外圈、滚动体四类数据每类取足够多的样本段。要注意的是CWRU的原始文件是.mat格式读取时要用scipy.io.loadmat且文件名里有明确的故障直径和转速信息解析时要小心字符串格式。3.2 重叠切分样本量不够时最常用的“扩增”手段一个原始振动文件几十秒长如果只按整段输入样本量远远不够训练CNN。标准做法是滑窗重叠切分——设定窗口长度和步长窗口滑动产生多个样本段。比如10秒的信号窗口长度2048点步长1024点能切出大约585段样本每秒12000点。import numpy as np def sliding_window(data, window_size, step_size): samples [] n len(data) for start in range(0, n - window_size 1, step_size): end start window_size samples.append(data[start:end]) return np.array(samples) # 示例原始12kHz采样数据单段时长约0.17秒 window_size 2048 # 约171ms足够覆盖多个旋转周期 step_size 1024 # 50%重叠 samples sliding_window(raw_signal, window_size, step_size)这里window_size定2048是经验值它既要包含至少一个完整的旋转周期电机转速通常在1500到3000rpm对应周期20到40ms2048点约171ms足够又不能让单样本过长导致样本数太少。step_size取window_size的一半50%重叠是性价比最高的设置样本量翻倍但相邻样本间的重复信息不会造成严重的过拟合。3.3 STFT参数怎么定窗口长度、重叠率和频率分辨率的关系拿到切片后的样本下一步是转时频图。这一步用scipy.signal.stft三个参数直接决定图的形态npersegFFT窗口长度、noverlap窗口重叠点数、以及是否加窗函数。from scipy.signal import stft def signal_to_stft(signal, fs12000, nperseg256, noverlap192): f, t, Zxx stft(signal, fsfs, npersegnperseg, noverlapnoverlap) # 取幅值谱转log压缩动态范围 spec np.abs(Zxx) spec_db 20 * np.log10(spec 1e-8) return f, t, spec_db # 输出尺寸f为128个频率点t为9个时间帧当输入2048点时nperseg选256是因为它和2048点输入配合得当频率分辨率为fs/nperseg46.875Hz时域上每帧约21ms既能分辨轴承故障的特征频率通常在几百赫兹到几千赫兹又有足够的时域定位能力。noverlap取nperseg的75%192点是STFT的常规做法比信号切分的50%重叠更高目的是让时频图在时间维度上更平滑。最终每张图是128×9的分辨率直接作为CNN的输入张量。3.4 归一化与数据集的最终组织方式STFT输出的幅值跨度很大从接近0到上万网络训练时梯度容易震荡必须做归一化。常见做法是全局统计所有训练样本的均值和标准差然后统一标准化还有一种做法是将每张图独立归一化到0-1区间。前者更适合测试集分布与训练集接近的场景后者对工况漂移更鲁棒。# 全局标准化统计训练集所有样本的mean和std mean np.mean(all_train_specs) std np.std(all_train_specs) norm_spec (spec_db - mean) / (std 1e-8) # 按样本独立归一化鲁棒性更好 min_val np.min(spec_db) max_val np.max(spec_db) norm_spec (spec_db - min_val) / (max_val - min_val 1e-8)我一般优先用全局标准化。原因是独立归一化会把每张图的噪声背景也拉伸到全动态范围等于把噪声的信息量放大了而全局标准化保留不同样本间的绝对能量差异模型能学到“这个故障的能量显著比那个高”的信息。数据集最终组织形式很简单一个四维数组样本数, 高度, 宽度, 1加一个一维标签数组标签用one-hot编码后进入分类头。到这里CNN的输入就真正准备好了。4. 落地CNN结构从LeNet改到适合轴承故障诊断的紧凑网络4.1 为什么你不用从零设计网络经典的LeNet和VGG改法早期做轴承故障诊断的论文网络结构基本都是从图像分类网络搬过来的。LeNet-5是第一个可以跑的方案两个卷积层加两个全连接层参数量小CPU都能训练。VGG则是把卷积核统一成3×3、深度加深到十几层准确率通常更高但对振动信号这种小尺寸输入128×9来说VGG的全局池化之前网络就已经把特征压扁了反而容易过拟合。我常用的做法是“LeNet的骨架、VGG的卷积核”即3×3小卷积核、每层卷积后接ReLU和2×2最大池化中间只在通道数上做加宽。这样网络浅、收敛快同时有足够表达能力去分辨故障类别差异。下面给出一个可以直接用的紧凑网络定义import torch import torch.nn as nn class BearingCNN(nn.Module): def __init__(self, num_classes4): super().__init__() self.features nn.Sequential( # 输入: (batch, 1, 128, 9) nn.Conv2d(1, 16, kernel_size3, padding1), nn.BatchNorm2d(16), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), # - (batch, 16, 64, 4) nn.Conv2d(16, 32, kernel_size3, padding1), nn.BatchNorm2d(32), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), # - (batch, 32, 32, 2) nn.Conv2d(32, 64, kernel_size3, padding1), nn.BatchNorm2d(64), nn.ReLU(inplaceTrue), nn.AdaptiveAvgPool2d((1, 1)) # - (batch, 64, 1, 1) ) self.classifier nn.Sequential( nn.Flatten(), nn.Linear(64, 64), nn.ReLU(inplaceTrue), nn.Dropout(0.5), nn.Linear(64, num_classes) ) def forward(self, x): x self.features(x) x self.classifier(x) return x网络结构的三个关键选择值得说明。第一每层卷积后加BatchNorm它让训练对学习率的敏感度大幅降低是这类小样本故障诊断任务能不调参就跑起来的保障第二最后的AdaptiveAvgPool2d把任意尺寸的特征图压成1×1向量这样你以后换用更长的输入窗口比如4096点时不用改网络结构第三Dropout放在分类头而不是特征提取部分因为特征层的冗余信息对泛化是有帮助的而分类头的过拟合需要用Dropout抑制。4.2 训练参数怎么设学习率、批次大小和epoch的推荐值训练部分我的默认配置是学习率1e-3批次大小32epoch数50优化器Adam损失函数交叉熵。这个配置在CWRU数据集上通常30个epoch就能跑到95%以上50个epoch足够收敛到平台期。如果训练到20个epoch准确率还低于80%问题大概率不在参数而在数据切分或标签对齐先去检查前面两步。学习率的调整逻辑是如果loss在训练初期就不下降或持续震荡降到3e-4重试如果下降很快但准确率在某个值附近波动往不上走用学习率衰减每15个epoch乘以0.1再跑一轮。切忌一开始就用学习率计划表套复杂策略先跑平再调优才有意义。optimizer torch.optim.Adam(model.parameters(), lr1e-3) scheduler torch.optim.lr_scheduler.StepLR(optimizer, step_size15, gamma0.1) criterion nn.CrossEntropyLoss() for epoch in range(50): model.train() for x_batch, y_batch in train_loader: optimizer.zero_grad() outputs model(x_batch) loss criterion(outputs, y_batch) loss.backward() optimizer.step() scheduler.step()批大小32是最稳妥的中间值如果显存或内存有限就降到16准确率不会有大波动如果数据量大、想加速训练提高到64也可以但注意小批次16以下配合大学习率1e-2以上会出现典型的loss震荡问题。4.3 训练集、验证集和测试集怎么划分才不“作弊”这是全文最重要的一段。很多论文里报告99%准确率的模型实际上是因为划分数据时用了重复样本。具体场景是滑窗切分后相邻样本有50%的重叠如果直接随机化划分训练集和测试集那么某个测试样本会有大量内容出现在训练集里——模型等于是背下了答案。正确做法是“按段划分”即先把原始信号分成不重叠的大段比如每段2秒再在段内做滑窗切分最后把整段整段划入训练或测试。def split_by_segment(samples, labels, train_ratio0.7): # samples按来源段编号比如来自文件1的信号切出的样本全部归为段0 unique_segments np.unique(sample_segment_ids) np.random.shuffle(unique_segments) split_idx int(len(unique_segments) * train_ratio) train_segments unique_segments[:split_idx] test_segments unique_segments[split_idx:] train_mask np.isin(sample_segment_ids, train_segments) test_mask np.isin(sample_segment_ids, test_segments) return samples[train_mask], labels[train_mask], samples[test_mask], labels[test_mask]按段划分后准确率通常会比随机划分低3-5个百分点这是正常的因为训练集和测试集之间的相似度降下来了。判断一篇论文是否“作弊”一个简单办法就是看它有没有披露数据划分方式。如果只写“随机划分80%训练、20%测试”你可以默认它存在重叠泄露。4.4 特征可视化和混淆矩阵CNN训练完成后的第一步验证训练完成后不要急着看准确率数字。先跑一次测试集输出混淆矩阵看哪两类容易被混。轴承故障诊断里最常见的混淆是内圈故障和外圈故障——两者都是周期性冲击时频图上的差异常常只在相位或调制细节上网络容易搞混。可视化可以确认网络到底学到了什么import sklearn.metrics as metrics import matplotlib.pyplot as plt pred [] true [] model.eval() with torch.no_grad(): for x_batch, y_batch in test_loader: outputs model(x_batch) pred.extend(torch.argmax(outputs, dim1).cpu().numpy()) true.extend(y_batch.cpu().numpy()) cm metrics.confusion_matrix(true, pred) disp metrics.ConfusionMatrixDisplay(cm, display_labels[Normal,IR,OR,B]) disp.plot(cmapBlues) plt.title(Confusion Matrix on Test Set) plt.show()看到混淆矩阵后如果只是IR和OR互相混那说明故障特征本身相似可以尝试增大STFT的频率分辨率提高nperseg到512或1024或者加深网络。如果Normal也被混进故障类那多半是数据切分时把不同转速的样本混在了一起——转速不同、能量不同网络学会了按转速分类而不是按故障分类回到数据集重新按转速分组。5. 避坑指南复现这类论文最常见的4个翻车现场5.1 训练准确率极高但测试集拉胯随机划分造成的假象现象训练集准确率99%测试集准确率也99%但一到自己采集的现场数据上立刻掉到70%以下。原因就是前面说的滑窗重叠导致训练集和测试集高度相似。解决方法是改成按段划分并且在报告结果时主动用更严格的划分方式重跑一遍用偏低但真实的数字做基准。5.2 STFT图上全是竖条纹窗口参数和输入长度不匹配现象生成的时频图只看到密集的竖直条纹没有明显的横向能量带网络训练loss一直降不下去。原因输入窗口长度比如2048点和nperseg比如256配合下时间帧数太少只有9帧网络很难从这么窄的宽度里提取稳定的时域特征。解决把输入窗口加长到4096或8192点同时增大noverlap让时间帧数保持在16以上或者改用CWT小波变换做时频图。5.3 相同负载下分类正常换负载就崩工况泛化问题现象在0马力负载下训练和测试都95%以上直接拿2马力负载的数据测试准确率掉到60%。原因不同负载下轴承滑移率不同故障特征频率有偏移且振动能量整体分布不同。解决方法是做跨工况训练把多个负载的数据都放进训练集让网络学到“与负载无关的故障本质特征”。如果某个负载的样本量很少对那个负载的样本做更多的重叠切分步长更小或者用数据增强加入高斯噪声补充。5.4 模型训练完全随机标签和样本错位现象loss下降极其缓慢甚至不下降准确率在25%附近四分类随机水平。原因读CWRU的.mat文件时文件名解析出错或者滑窗切分时多个文件的数据混在同一个数组里没有同步更新标签。解决写一个最小的数据校验函数随机抽3个样本打印它们的标签和来源文件名做人工核对。这一步花不了两分钟但能省下后期排错的半天时间。5.5 显存不够或训练极慢输入尺寸和网络层数的账没算清现象128×9的输入图一旦改成256×18提高STFT分辨率后显存直接爆掉或者单epoch时间翻了几倍。原因没有意识到卷积层的计算量与特征图尺寸平方成正比。解决不要盲目加卷积层先用Global Average Pooling替换Flatten加全连接层的结构参数量立刻降一个量级或者把输入改为单通道灰度图用灰度值替代RGB三通道复制输入尺寸瞬间除以3。6. 用好最后一个技巧把模型诊断结果转成可解释的“故障指示器”前面所有工作最终要落回现场价值。CNN给出的是一个分类结果但现场工程师最关心的不是“网络说这是内圈故障”而是“这个故障有多严重、趋势如何、什么时候该换轴承”。这里有一个常用技巧取网络分类头之前倒数第二层的特征向量降维后投影到二维平面观察故障样本的聚类轨迹。具体做法是去掉最后的Linear分类层把64维特征输出保存下来用t-SNE或PCA降维到2维然后按时间顺序连接同一设备上的连续样本画出一条随退化程度变化的轨迹线。你会发现正常样本聚集在一团早期故障样本沿着某个方向缓慢移动严重故障样本跳到远处。这个轨迹比单纯的“分类准确率”更能说明问题。代码上只需在原来的BearingCNN里加一个forward_feature方法返回classifier第一个Linear之前的输出def forward_feature(self, x): x self.features(x) x x.view(x.size(0), -1) feat self.classifier[1](self.classifier[0](x)) # LinearReLU后的特征 return feat存储特征时按时间戳排序之后每次新采集的信号都过一遍网络把新特征点插入轨迹图里。当轨迹点开始明显偏离正常聚类中心并且持续不回归时即便分类结果还是“正常”也值得安排一次停机检查。这套经验是我做现场项目时积累下来的——分类模型告诉你“是什么”特征轨迹告诉你“正在发生什么”两者配合比单独信分类结果可靠得多。整个项目做到这里你已经把“基于卷积神经网络的滚动轴承故障诊断研究”这类论文里的核心链路完整复现了一遍信号转时频图、按段切分防泄露、紧凑CNN训练、混淆矩阵验证、特征轨迹兜底。下一步建议是换到帕德博恩数据集上重跑一遍体验一下现场级噪声对准确率的影响。希望这篇笔记能帮你少走弯路把论文里的数字变成自己手上可信的模型。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

GEO专家孟庆涛:GEO 时代的信源布局方法论从内容优化到语境匹配 2026/9/30 14:57:30

GEO专家孟庆涛:GEO 时代的信源布局方法论从内容优化到语境匹配

当 AI 的推荐随问法、语言、城市与平台漂移,品牌要优化的就不再是内容本身,而是内容与语境的匹配概率。 2026 年 9 月 7 日,Semrush 与 Exploding Topics 联合发布了一项覆盖 2338 名美国成年人的调查:73.6% 的每周 AI 使用者曾依…

阅读更多 →
Flink流处理架构演进:从状态管理到CDC Pipeline与批流一体实践 2026/9/30 14:57:22

Flink流处理架构演进:从状态管理到CDC Pipeline与批流一体实践

做流计算这几年,有个特别明显的感受:只要是聊大数据实时计算,Flink几乎是绕不开的名字。从面试题里的“Flink和Spark Streaming有什么区别”,到毕业设计里的“电商实时大屏”,再到生产环境里的“CDC Pipeline整库同步”…

阅读更多 →
从CPU到内存:一文读懂冯诺依曼体系结构与性能瓶颈 2026/9/30 14:57:22

从CPU到内存:一文读懂冯诺依曼体系结构与性能瓶颈

做了这么多年开发,带过的实习生和刚入行的同事少说也有几十个,我发现一个规律:很多人写了好几年代码,能把各种框架调得飞起,但你要是问他CPU到底是怎么把一行a b c变成结果的,十有八九会卡壳。聊到冯诺依…

阅读更多 →
VMware中Ubuntu 22.04虚拟机磁盘扩容完整指南:从分区到LVM一步到位 2026/9/30 14:57:21

VMware中Ubuntu 22.04虚拟机磁盘扩容完整指南:从分区到LVM一步到位

不知道你有没有遇到过这种情况:VMware里装了个Ubuntu 22.04,当时觉得自己挺有经验,硬盘随便给了20G,结果过了一两个月,编译一个大项目、拉几个Docker镜像、再装点ROS依赖,系统盘就飘红了。清理缓存、删日志…

阅读更多 →
基于SpringBoot+Vue3的果蔬生鲜电商系统:前后端分离与JWT鉴权实战解析 2026/9/30 14:57:21

基于SpringBoot+Vue3的果蔬生鲜电商系统:前后端分离与JWT鉴权实战解析

先把我做这个项目的真实感受放在最前面:没有任何一个技术项目能像果蔬生鲜电商这样,把SpringBoot和Vue3的实战价值体现得如此充分。前后端分离、JWT鉴权、商品与订单流转、后台管理……这些看上去很“教科书”的名词,落在一个卖菜平台上&…

阅读更多 →
【毕设避坑干货】挑选 AI 论文工具必看!一站式平台 Paperxie 实测分享 2026/9/30 14:57:07

【毕设避坑干货】挑选 AI 论文工具必看!一站式平台 Paperxie 实测分享

前言 临近毕业季,网上层出不穷的 AI 论文工具让人眼花缭乱。很多同学随便找一个网站就开始写论文,等到后期才发现功能不全、参考文献造假、文稿泄露等一系列问题,白白浪费大量时间。 挑选 AI 论文辅助工具,核心要看两点&#xf…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉