
简介旋转机械状态监测中轴承故障诊断是设备预测性维护的核心环节而振动信号分析则是识别轴承健康状态的主要技术手段。传统诊断方法依赖峭度、包络谱等手工设计的特征工程在变转速、变负载等复杂工况下泛化能力不足。深度学习技术尤其是卷积神经网络CNN能够直接从原始振动信号中自动提取故障特征实现端到端的故障分类有效解决传统方法依赖人工经验的瓶颈。其中一维卷积神经网络1D-CNN因输入处理简洁、推理效率高在轴承故障诊断场景中展现出工程落地优势。该技术可广泛应用于电机、泵、风机等旋转机械的智能运维、设备健康管理以及工业预测性维护系统建设。本文基于凯斯西储大学公开数据集围绕信号预处理、1D-CNN网络设计、模型训练与评估给出了一个可复现的轴承故障诊断平台实践方案。1. 项目概述与核心思路1.1 为什么要做轴承故障诊断平台工业场景里旋转机械的故障绝大部分都跟轴承有关。电机、泵、风机、压缩机这些设备一旦轴承出问题轻则停机检修重则整条产线瘫痪。传统做法是靠老师傅听声音、摸振动或者定期保养更换说白了就是靠经验、靠运气。振动分析里的包络谱、峭度指标这些经典方法也不是不好但有个致命问题特征提取得靠人手工设计不同工况、不同转速下同一套特征往往就不灵了。我是做设备预测性维护的手头正好攒了一批轴承振动数据一直想搞一个能自动学习特征、不用每次调参调到怀疑人生的诊断方案。深度学习刚好解决这个问题——把原始振动信号喂进去模型自己学特征、自己分类从源头绕开手工特征工程这个瓶颈。这个项目就是基于这个思路搭建的一套轴承故障诊断平台从数据导入、信号预处理、模型训练到故障识别、结果可视化全流程串起来了。1.2 平台能做什么、适合谁参考这个平台解决的核心问题就三个字识故障。具体来说输入一段轴承振动信号平台能告诉你轴承是正常状态还是内圈故障、外圈故障、滚动体故障并且输出置信度。整套流程包括数据切分、时频变换、模型训练、评估报告、结果导出做了图形界面不用每次命令行敲来敲去。如果你正在做设备状态监测、故障诊断、预测性维护相关的课题或者刚入门深度学习想找一个能落地的工业案例这份内容都值得看完。整个项目的技术栈是Python PyTorch 1D-CNN数据用的公开的凯斯西储大学轴承数据集整个流程在普通带NVIDIA显卡的机器上就能跑起来不挑硬件。下面我把从架构设计到实际踩坑的过程全部拆开讲清楚。2. 整体架构设计与技术选型解析2.1 传统方案为什么不够用先聊聊方案选型这件事。传统的轴承故障诊断流程是这样的采集振动信号 → 经验模态分解/小波包变换 → 提取时域特征均值、峰值、峭度等或频域特征频谱峰值、边频带等 → SVM/随机森林分类。这套流程最大的问题在于特征工程环节。振动信号是非平稳的负荷一变、转速一变最优特征组合就变了每换一个工况就得重新做一遍分析。我在实际项目中吃过这个亏现场设备转速从1500rpm调到3000rpm之前调好的特征阈值全部失效重新分析花了两个星期。深度学习方案的逻辑完全不一样。原始振动信号经过简单预处理后直接作为输入卷积层自动提取局部特征深层网络自动组合出高层语义特征特征提取和分类决策是端到端联合优化的。你不需要知道什么特征最有判别力模型自己学。这对于工况复杂的工业现场尤其有价值。2.2 模型选型1D-CNN 还是 2D-CNN深度学习做轴承诊断业界主要两条技术路线一种是把原始一维振动信号直接送到一维卷积网络1D-CNN另一种是先做时频变换短时傅里叶变换或小波变换生成二维时频谱图再送二维卷积网络2D-CNN识别。两条路我都试过这个项目最终选了1D-CNN作为主干原因很实在第一原始振动信号本身就是一维时间序列直接输入省掉了时频变换这一步预处理流程短、推理速度快第二二维时频图虽然可视化效果好但生成谱图本身有参数选择问题窗函数、窗长、重叠率这些参数选不好信息丢失比模型还严重第三1D-CNN的参数量远小于2D-CNN训练快部署到边缘设备也友好。当然1D-CNN有个短板——它对频域特征的捕捉能力不如谱图方式直观所以我在网络里加入了多尺度卷积核设计来弥补这个后面细说。2.3 环境与依赖方案平台运行环境是这个阵容操作系统Windows 10/11 或 Ubuntu 20.04/22.04Python3.9 以上推荐3.10深度学习框架PyTorch 2.x CUDA 11.8/12.1数据处理NumPy、Pandas、SciPy可视化Matplotlib、PyQt5/Tkinter其他scikit-learn评估指标、joblib模型导出如果你没有NVIDIA显卡CPU也能训练就是慢一些。我在CPU上跑过完整训练150个epoch大概要4个小时GPURTX 3060只要15分钟。建议至少4GB显存起步。3. 数据准备与信号预处理实操3.1 数据集获取与格式说明这个平台用的是凯斯西储大学CWRU轴承数据中心公开数据集这是轴承故障诊断领域最常用的基准数据集。数据分三类工况正常Normal、内圈故障Inner Race、外圈故障Outer Race、滚动体故障Ball每种故障又分0.007英寸、0.014英寸、0.021英寸三个损伤直径等级采样频率有12kHz和48kHz两档。下载下来之后是mat格式文件每个文件对应一种状态比如IR007_0.mat表示内圈故障、损伤直径0.007英寸、负载0。平台里做了自动解析模块把mat文件批量转换成numpy数组。这里有个很容易踩的坑mat文件里存储的振动信号是DE - drive end列还是FE - fan end列不同文件索引不一样需要先打印shape确认再写解析逻辑不要想当然取第一列。3.2 数据切分与样本增强原始数据是连续的长序列振动信号不能直接输入网络。标准做法是滑窗切分设定固定窗口长度比如1024个采样点用固定步长滑动切出一个个样本。这个项目里我用的窗口长度是1024滑动步长512这样相邻样本有50%重叠相当于做了数据增强样本量翻倍。切分的代码逻辑不复杂但有个关键细节切分必须在同一段原始信号内进行不能跨文件拼接。同一文件切出的样本相关性很强如果随机分配训练集和测试集就存在数据泄漏问题模型评估结果会虚高。我自己踩过这个坑第一版代码把切分后的所有样本混在一起再随机划分测试准确率高达99.8%但换到现场实测数据直接掉到70%多一点。后来改成按文件整体划分——同一个工况文件的所有样本要么全部进训练集要么全部进测试集评估结果才真实可信。这一步非常重要做故障诊断的朋友务必注意。3.3 标准化与数据增强策略振动信号的幅值范围在不同工况下差异很大不经标准化直接喂网络训练容易震荡。我用的方法是z-score标准化每个样本减去自身均值再除以标准差让输入分布归一化到均值0、方差1。这里的细节是标准化统计量必须在训练集上计算然后应用到验证集和测试集不能各自算各自的否则分布不一致。数据增强方面除了滑窗重叠还可以做加噪给原始信号叠加不同信噪比的高斯白噪声增强模型抗噪能力随机缩放幅值乘以[0.8, 1.2]的随机系数时间偏移窗口起点随机抖动我实测下来加噪对模型鲁棒性的提升最明显尤其是当你想把模型用到现场环境时——实验室数据干净现场数据一堆干扰不加噪训练的模型很容易过拟合。4. 模型网络设计与训练细节4.1 1D-CNN网络结构设计网络结构是整个平台的核心。我设计的1D-CNN结构如下输入层: (batch, 1, 1024) 卷积块1: Conv1d(1, 16, kernel_size64, stride8, padding32) BN ReLU MaxPool1d(kernel_size4, stride4) 卷积块2: Conv1d(16, 32, kernel_size32, stride4, padding16) BN ReLU MaxPool1d(kernel_size4, stride4) 卷积块3: Conv1d(32, 64, kernel_size16, stride2, padding8) BN ReLU MaxPool1d(kernel_size4, stride4) 卷积块4: Conv1d(64, 128, kernel_size8, stride2, padding4) BN ReLU GlobalAvgPool1d() 全连接层: Dropout(0.5) Linear(128, 64) ReLU Linear(64, num_classes)几个设计细节值得展开说说第一大卷积核起步逐层缩小。第一层用64的大卷积核目的是让网络在早期就捕捉到轴承故障特征中低频区域的宽脉冲形态。如果第一层就用3×3这种小卷积核感受野太小只能看到信号的局部毛刺很难建立全局上下文。随着层数加深卷积核逐渐缩小到8这是为了在高层提取精细的局部判别特征。第二每个卷积块都带BatchNorm。振动信号经过卷积之后特征分布变化很大BN层能加速收敛、缓解内部协变量偏移。实测下来加了BN的训练曲线明显更平滑学习率可以调大一倍。第三全局平均池化替代全连接层。传统CNN最后都接Flatten加几个全连接层参数量爆炸容易过拟合。全局平均池化把最后一层特征图直接平均成一个向量参数量骤减对防止过拟合很有效。4.2 训练超参数与调优过程训练配置直接给出来优化器Adam初始学习率 lr3e-4权重衰减1e-4损失函数CrossEntropyLoss交叉熵Batch size64Epochs100学习率调度CosineAnnealingLR余弦退火T_max30早停策略patience15监控验证集loss关于学习率的调优我的经验是先用lr3e-4跑几个epoch看训练loss的下降趋势如果loss不降或者剧烈震荡就调小一个数量级。Adam虽然自适应学习率但初始学习率的敏感性依然很高lr太大模型会发散太小收敛太慢。早停策略是我强烈建议加的。100个epoch训练过程中验证集loss通常在第30-50个epoch达到最低点之后的训练其实在过拟合。保存验证集loss最低时的模型参数比保存最后一个epoch的模型效果明显更好。4.3 损失函数与评估指标体系训练阶段用的是标准交叉熵损失。评估阶段光看准确率不够工业场景下漏报的代价远大于误报——一个故障轴承被判断成正常可能导致设备彻底损坏。所以我额外输出混淆矩阵、精确率Precision、召回率Recall和F1分数。以四分类正常、内圈、外圈、滚动体故障为例核心指标计算方式准确率 预测正确的样本数 / 总样本数精确率 真正例 / (真正例 假正例)即所有被预测为正类的样本中有多少是真正类召回率 真正例 / (真正例 假反例)即所有真正的正类样本中有多少被正确找出来F1 2 * P * R / (P R)精确率和召回率的调和平均我的平台在CWRU数据上最终达到的指标是故障类型精确率召回率F1分数正常99.2%99.8%99.5%内圈故障98.7%98.1%98.4%外圈故障99.1%99.3%99.2%滚动体故障97.6%97.2%97.4%滚动体故障识别率相对低是普遍现象因为滚动体的运动是滑动加滚动的复合运动故障特征信号比较微弱。这个在行业里是共识不用太纠结。4.4 训练过程中的可视化监控平台集成了训练过程可视化实时绘制训练集/验证集的loss曲线和准确率曲线。这个功能看着简单但价值很大。我在实际使用中发现loss曲线能提前暴露很多问题——比如训练loss下降但验证loss不降反升就是过拟合信号训练loss震荡不降可能是学习率过大或数据预处理出问题训练和验证loss都很高先检查数据标签是不是对齐了。另一个实用功能是混淆矩阵热力图。训练结束后自动生成一眼看出哪两类容易混淆。我的经验是如果发现内圈故障和滚动体故障之间误判较多可以检查时域波形——这两种故障在某些损伤尺寸下的振动特征确实有相似性必要时可以增加数据量或者做特征融合来改善。5. 平台实操从环境搭建到完整运行5.1 环境搭建与依赖安装这里把整个环境配置流程完整写一遍照着做基本不会出问题。第一步安装Python环境。推荐用Anaconda管理虚拟环境避免系统自带Python被污染。进入Anaconda Prompt后执行conda create -n bearing python3.10 conda activate bearing第二步安装PyTorch。关键是根据你的CUDA版本选择对应的安装命令。可以先执行nvidia-smi查看CUDA版本然后到PyTorch官网用生成器获取对应的pip安装命令。以CUDA 11.8为例pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118没装CUDA的机器用CPU版即可把--index-url参数去掉就行。第三步安装其他依赖pip install numpy pandas scipy matplotlib scikit-learn pyqt5 joblib装完之后运行python -c import torch; print(torch.__version__, torch.cuda.is_available())输出True说明GPU可用。5.2 数据集导入与解压避坑这里专门说说项目包和数据集解压的事因为我在传递和接收这个项目zip包的过程中踩过不少坑。项目发布时一般会压成一个zip压缩包包含源代码、模型权重和说明文档。我自己碰过三种情况情况一提示file is not a zip file。这是最典型的问题。压缩包后缀是zip但实际文件不是标准zip格式可能是用7z或其他工具压缩但改了后缀也可能文件本身损坏。解决办法先不要双击用file命令macOS/Linux或7z l命令Windows装了7-Zip后查看真实格式。如果是RAR格式用WinRAR/7-Zip解压即可。情况二提示invalid zip archive: could not find eocd。EOCD是zip格式的中央目录结束记录这个报错说明压缩包的末尾记录缺失常见原因是下载过程中文件被截断多发生在用网盘、QQ传文件等场景。解决办法是重新传输或下载完整文件同时检查文件大小是否与源文件一致。如果传输工具支持断点续传建议用支持完整校验的方式重新传一次。情况三多分卷zipz01/z02zip。大文件传输时可能被拆成多个分卷解压时提示需要z01文件。遇到这种情况把所有分卷文件放在同一个文件夹下用7-Zip选择第一个.zip文件解压它会自动识别同目录的.z01分卷文件。不要用Windows自带的解压工具它对分卷支持很差。情况四zip密码问题。有些项目包加密了解压要求输入密码。正常情况找发布者要密码如果是自己忘了密码目前没有可靠的暴力破解工具建议不要浪费时间直接联系原作者重新获取。对于数据集本身的解压同样遵循上述规则。CWRU数据集有时会以多个压缩包形式分发解压后的.mat文件要统一放在dataset/目录下目录结构保持清晰平台代码才能自动扫描。5.3 快速启动与训练命令解压完成后目录结构是这样的bearing-fault-platform/ ├── main.py # 平台入口 ├── train.py # 训练脚本 ├── preprocess.py # 数据预处理模块 ├── models/ │ └── cnn1d.py # 1D-CNN网络定义 ├── dataset/ # 数据集目录 ├── checkpoints/ # 模型权重保存目录 └── requirements.txt # 依赖清单训练命令很简单python train.py --data_dir ./dataset --epochs 100 --batch_size 64 --lr 3e-4 --output ./checkpoints启动图形界面python main.py图形界面操作流程选择数据集目录 → 点击预处理→ 选择训练模式并设置超参数 → 点击开始训练→ 训练完成后进入诊断测试加载模型权重选择待诊断信号文件点击识别界面显示故障类型和置信度。5.4 模型推理与结果解读模型训练好之后推理阶段把模型导出为best_model.pth加载方式import torch from models.cnn1d import BearingCNN1D model BearingCNN1D(num_classes4) model.load_state_dict(torch.load(checkpoints/best_model.pth, map_locationcpu)) model.eval()推理时需要注意模型在训练和推理模式下的差异训练时Dropout和BN层的行为是随机的推理时必须切换到eval()模式否则每一次推理结果都会抖动。这个坑很隐蔽我调试了很久才发现。结果解读方面平台输出的是每个类别的概率值。判断逻辑最大概率值超过阈值默认0.6才输出对应故障类型否则提示置信度不足建议重新采集信号。为什么要设这个阈值因为模型对未见过工况的数据可能给出错误的过高置信度设置阈值能有效过滤不可靠判断降低误报率。6. 常见问题与排查技巧实录6.1 环境配置类问题排查问题现象ubuntu系统安装深度学习驱动后没反应。排查思路分四步输入nvidia-smi如果提示command not found说明驱动没装上或PATH没配置好输入dpkg -l | grep nvidia检查驱动包是否实际安装输入nvcc -V检查CUDA Toolkit是否安装。注意nvidia-smi显示的CUDA版本是驱动的支持版本nvcc显示的是实际安装的Toolkit版本两者不一致很常见PyTorch以Toolkit版本为准如果驱动装了但PyTorch报错CUDA driver version is insufficient说明驱动版本太旧去官方网站下载新驱动重装问题现象torch导入后torch.cuda.is_available()返回False。原因通常有两个一是安装的是CPU版PyTorch卸了重装对应CUDA版本二是PyTorch版本与CUDA版本不匹配。我的建议直接卸载重装。pip uninstall torch torchvision torchaudio pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu1216.2 数据与训练类问题排查问题现象训练准确率高但测试准确率低。这是典型的过拟合。优先检查三件事是否按文件划分数据而不是按样本划分数据泄漏问题是否加了Dropout和权重衰减训练样本量是否太少。我通常的解决方案是增加数据增强加噪、增大Dropout比例从0.5调到0.6、减小模型复杂度减少卷积核数。问题现象loss在训练初期是nan。原因一般是学习率过大、输入数据包含NaN值或者梯度爆炸。排查顺序先检查输入数据是否有NaNnp.isnan(data).any()再降低学习率到1e-5看是否恢复正常最后检查网络里是否有除零操作。问题现象训练集和验证集准确率都很高但实际采集的数据识别不准。这是领域漂移问题。实验室数据分布和现场数据分布不同模型没见过现场噪声和工况变化。我的建议是采集少量现场数据做微调fine-tuning冻结前几层卷积用新数据训练后几层和分类头。平台里预留了微调接口可以直接用。6.3 压缩包与文件传输等日常问题速查报错/现象原因解决办法file is not a zip file文件格式不对或损坏file命令查真实格式用正确工具解压invalid zip archive: could not find eocdzip文件末尾记录缺失/下载截断重新传输对比文件大小或MD5z01和zip怎么一起解压多分卷压缩全部放同目录用7-Zip选主zip解压解压需要密码压缩包加密联系发布者获取不太可能暴力破解导入资源包失败 caused by invalid zip archive导入时exe/平台工具解析失败先手动解压成文件夹再导入或在IDE/平台中确认路径关于zip文件在Linux下的操作顺手补充几个常用命令。压缩zip -r project.zip ./project_folder解压unzip project.zip -d ./output_dir修复损坏的zip包zip -F damaged.zip --out repaired.zipzip -FF比zip -F的修复能力更强但需要更多磁盘空间。实测经验如果损坏面积大修复出来的文件可能不完整宁可重新下载。GitHub上下载的zip包解压后在conda环境中安装可以先解压再进目录执行pip install -e .或者直接pip install 包名.zip。6.4 平台运行期问题的踩坑记录问题一训练时GPU显存不足OOM。解决方案把batch size从64降到32或16如果还不行把输入窗口长度从1024降到512。不要在代码里开太多Matplotlib窗口绘图也会吃显存。问题二图形界面卡死。PyQt界面的主线程和训练线程冲突是最常见的原因。训练必须在独立线程中运行不能直接在主线程里跑否则界面会无响应。平台代码里用了QThread实现了训练任务的异步执行如果你自己改编代码务必注意线程这一块。问题三CWRU数据不同负载下效果差异大。0hp、1hp、2hp、3hp负载下的数据分布不同如果只用0hp数据训练换到3hp数据测试准确率会明显下降。解决方案把不同负载的数据都纳入训练集或者采用域适应方法减少不同工况间的分布差异。我在平台中用了一个简单的策略——把所有负载数据混合后按工况文件划分让模型见过多种负载条件下的特征变化效果好了很多。7. 更进一步平台还能怎么扩展这套平台目前完成的是基础的故障分类但实际上深度学习在轴承故障诊断上的应用远不止于此。我整理了几个后续值得扩展的方向。剩余使用寿命预测。故障分类是定性判断RUL预测是定量判断——轴承还能用多久。把回归头接到特征提取网络后面用均方误差损失训练就可以从判断什么故障升级到预测剩余寿命。数据需要带时间戳的退化过程数据比如全寿命轴承试验台采集的数据。我自己测试过用这个平台的特征提取层做迁移学习效果比从零训练好不少收敛速度快多了。变工况泛化能力提升。工业现场转速是变化的训练时用1500rpm数据实际设备可能跑3000rpm。处理办法包括多工况联合训练、对抗域适应Domain Adversarial Neural Network、以及时频域特征对齐。建议优先尝试多工况训练简单直接效果提升明显。边缘部署。很多现场没有GPU服务器需要把模型部署到嵌入式设备或工控机上。PyTorch模型可以转换成ONNX格式或TensorRT格式在Jetson系列设备上跑推理。模型压缩方面量化Quantization能把模型体积缩小4倍推理速度提升明显精度损失通常控制在1%以内。异常检测无监督方案。工业场景的痛点之一是故障样本少甚至没有故障样本。这时候可以用自动编码器Autoencoder做异常检测——只用正常状态数据训练重构模型模型对正常信号的重构误差小对异常信号的重构误差大通过设定阈值就能识别异常。这个方法对样本标注的要求低很多落地性强。我个人在实际项目中的体会是这套平台的价值不在于模型结构多新颖而在于把数据 → 训练 → 诊断这条链路完整地跑通了。做过故障诊断的人都知道真正的瓶颈不在算法而在数据和工程化——数据怎么清洗、怎么切分、怎么避免泄漏、模型怎么部署、结果怎么解读每一步都有坑。把这些细节处理好深度学习模型才能从论文里的漂亮指标变成现场真正能用的工具。最后再分享一个小技巧训练完模型后别急着删训练日志和权重文件。用joblib或torch.save把数据标准化时用到的均值和标准差一并保存下来推理时用同一组统计量做标准化。这个细节能避免一个很尴尬的问题——训练时准确率99%上了现场却崩溃一查发现是标准化参数没对上。把这些元数据一起打包进模型文件才算一个真正可以交付的诊断平台。本文还有配套的精品资源点击获取