1. 项目概述与背景
轴承故障诊断一直是工业设备健康监测领域的重要课题。传统方法依赖专家经验和信号处理技术,而基于深度学习的端到端诊断方案正在成为主流。这个项目实现了一种基于一维WDCNN(Wide Deep Convolutional Neural Network)的轴承故障诊断系统,能够自动从原始振动信号中提取特征并完成十种故障类型的分类。
项目采用Python语言和TensorFlow框架开发,数据集来自业界广泛使用的CWRU轴承数据集。整个方案最大的特点是"开箱即用"——压缩包内包含完整的数据集和代码,解压后无需复杂配置即可运行。对于刚接触故障诊断领域的新手来说,这种设计大大降低了学习门槛。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境配置与数据准备
2.1 运行环境搭建
项目对运行环境的要求相对宽松:
bash复制pip install tensorflow>=2.4.0
建议使用Python 3.7-3.9版本以获得最佳兼容性。如果需要进行GPU加速,还需要安装对应版本的CUDA和cuDNN。实测在RTX 3060显卡上,单个epoch的训练时间约为30秒。
注意:TensorFlow 2.x默认启用eager execution模式,这与早期版本的行为有所不同。如果遇到兼容性问题,可以尝试在代码开头添加
tf.compat.v1.disable_eager_execution()。
2.2 数据集解析
项目使用的CWRU轴承数据集包含四种负载条件(0HP、1HP、2HP、3HP)下的振动信号,每种负载包含10类故障状态:
- 正常状态(Normal)
- 内圈故障(Inner Race Fault)
- 外圈故障(Outer Race Fault)
- 滚动体故障(Ball Fault)
- 复合故障(Combined Faults)
每种故障又细分为不同损伤程度(0.007英寸、0.014英寸、0.021英寸)。数据采集频率为12kHz,每个样本包含1024个数据点。
数据集目录结构示例(以0HP为例):
code复制data/
└── 0HP/
├── normal_0.mat
├── inner_0.007.mat
├── outer_0.007.mat
├── ball_0.007.mat
└── ...
3. 模型架构与技术细节
3.1 WDCNN网络结构
WDCNN的核心创新在于其独特的宽-深卷积结构:
python复制def build_model(input_shape=(1024, 1), num_classes=10):
inputs = Input(shape=input_shape)
# 宽卷积部分(提取局部特征)
x = Conv1D(16, 64, strides=16, padding='same', activation='relu')(inputs)
x = MaxPooling1D(2)(x)
# 深卷积部分(提取全局特征)
for filters in [32, 64, 64, 64, 64]:
x = Conv1D(filters, 3, padding='same', activation='relu')(x)
x = MaxPooling1D(2)(x)
x = Flatten()(x)
x = Dense(100, activation='relu')(x)
outputs = Dense(num_classes, activation='softmax')(x)
return Model(inputs, outputs)
模型的关键设计点:
- 第一层使用大卷积核(64)和大幅步长(16),快速降低时间分辨率
- 后续使用小卷积核(3)进行精细特征提取
- 交替使用卷积和池化层逐步压缩特征维度
- 最终通过全连接层实现分类
3.2 数据预处理流程
preprocess.py完成了以下关键处理步骤:
- 数据加载:读取.mat文件中的振动信号
- 样本分割:将长时序信号切分为1024点的片段
- 数据增强:通过滑动窗口增加样本多样性
- 归一化:将信号幅度缩放到[-1,1]范围
- 标签生成:根据文件名自动生成one-hot编码标签
预处理后的数据格式为:
- 训练集:X_train (n_samples, 1024, 1)
- 测试集:X_test (n_samples, 1024, 1)
- 标签:y_train/y_test (n_samples, 10)
4. 模型训练与评估
4.1 训练配置
主程序(如main_0HP.py)包含完整的训练流程:
python复制model = build_model()
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(
X_train, y_train,
batch_size=128,
epochs=50,
validation_split=0.2,
callbacks=[EarlyStopping(patience=5)]
)
关键参数说明:
- Batch size:128(平衡内存占用和梯度稳定性)
- 优化器:Adam(默认学习率0.001)
- 早停机制:连续5个epoch验证集loss不下降则终止训练
4.2 性能评估指标
项目提供了多种评估方式:
- 训练曲线:监控loss和accuracy的收敛情况
- 混淆矩阵:直观展示各类别的识别情况
- 特征可视化:通过t-SNE展示特征空间分布
典型性能指标(0HP数据集):
- 训练准确率:99.2%
- 验证准确率:98.7%
- 测试准确率:98.5%
5. 关键问题与解决方案
5.1 类别不平衡问题
原始数据中不同故障类型的样本数量可能存在差异。解决方案:
python复制from sklearn.utils import class_weight
class_weights = class_weight.compute_class_weight(
'balanced',
classes=np.unique(y_train),
y=y_train
)
model.fit(..., class_weight=class_weights)
5.2 过拟合抑制
WDCNN容易在小样本数据上过拟合,推荐以下策略:
- 添加Dropout层(rate=0.5)
- 使用L2正则化(weight_decay=1e-4)
- 数据增强(随机时间偏移)
5.3 跨负载泛化
模型在不同负载条件下的表现可能有差异。可以通过以下方式提升泛化能力:
- 混合多负载数据训练
- 使用域自适应技术
- 添加负载条件作为额外输入特征
6. 扩展应用与改进方向
6.1 工业部署建议
要将模型应用于实际产线,需要考虑:
- 实时性要求:优化模型计算量
- 数据采集:确保信号质量
- 持续学习:建立模型更新机制
6.2 可能的改进方向
- 架构优化:尝试ResNet或Transformer结构
- 多模态融合:结合温度、声音等信号
- 异常检测:在未知故障类型时发出预警
实操建议:在修改网络结构时,建议先在小规模数据上快速验证想法,再扩展到完整数据集。可以使用
%timeit魔法命令测量单次推理耗时。
