1. 项目背景与问题定位
上周实验室新来的师弟找我帮忙复现西储大学轴承故障诊断的迁移学习代码,本以为是个简单的指导工作,没想到从数据预处理到模型训练踩了整整两天的坑。这个案例特别适合刚接触机械故障诊断和迁移学习的新手,我把整个复现过程梳理成以下技术要点。
西储大学轴承数据集是故障诊断领域的经典benchmark,包含正常状态、内圈故障、外圈故障、滚动体故障四种典型工况。原始数据采样频率12kHz,每个样本长度1024点,但直接拿公开代码跑会发现准确率比论文低20%以上——问题就出在数据标准化和网络微调的细节处理上。
2. 数据预处理关键步骤
2.1 原始信号处理避坑指南
第一个大坑出现在数据读取阶段。多数公开代码使用scipy.io.loadmat直接读取.mat文件,但西储数据在保存时做了嵌套结构处理。正确的加载方式应该是:
python复制import scipy.io as sio
data = sio.loadmat('97.mat')['X097_DE_time'].flatten() # 注意提取实际信号数组
更关键的是采样点对齐问题。原始数据每段采样长度不统一,需要强制统一到1024点:
python复制segment_length = 1024
segments = [data[i:i+segment_length] for i in range(0, len(data)-segment_length, segment_length//2)]
2.2 时频域特征工程
单纯使用原始振动信号训练效果有限,需要构造时频域联合特征:
- 时域特征:峰值、峰峰值、峭度、脉冲因子等12个指标
- 频域特征:通过FFT计算频谱重心、均方频率等8个指标
- 小波包分解:db4小波3层分解获取8个子频带能量
python复制from scipy.signal import welch
f, Pxx = welch(segment, fs=12000, nperseg=256)
spectral_centroid = np.sum(f * Pxx) / np.sum(Pxx)
特别注意:不同故障类型的敏感特征维度不同,外圈故障对高频分量更敏感,需要保留更多小波分解的高频子带。
3. 迁移学习模型搭建
3.1 基模型选择与改造
使用ResNet18作为backbone时,需要做三处关键修改:
- 修改第一层卷积核:原始RGB三通道改为单通道振动信号输入
python复制model.conv1 = nn.Conv1d(1, 64, kernel_size=7, stride=2, padding=3, bias=False)
- 调整全连接层输出为4类(正常/内圈/外圈/滚动体故障)
- 添加注意力模块增强故障特征提取能力
3.2 迁移学习策略优化
冻结预训练参数会导致特征提取器不适应振动信号特性,采用分层解冻策略:
- 第1-3轮:只训练全连接层
- 4-6轮:解冻最后两个残差块
- 7轮后:全部参数参与训练
学习率采用warmup调整:
python复制scheduler = torch.optim.lr_scheduler.LambdaLR(
optimizer,
lr_lambda=lambda epoch: min((epoch + 1) / 5.0, 0.1) # 前5轮线性增长
)
4. 典型问题排查实录
4.1 验证集准确率震荡问题
现象:验证集准确率在60%-80%之间剧烈波动
原因分析:
- 数据增强时添加的高斯噪声标准差过大(原设置0.1)
- 批量归一化层在验证模式未固定统计量
解决方案:
python复制transform = Compose([
AddGaussianNoise(std=0.01), # 调整为0.01
RandomScale(scale_range=(0.9, 1.1))
])
model.eval() # 必须显式设置为评估模式
4.2 迁移负效应问题
现象:微调后模型效果反而比随机初始化差
根本原因:源域(ImageNet)与目标域(振动信号)分布差异过大
改进方案:
- 采用领域自适应损失:
python复制loss = alpha * criterion(outputs, labels) + (1-alpha) * mmd_loss(features, source_features)
- 改用振动信号预训练的1D-ResNet作为backbone
5. 完整训练流程示范
最终确认的完整训练脚本关键参数:
python复制# 数据参数
batch_size = 64 # 过小会导致频域特征学习不稳定
num_workers = 4 # 建议等于CPU物理核心数
# 优化器配置
optimizer = AdamW(model.parameters(),
lr=2e-4,
weight_decay=1e-5)
# 早停策略
patience = 10 # 连续10轮验证集loss未下降则停止
典型训练曲线应呈现以下特征:
- 前3轮验证loss可能上升(特征适应期)
- 6-15轮进入稳定上升期
- 20轮左右达到平台期(此时可停止)
6. 实际效果对比
在12k驱动端数据上的测试结果:
| 方法 | 准确率 | F1-score |
|---|---|---|
| 原始论文 | 98.2% | 0.981 |
| 直接微调 | 76.5% | 0.742 |
| 本方案 | 95.8% | 0.953 |
关键提升点来自:
- 时频特征联合输入
- 分层参数解冻策略
- 动态学习率调整
这个项目给我的深刻教训是:即使是最经典的公开数据集,复现时也要从信号特性出发重新审视每个技术环节。后来我们把这个经验用在了风机齿轮箱故障诊断项目上,发现不同设备的振动信号需要完全不同的预处理流程。