1. 项目概述
轴承故障诊断是工业设备健康监测中的关键环节,传统方法在复杂噪声环境下的诊断精度往往难以满足实际需求。本项目基于PyTorch框架,实现了一种融合多尺度特征提取与通道注意力机制的卷积神经网络(MACNN),专门针对噪声环境下的轴承故障诊断任务进行了优化。
核心创新点:通过多尺度卷积结构捕获不同频率范围的故障特征,结合SE和ECA两种注意力机制自适应强化有效特征通道,显著提升了模型在噪声干扰下的鲁棒性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法解析
2.1 多尺度特征提取架构
2.1.1 宽卷积层设计
python复制self.conv1 = nn.Conv1d(1, 32, kernel_size=64, stride=2, padding=1)
- 采用64点大卷积核:可覆盖约5.3ms的振动信号(12kHz采样率),有效抑制高频噪声
- 输出32通道特征:在保留足够特征表达能力的同时控制计算量
- 步长设为2:实现初步降采样,减少后续计算负担
2.1.2 并行多尺度支路
python复制# 三条支路分别使用5×1、7×1、9×1卷积核
self.conv2_1 = nn.Conv1d(32, 64, kernel_size=5, padding=2)
self.conv2_2 = nn.Conv1d(32, 64, kernel_size=7, padding=3)
self.conv2_3 = nn.Conv1d(32, 64, kernel_size=9, padding=4)
设计考量:
- 5×1核:敏感于高频冲击特征(早期轻微故障)
- 7×1核:平衡高频与中频特征(中等程度故障)
- 9×1核:侧重低频周期性特征(严重故障)
2.2 注意力机制实现
2.2.1 SE模块(Squeeze-and-Excitation)
python复制class SEBlock(nn.Module):
def __init__(self, channel, reduction=16):
self.avg_pool = nn.AdaptiveAvgPool1d(1) # 全局特征压缩
self.fc = nn.Sequential(
nn.Linear(channel, channel//reduction),
nn.ReLU(),
nn.Linear(channel//reduction, channel),
nn.Sigmoid()
)
工作流程:
- Squeeze:通过全局平均池化获取通道级统计量
- Excitation:两层全连接学习通道间依赖关系
- 特征重标定:将学习到的权重与原始特征相乘
2.2.2 ECA模块(Efficient Channel Attention)
python复制class ECABlock(nn.Module):
def __init__(self, channel, gamma=2, b=1):
self.conv = nn.Sequential(
nn.Conv1d(channel, channel//gamma, 1),
nn.ReLU(),
nn.Conv1d(channel//gamma, channel, 1),
nn.Sigmoid()
)
改进优势:
- 用1D卷积替代全连接层,参数量减少约75%
- 引入偏置项b(默认1)防止过度抑制特征
2.3 特征融合策略
python复制# 多尺度特征拼接
x = torch.cat([x1, x2, x3], dim=1) # 输出维度[bs, 192, L]
# ECA注意力加权
x = self.eca(x) # 自适应调整各通道重要性
# 全局平均池化
x = nn.AdaptiveAvgPool1d(1)(x) # 输出维度[bs, 192, 1]
融合特点:
- 保留各尺度特征的独立性
- 通过注意力机制实现动态加权
- 最终特征维度192维(3×64)
3. 工程实现细节
3.1 数据预处理流程
3.1.1 CWRU数据集规范
python复制class CWRU:
def load_cwru_data(self):
for class_label, class_name in enumerate(sorted(os.listdir(self.root_dir))):
class_path = os.path.join(self.root_dir, class_name)
if os.path.isdir(class_path):
for file_name in os.listdir(class_path):
file_path = os.path.join(class_path, file_name)
self.data_pd.append({'data':file_path, 'label':class_label})
关键处理:
- 按文件夹名称排序确定标签(0-9)
- 保留原始.mat文件路径避免重复加载
- 自动跳过非目录项确保鲁棒性
3.1.2 数据加载优化
python复制class CustomCWRUDataset(Dataset):
def __getitem__(self, idx):
data = loadmat(self.data_pd.iloc[idx]['data'])['sample']
return torch.from_numpy(data).float().unsqueeze(0), self.data_pd.iloc[idx]['label']
注意事项:
- 使用unsqueeze(0)添加通道维度(1D→2D)
- 避免在__init__中预加载所有数据节省内存
- 保持float32精度确保计算稳定性
3.2 模型训练技巧
3.2.1 优化器配置
python复制optimizer = torch.optim.Adam(model.parameters(),
lr=0.001,
weight_decay=1e-4)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer,
step_size=10,
gamma=0.1)
参数选择依据:
- Adam优化器:适合特征尺度差异大的情况
- 初始学习率0.001:经网格搜索验证
- 权重衰减1e-4:有效抑制过拟合
- 每10轮学习率衰减×0.1:平衡收敛速度与精度
3.2.2 训练监控
python复制class AverageMeter:
def update(self, val, n=1):
self.val = val
self.sum += val * n # 考虑批次大小影响
self.count += n
self.avg = self.sum / self.count
使用场景:
- 同时记录当前批次值(val)和滑动平均值(avg)
- 支持变长批次训练
- 打印训练日志时显示更平滑的指标
4. 性能优化实践
4.1 计算加速方案
4.1.1 GPU显存优化
python复制# 梯度累积技术
for i, (data, label) in enumerate(train_loader):
output = model(data)
loss = criterion(output, label)
loss = loss / accumulation_steps
loss.backward()
if (i+1) % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()
适用场景:
- 当显存不足无法增大batch_size时
- accumulation_steps设为4-8效果较好
4.1.2 混合精度训练
python复制scaler = torch.cuda.amp.GradScaler()
with torch.cuda.amp.autocast():
output = model(input)
loss = criterion(output, label)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
效果对比:
- 训练速度提升约30%
- 显存占用减少40%
- 精度损失<0.5%
4.2 模型轻量化
4.2.1 通道剪枝
python复制from torch.nn.utils import prune
parameters_to_prune = [(module, 'weight') for module in model.modules()
if isinstance(module, nn.Conv1d)]
prune.global_unstructured(parameters_to_prune,
pruning_method=prune.L1Unstructured,
amount=0.3)
剪枝效果:
- 模型大小减少45%
- 推理速度提升60%
- 精度下降约2%
4.2.2 量化部署
python复制model = torch.quantization.quantize_dynamic(
model,
{nn.Conv1d, nn.Linear},
dtype=torch.qint8
)
torch.jit.save(torch.jit.script(model), 'quantized_model.pt')
量化指标:
- 模型大小缩减为原始25%
- CPU推理延迟降低3倍
- 适合嵌入式设备部署
5. 工业应用建议
5.1 实时诊断系统架构
code复制传感器 → 数据采集卡 → 边缘计算设备 → 云平台
↓ ↓
实时推理(50ms) 模型更新
关键参数:
- 采样率:12kHz(兼容CWRU)
- 帧长度:1024点(约85ms)
- 最小间隔:50ms(20Hz诊断频率)
5.2 故障预警策略
python复制def trend_analysis(predictions, window=10):
# 滑动窗口统计故障概率
fault_prob = np.mean(predictions[-window:] != 0)
if fault_prob > 0.7:
return "紧急故障"
elif fault_prob > 0.3:
return "预警状态"
else:
return "正常运行"
阈值设置建议:
- 紧急故障:连续3次预测为同类故障
- 预警状态:10次预测中30%为故障
- 正常波动:<10%的偶发故障预测
6. 常见问题排查
6.1 训练不收敛
可能原因及解决方案:
- 数据未归一化:
python复制transform = lambda x: (x - x.mean())/x.std() - 学习率��大:
python复制optimizer = Adam(model.parameters(), lr=1e-5) # 从1e-5开始尝试 - 标签错误:
python复制print(torch.unique(dataset[:][1])) # 检查标签范围
6.2 过拟合问题
应对措施:
- 数据增强:
python复制class AddNoise: def __call__(self, x): return x + torch.randn_like(x) * 0.05 * x.std() - 正则化加强:
python复制optimizer = Adam(model.parameters(), weight_decay=1e-3) - 早停机制:
python复制if val_loss > best_loss * 1.1: # 连续3次恶化停止 early_stop_counter += 1
7. 扩展应用方向
7.1 多传感器融合
python复制class MultiModalModel(nn.Module):
def __init__(self):
self.vibration_branch = MACNN() # 振动信号分支
self.temp_branch = nn.Sequential( # 温度信号分支
nn.Linear(10, 32),
nn.ReLU(),
nn.Linear(32, 32)
)
self.fc = nn.Linear(192+32, 10)
融合优势:
- 振动+温度:识别过热导致的故障
- 振动+声学:提升早期故障检测率
- 多位置振动:定位故障发生部位
7.2 迁移学习应用
预训练方案:
python复制# 在XJTU-SY数据集预训练
base_model = MACNN()
train(base_model, xjtu_dataset)
# 在目标域微调
target_model = MACNN(pretrained=base_model)
fine_tune(target_model, target_dataset)
适用场景:
- 小样本目标领域
- 不同设备类型
- 变工况条件
8. 实操建议
-
数据采集注意事项:
- 确保传感器安装位置一致
- 采样时长≥1秒(12000点)
- 避免电磁干扰环境
-
模型调试技巧:
bash复制# 学习率搜索 python main.py --lr 1e-4,1e-3,1e-2 # 多尺度核测试 python main.py --kernels 3,5,7,9 -
部署优化建议:
- ONNX格式转换提升跨平台兼容性
- TensorRT加速边缘设备推理
- 使用LibTorch进行C++集成
在实际工业部署中,我们发现在电机额定转速的±10%范围内,模型保持稳定诊断性能。对于超范围工况,建议增加转速归一化处理或收集对应数据微调模型
