手把手复现:基于Python和PyTorch的轴承变工况故障诊断实战(附渥太华大学数据集完整处理代码) 基于Python和PyTorch的轴承变工况故障诊断实战指南轴承作为旋转机械的核心部件其健康状态直接影响设备运行安全。传统故障诊断方法在恒定工况下表现良好但面对转速变化的实际工业场景往往力不从心。本文将带您从零开始构建一个完整的变工况轴承故障诊断系统使用Python生态工具链处理高频振动数据并基于PyTorch实现端到端的智能诊断模型。1. 环境准备与数据加载在开始之前我们需要配置合适的Python环境。推荐使用Anaconda创建独立环境以避免依赖冲突conda create -n bearing_diagnosis python3.8 conda activate bearing_diagnosis pip install torch scipy matplotlib pandas scikit-learn渥太华大学数据集采用MATLAB的.mat格式存储Python中可通过scipy.io模块读取import scipy.io as sio def load_mat_file(filepath): 加载.mat文件并提取振动和转速信号 data sio.loadmat(filepath) vibration data[Channel_1].flatten() # 振动信号 rpm data[Channel_2].flatten() # 转速信号 return vibration, rpm注意处理大文件时可能遇到内存不足问题可考虑分块读取或使用h5py库处理HDF5格式的.mat文件2. 信号预处理与工况划分原始振动信号的采样频率高达200kHz直接处理计算量巨大。合理的降采样策略能显著提升效率from scipy import signal def resample_signal(data, original_fs, target_fs): 降采样信号 ratio target_fs / original_fs return signal.resample(data, int(len(data) * ratio))工况划分是变工况诊断的关键步骤。我们根据转速信号的变化特征识别四种工况类型工况代码描述转速变化特征A升速单调递增B减速单调递减C升速再减速先增后减D减速再升速先减后增def identify_operating_condition(rpm, threshold50): 识别当前数据段所属工况类型 diff np.diff(rpm) increasing np.sum(diff threshold) decreasing np.sum(diff -threshold) if increasing 0.8 * len(diff) and decreasing 0.1 * len(diff): return A elif decreasing 0.8 * len(diff) and increasing 0.1 * len(diff): return B # 其他工况判断逻辑...3. 特征工程与数据增强针对高频振动信号时频域特征提取能有效表征故障信息def extract_features(signal, fs): 提取时频域特征 features {} # 时域特征 features[rms] np.sqrt(np.mean(signal**2)) features[kurtosis] stats.kurtosis(signal) # 频域特征 f, Pxx signal.welch(signal, fs) features[peak_freq] f[np.argmax(Pxx)] return features考虑到实际数据量有限可采用以下数据增强策略时域随机裁剪添加高斯噪声随机缩放幅度频域随机滤波4. 深度学习模型构建我们实现一个兼顾CNN和LSTM优势的混合模型import torch.nn as nn class HybridModel(nn.Module): def __init__(self, num_classes5): super().__init__() self.cnn nn.Sequential( nn.Conv1d(1, 32, kernel_size5, stride2), nn.BatchNorm1d(32), nn.ReLU(), nn.MaxPool1d(2), # 更多卷积层... ) self.lstm nn.LSTM(input_size32, hidden_size64, batch_firstTrue) self.classifier nn.Linear(64, num_classes) def forward(self, x): x self.cnn(x) x x.permute(0, 2, 1) # 调整维度适应LSTM _, (h_n, _) self.lstm(x) return self.classifier(h_n[-1])模型训练时需特别注意类别不平衡问题from torch.utils.data import WeightedRandomSampler # 计算类别权重 class_counts np.bincount(labels) weights 1. / class_counts samples_weights weights[labels] sampler WeightedRandomSampler(samples_weights, len(samples_weights))5. 结果可视化与模型解释直观的故障诊断结果展示能增强模型可信度import matplotlib.pyplot as plt def plot_confusion_matrix(cm, classes): plt.imshow(cm, interpolationnearest, cmapplt.cm.Blues) plt.title(Confusion Matrix) plt.colorbar() plt.xticks(np.arange(len(classes)), classes) plt.yticks(np.arange(len(classes)), classes) # 添加数值标签...对于关键故障样本可借助Grad-CAM技术可视化模型关注区域class GradCAM: def __init__(self, model, target_layer): self.model model self.gradients None self.activations None # 注册钩子获取梯度... def forward(self, x): return self.model(x) def __call__(self, x): return self.forward(x)6. 工程实践中的常见问题在实际部署中我们积累了一些宝贵经验内存优化技巧使用torch.utils.data.Dataset的懒加载机制启用pin_memory加速GPU数据传输采用混合精度训练模型轻量化策略知识蒸馏通道剪枝量化感知训练实时性保障滑动窗口处理模型并行化预处理流水线优化# 实时推理示例 def real_time_inference(model, buffer): while True: data get_new_data() # 从传感器获取新数据 buffer.update(data) if buffer.ready(): x preprocess(buffer.get_window()) y model(x) postprocess(y)经过多次项目迭代发现最影响模型性能的因素是工况划分的准确性。一个实用的建议是在转速变化剧烈区域适当增加重叠窗口确保过渡阶段的故障特征不被遗漏。