1. 项目概述
最近帮实验室刚入门的师弟复现了西储大学轴承故障的迁移学习代码,本以为是个简单的任务,结果在实际操作中踩了不少坑。这个项目非常适合想要入门迁移学习的小伙伴练手,它使用简单的1D-CNN提取振动信号特征,再通过JDA(联合分布适配)进行域对齐,整个过程清晰易懂,能帮助初学者快速理解迁移学习的核心思想。
项目基于PyTorch框架实现,支持GPU加速(没有GPU也能用CPU运行),最终在CWRU轴承数据集上达到了99%的准确率。除了基本的分类任务外,还提供了损失曲线、准确率曲线、混淆矩阵和t-SNE可视化等丰富的输出结果,方便调试和分析模型性能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心思路解析
2.1 迁移学习在故障诊断中的应用
轴承故障诊断面临一个典型问题:在实验室环境下采集的故障数据(源域)与实际工作环境中的数据(目标域)存在分布差异。传统方法需要为目标域重新标注大量数据,而迁移学习则通过域适配技术,将源域学到的知识迁移到目标域。
本项目采用的JDA(Joint Distribution Adaptation)方法同时对齐边缘分布和条件分布:
- 边缘分布对齐:使源域和目标域的整体特征分布相似
- 条件分布对齐:使相同类别的样本在特征空间中靠近
2.2 技术路线设计
整个项目分为三个关键阶段:
- 数据预处理:将西储大学的振动信号转换为适合1D-CNN输入的格式
- 特征提取:使用双层1D-CNN从振动信号中提取高级特征
- 域适配:通过JDA损失函数对齐源域和目标域的特征分布
这种设计有以下几个优势:
- 1D-CNN结构简单,计算量小,适合处理振动信号
- JDA同时考虑全局和类别特定的分布差异,适配效果更好
- 整个流程模块化,便于理解和修改
3. 数据准备与预处理
3.1 CWRU数据集介绍
西储大学轴承数据集包含多种故障类型和工况:
- 故障类型:内圈故障、外圈故障、滚动体故障
- 故障直径:0.007英寸、0.014英寸、0.021英寸
- 负载条件:0hp、1hp、2hp、3hp
在本项目中,我们选择:
- 源域:负载0hp下的数据
- 目标域:负载1hp下的数据
3.2 数据预处理实现
原始数据是MATLAB格式的.mat文件,我们需要转换为PyTorch能直接处理的格式:
python复制import os
import torch
import numpy as np
from torch.utils.data import Dataset, DataLoader
class CWRUBearingDataset(Dataset):
def __init__(self, data_path, label_path, normalize=True):
self.data = np.load(data_path)
self.label = np.load(label_path)
if normalize:
self.data = (self.data - self.data.min()) / (self.data.max() - self.data.min())
self.data = torch.tensor(self.data, dtype=torch.float32).unsqueeze(1)
self.label = torch.tensor(self.label, dtype=torch.long)
def __len__(self):
return len(self.label)
def __getitem__(self, idx):
return self.data[idx], self.label[idx]
``
