卷积神经网络轴承故障诊断实战:WDCNN模型与CWRU数据预处理解析
发布时间:2026/9/10 2:56:10来源:尧图网络
简介这是一套基于卷积神经网络的轴承故障诊断算法模型研究项目源码面向计算机、人工智能与机器学习相关专业的学生或从业者适用于期末课程设计、课程大作业及入门实践主要解决轴承振动信号的特征提取与故障分类识别问题项目已通过导师评审并获得96分以上评价。项目共53个文件压缩包约45.24MB其中40个MAT数据文件按0HP、1HP、2HP、3HP等不同负载整理5个XML文件及配置文件用于工程环境配置3个Python脚本覆盖数据预处理、模型训练与主流程另有需求清单、运行日志、网络结构图等辅助材料。该项目经过严格调试可直接运行目前已吸引467人学习浏览。源码目录结构清晰既有完整训练数据与脚本也保留日志和配置信息可帮助读者系统掌握CNN在故障诊断中的应用思路、数据处理方法与参数调优细节作为期末大作业或毕业设计的参考范本尤为合适。1. 卷积神经网络轴承故障诊断为什么先谈感受野而不是准确率把卷积神经网络用在轴承故障诊断上真正难的不是搭一个能跑的模型而是让模型在负载变化、转速波动、噪声干扰下依然稳定。很多课程项目在CWRU轴承数据集上能跑到99%以上但换到实际工况、换一个负载条件准确率立刻掉到90%以下。这份源码之所以能拿95分以上核心不在网络有多深而在数据切分策略和WDCNN第一层宽卷积核结构对振动信号特性的适配——一维卷积核的感受野直接对应着轴承故障特征频率所在的频段这个设计比盲目堆层数重要得多。项目适合正在做机器学习期末大作业、毕业设计或者第一次接触故障诊断方向的学生它给了一条从原始振动信号到故障分类的完整链路数据预处理、样本切片、模型训练、结果可视化全都有不是只给一个训练好的权重文件。2. 从CWRU原始数据到训练样本preprocess.py的数据切片与标签策略2.1 原始数据为什么不能直接喂给网络凯斯西储大学CWRU轴承数据中心提供的原始数据是连续采集的振动加速度信号采样频率通常为12kHz或48kHz。每个文件里保存的是几十万甚至上百万个连续采样点如果直接把整段信号输入网络既无法构造足够的训练样本也会让模型学到大量与故障无关的位置信息。常见做法是采用滑动窗口切片把一个长序列切成固定长度的短样本每个短样本对应一个诊断标签。窗口长度和滑动步长的选择直接决定样本数量和样本质量。# preprocess.py 核心切片逻辑简化版 import numpy as np def sliding_window_slice(signal, window_size1024, stride512): 对原始振动信号做滑窗切片 :param signal: 一维振动信号数组 :param window_size: 每个样本的采样点数 :param stride: 窗口滑动步长 :return: 二维数组形状为 (样本数, window_size) samples [] total_len len(signal) for start in range(0, total_len - window_size 1, stride): samples.append(signal[start:start window_size]) return np.array(samples)这里的参数设计有一个容易被忽略的细节窗口长度1024对应着大约0.085秒的信号时长12kHz采样率下而轴承转频通常在30Hz左右一个旋转周期约0.033秒因此1024个点可以覆盖2到3个完整的旋转周期。如果窗口太短样本里可能只包含部分故障冲击模型学到的特征不完整如果窗口太长样本间重叠区域过多训练集和验证集之间会产生数据泄漏导致验证分数虚高。2.2 故障类别与负载工况的编码方式这个项目的data目录下面按0HP、1HP、2HP、3HP分了四个子目录对应电机负载从0马力到3马力四种工况。每个工况下保存的是不同故障位置和故障直径的振动数据。CWRU数据集中故障位置分为内圈故障IR、外圈故障OR和滚动体故障B故障直径有0.007英寸、0.014英寸和0.021英寸三档。加上正常状态Normal一个工况下可以构造出10类样本。# 标签映射表 label_map { normal_0: 0, # 正常状态 ir_0.007: 1, # 内圈故障 0.007英寸 ir_0.014: 2, # 内圈故障 0.014英寸 ir_0.021: 3, # 内圈故障 0.021英寸 or_0.007: 4, # 外圈故障 0.007英寸 or_0.014: 5, # 外圈故障 0.014英寸 or_0.021: 6, # 外圈故障 0.021英寸 b_0.007: 7, # 滚动体故障 0.007英寸 b_0.014: 8, # 滚动体故障 0.014英寸 b_0.021: 9 # 滚动体故障 0.021英寸 }注意如果外圈故障数据在采集时有不同的安装位置如6点钟方向、3点钟方向、12点钟方向不要把它们混在同一个类别里否则同一类样本内部的信号形态差异过大会干扰模型收敛。建议先按位置拆分或者只选用其中一种位置参与训练。2.3 数据划分方式决定你的泛化性能很多课程作业的常见错误是在切完所有样本后直接随机划分训练集和测试集。这会产生严重的数据泄漏同一个原始信号文件切出来的相邻样本高度相似随机划分后训练集和测试集里会出现几乎一样的样本测试准确率虚高。更严谨的做法是按文件划分——一个原始数据文件切出的所有样本只能进训练集或只能进测试集。划分方式训练集验证集测试集适用场景随机划分70%15%15%快速验证模型结构可用性按文件划分70%15%15%课程作业、论文实验推荐按工况划分用0HP训练用1HP验证用2HP、3HP测试跨负载泛化能力研究按工况划分是更严格也更接近实际工程需求的评估方式。实际生产环境中设备不可能只在固定负载下运行你不可能每次都采集到所有工况的数据去重新训练。如果只用0HP的数据训练直接拿去测2HP和3HP的数据准确率通常会下降5到15个百分点这个数字直接反映了模型的跨工况泛化能力有多强。3. 模型搭建与训练main.py中的WDCNN结构与关键参数3.1 为什么第一层要用宽卷积核这个项目的文件名里有wdcnn.png对应的是WDCNNWide Deep CNN宽度深度卷积神经网络结构。它在轴承故障诊断领域是一个经典baseline核心设计思想是第一层卷积使用较大的卷积核常见64或128后续层使用小卷积核3或5。原因是原始振动信号的采样率很高单点幅值的语义信息极少宽卷积核可以在第一个卷积层内覆盖足够长的信号片段相当于做了一次带学习的短时特征提取同时宽卷积核等效于一个低通滤波器可以抑制高频噪声。后续的小卷积核层则负责在更抽象的层次上捕捉故障冲击的时序模式。# main.py 中 WDCNN 模型结构Keras 实现示意 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv1D, MaxPooling1D, Flatten, Dense, Dropout def build_wdcnn(input_shape(1024, 1), num_classes10): model Sequential([ # 第一层宽卷积核感受野大直接覆盖原始信号 Conv1D(filters16, kernel_size64, strides8, paddingsame, activationrelu, input_shapeinput_shape), MaxPooling1D(pool_size2, strides2), # 第二层缩小卷积核提取更精细的局部特征 Conv1D(filters32, kernel_size3, strides1, paddingsame, activationrelu), MaxPooling1D(pool_size2, strides2), # 第三层继续加深 Conv1D(filters64, kernel_size3, strides1, paddingsame, activationrelu), MaxPooling1D(pool_size2, strides2), # 第四层特征图尺寸已经很小 Conv1D(filters128, kernel_size3, strides1, paddingsame, activationrelu), MaxPooling1D(pool_size2, strides2), Conv1D(filters256, kernel_size3, strides1, paddingsame, activationrelu), MaxPooling1D(pool_size2, strides2), Flatten(), Dense(100, activationrelu), Dropout(0.5), Dense(num_classes, activationsoftmax) ]) return model注意第一层卷积的strides设为了8和kernel_size64配合等效于用64个采样点做一次特征计算然后跳8个点。这比kernel_size64、strides1的计算量小很多而且由于步长较大每个卷积输出位置对应的信号片段几乎不重叠特征冗余度更低。常见的替代做法是kernel_size64、strides16样本长度为1024时第一层输出特征图的长度会更短后续网络层可以相应减少。3.2 训练参数怎么设置才不会跑偏模型编译时选择的优化器、学习率和损失函数对这个任务的收敛速度和最终准确率影响很大。轴承故障诊断本质上是一个多分类问题损失函数用categorical_crossentropy没有悬念。优化器方面Adam是默认选择但学习率不要用默认的0.001直接开跑建议先用一个较小的初始学习率如0.0005或0.0001配合学习率衰减策略。from tensorflow.keras.optimizers import Adam from tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping, ModelCheckpoint model.compile( optimizerAdam(learning_rate5e-4), losscategorical_crossentropy, metrics[accuracy] ) callbacks [ ReduceLROnPlateau( monitorval_loss, factor0.5, # 学习率每次衰减为原来的 1/2 patience5, # 连续5个epoch验证损失不降则衰减 min_lr1e-6, verbose1 ), EarlyStopping( monitorval_loss, patience10, # 连续10个epoch不改善就停止 restore_best_weightsTrue ), ModelCheckpoint( best_model.h5, monitorval_acc, save_best_onlyTrue, modemax ) ] history model.fit( x_train, y_train, batch_size64, epochs100, validation_data(x_val, y_val), callbackscallbacks, verbose1 )batch_size的选择要看样本数量和显存大小。CWRU数据集切成1024点样本后单个工况通常能产出数万样本batch_size64是一个稳妥值。如果显存紧张降到32如果样本量很大且模型收敛偏慢可以提到128但要注意batch_size过大会降低模型的泛化能力因为大batch的梯度方向更平滑更容易收敛到尖锐极小值。训练过程中重点观察val_loss而不是val_acc因为准确率对类别不平衡不敏感而loss能更精细地反映模型对每个类别的预测置信度变化。3.3 归一化方式对一维振动信号的影响数据预处理中另一个决定成败的步骤是归一化。常见的做法有两种Z-score标准化减去均值除以标准差和Min-Max归一化缩放到0到1之间。对于振动信号这种零均值、幅值基本对称的时序数据两种方式都能用但效果有差异。经验是Min-Max归一化到[-1, 1]区间比缩放到[0, 1]更好因为振动信号的正负幅值是对称的保留符号信息有助于模型学习到冲击特征的方向性。Z-score标准化的优势在于对异常幅值不敏感如果某个样本里有一个特别大的冲击峰值Min-Max会把所有其他数值压缩到一个很窄的区间导致信息损失。def normalize_signal(signal, modezscore): if mode zscore: mean np.mean(signal) std np.std(signal) return (signal - mean) / (std 1e-8) elif mode minmax: min_val np.min(signal) max_val np.max(signal) return 2.0 * (signal - min_val) / (max_val - min_val 1e-8) - 1.0一份好的数据预处理代码应该同时提供这两种方式并且把模式作为参数暴露出来方便对比实验。课程答辩的时候如果被问到为什么准确率高或者低归一化方式差异是最容易解释并且能立刻做对比实验的点。注意归一化统计量必须只在训练集上计算然后用训练集的均值和标准差去归一化验证集和测试集不能在全量数据上算统计量再划分那样会引入未来信息。4. 训练收敛与调参日志分析、学习率策略和过拟合排查4.1 从TensorBoard日志里看训练是否真的健康项目logs目录下有events.out.tfevents开头的文件这是TensorBoard的日志文件。训练完成后用下面命令启动TensorBoard可以把训练过程中的loss曲线、accuracy曲线、学习率变化过程全部可视化出来。tensorboard --logdirlogs打开浏览器访问http://localhost:6006主要看两个东西训练集loss和验证集loss的间距以及它们各自的变化趋势。如果训练集loss持续下降而验证集loss在某个epoch之后开始回升说明模型在第20到30个epoch左右开始过拟合这时候EarlyStopping应该已经介入。如果训练集loss和验证集loss从一开始就同步下降但下降速度很慢说明学习率偏小或者模型容量不足。如果两个loss都在下降但曲线呈锯齿状剧烈震荡说明batch_size偏小或学习率偏大,可以先把学习率降一半再试。4.2 准确率卡在某个值不动的排查顺序这是一个高频问题训练到某个epoch后准确率不再上升loss也不再下降。排查顺序应该是先看是不是类别不均衡导致的少数类准确率低再看是不是验证集和训练集分布不一致最后才考虑模型结构问题。# 类别准确率细分统计 from collections import Counter import numpy as np def per_class_accuracy(y_true, y_pred, class_names): y_true_label np.argmax(y_true, axis1) y_pred_label np.argmax(y_pred, axis1) for idx, name in enumerate(class_names): mask (y_true_label idx) if np.sum(mask) 0: acc np.mean(y_pred_label[mask] idx) print(f{name}: {acc * 100:.2f}%)CWRU数据集里外圈故障和滚动体故障这两类的信号特征比较接近如果模型在它们之间产生混淆准确率就会卡在92%到95%之间上不去。这时可以画混淆矩阵confusion matrix看看具体的误分类对。如果滚动体故障样本被大量误判为外圈故障可以先检查外圈故障数据是不是混入了多个安装位置。如果确认数据没问题再考虑在模型中加入注意力机制或增大滚动体故障样本的权重。4.3 跨负载验证用0HP训练在3HP上测试这个项目data目录下同时保留了四种负载的数据一个重要实验是把0HP数据切成训练集1HP做验证集2HP和3HP做测试集。这个实验能真实反映模型的工况泛化能力也是答辩时最容易被追问的点。用WDCNN跑这个实验时常见的准确率区间是95%到98%比同工况测试低1到3个百分点左右。如果出现大幅下降优先怀疑过拟合——模型把0HP工况下的噪声特征当成了故障特征。缓解手段是增加Dropout比例到0.6以上。5. 把预训练好的模型迁移到新数据上的三个实用技巧5.1 冻结前几层只微调分类头如果已经拿到这个项目里训练好的best_model.h5想把它用到自己采集的轴承数据上直接重训整个网络容易破坏已经学到的底层特征。常见做法是冻结前面的卷积层只重新训练全连接层和分类层。因为振动信号的基本特征冲击形态、频谱分布模式在不同轴承设备之间是通用的而故障类别映射关系才是需要重新学习的部分。from tensorflow.keras.models import load_model base_model load_model(best_model.h5) base_model.trainable False # 移除原分类层取特征提取部分 x base_model.layers[-3].output # Dropout层之前的Dense层输出 new_output Dense(num_classes, activationsoftmax, namenew_classifier)(x) from tensorflow.keras.models import Model new_model Model(inputsbase_model.input, outputsnew_output) new_model.compile(optimizerAdam(learning_rate1e-4), losscategorical_crossentropy, metrics[accuracy])微调阶段学习率一定要小因为只训练分类头时梯度不会传回底层用默认的0.001不会有太大问题但一旦后面解冻卷积层继续微调学习率必须降到1e-5量级否则会破坏预训练权重中的有效特征。5.2 用小步长切窗做数据增广增强鲁棒性迁移到新数据集时如果新数据样本量不够可以把切片步长从512缩小到256甚至128。步长减半意味着相同长度的原始信号能产出约一倍的样本虽然相邻样本的重叠区域增大但对扩充训练集规模和稳定模型收敛有帮助。需要注意用重叠样本做训练时验证集和测试集的切片步长应该保持不变否则验证结果的过拟合判断会被扭曲。5.3 输出中间层特征做故障机理验证最后分享一个验证模型是否真正学到物理特征的技巧取出最后一个卷积层的输出做全局平均池化Global Average Pooling再用t分布随机邻域嵌入t-SNE把高维特征压缩到二维平面可视化。如果同一故障类别的特征点聚成紧凑的簇不同类别之间有明显间隔说明模型学到了有效的判别特征如果特征是连续过渡的说明模型更多在依赖工况相关信息而不是故障本身。这也是wdcnn.png这张图通常展示的内容答辩时把这张图和解释讲清楚拿分效果远好于只贴准确率曲线。本文还有配套的精品资源点击获取
网站建设高端定制企业官网