压缩感知与迁移学习融合旋转机械故障检测【附源码】
1自适应字典学习与改进正交匹配追踪重构针对传统压缩感知中固定稀疏基对旋转机械振动信号适应性差的问题提出了一种基于K-SVD的自适应字典学习方法。该方法不依赖于预先定义的小波或傅里叶基而是直接从训练信号中学习得到过完备字典使字典原子能够更好匹配轴承或齿轮箱冲击故障的瞬态特征。在稀疏编码阶段采用改进的正交匹配追踪算法该算法在每次迭代中不仅选择与残差相关性最大的原子还引入一个正则化项来抑制原子之间的冗余从而加速收敛并提高重构精度。通过实验对比离散余弦变换在平稳信号上表现良好而自适应字典在冲击故障信号上的重构信噪比提高了3-5dB为后续故障分类提供了高质量的重构信号。2多域特征提取与迁移学习的联合优化为了充分利用压缩域中的故障信息设计了一个多域特征提取分支。在压缩感知框架中除了重构时域信号外还直接在测量域压缩后的信号上提取统计特征如方差、偏度、峭度以及基于随机投影的能量特征。这些测量域特征计算量小适合实时监测。同时对重构后的时域信号进行连续小波变换得到时频图再通过预训练的ResNet-18网络提取深度特征。为解决源域实验室数据与目标域现场数据分布不一致的问题引入迁移学习中的最大均值差异损失在深度特征的顶层添加MMD层迫使网络学习到域不变的特征表示。联合优化目标是分类损失加上MMD损失使得模型既保持高分类精度又具备跨域泛化能力。3轻量化迁移网络与多尺度注意力机制考虑到工业现场边缘设备的计算资源有限提出了一种轻量化的迁移学习网络——多层注意力残差网络。该网络使用深度可分离卷积代替标准卷积参数量减少约80%。在此基础上设计了多尺度挤压激励模块该模块并行使用不同尺度的全局池化包括平均池化、最大池化和均方根池化来捕获信号的多维统计特性并经过两个全连接层生成通道注意力权重。将注意力模块嵌入到每个残差块中使网络能够自适应地增强故障敏感特征。迁移策略采用微调方式先在大型源域数据集如CWRU上预训练然后冻结前两个残差块仅微调后三个残差块和分类层。在目标域每类仅30个样本的小样本条件下该模型达到了96.5%的诊断准确率验证了其高效性和鲁棒性。import torch import torch.nn as nn import numpy as np from sklearn.linear_model import OrthogonalMatchingPursuit # 改进的OMP重构带正则化 def improved_omp(y, D, sparsity10, reg_param0.01): y: 测量值D:字典返回稀疏系数 residual y.copy() support [] for _ in range(sparsity): correlations np.abs(D.T residual) # 正则化选择只保留大于最大相关值*reg_param的原子 threshold reg_param * np.max(correlations) candidates np.where(correlations threshold)[0] if len(candidates) 0: break # 候选原子中选相关性最大的 new_idx candidates[np.argmax(correlations[candidates])] support.append(new_idx) # 最小二乘更新系数 D_sub D[:, support] coef np.linalg.lstsq(D_sub, y, rcondNone)[0] residual y - D_sub coef return support, coef # 轻量化注意力迁移网络 class DepthwiseSeparableConv(nn.Module): def __init__(self, in_ch, out_ch): super().__init__() self.depthwise nn.Conv1d(in_ch, in_ch, 3, padding1, groupsin_ch) self.pointwise nn.Conv1d(in_ch, out_ch, 1) def forward(self, x): return self.pointwise(self.depthwise(x)) class MultiScaleAttention(nn.Module): def __init__(self, channels): super().__init__() self.avg_pool nn.AdaptiveAvgPool1d(1) self.max_pool nn.AdaptiveMaxPool1d(1) self.rms_pool lambda x: torch.sqrt(torch.mean(x**2, dim[2], keepdimTrue)) self.fc nn.Sequential(nn.Linear(channels*3, channels//8), nn.ReLU(), nn.Linear(channels//8, channels), nn.Sigmoid()) def forward(self, x): b, c, _ x.size() avg_feat self.avg_pool(x).view(b, c) max_feat self.max_pool(x).view(b, c) rms_feat self.rms_pool(x).view(b, c) concat torch.cat([avg_feat, max_feat, rms_feat], dim1) attn self.fc(concat).view(b, c, 1) return x * attn class LightweightTransferNet(nn.Module): def __init__(self, num_classes4): super().__init__() self.conv1 DepthwiseSeparableConv(1, 32) self.att1 MultiScaleAttention(32) self.conv2 DepthwiseSeparableConv(32, 64) self.att2 MultiScaleAttention(64) self.conv3 DepthwiseSeparableConv(64, 128) self.gap nn.AdaptiveAvgPool1d(1) self.fc nn.Linear(128, num_classes) def forward(self, x): x self.conv1(x); x self.att1(x); x torch.relu(x) x self.conv2(x); x self.att2(x); x torch.relu(x) x self.conv3(x); x torch.relu(x) x self.gap(x).squeeze(-1) return self.fc(x) # MMD损失计算 def mmd_loss(source, target, kernel_mul2.0, kernel_num5): batch_size source.size(0) kernels [torch.exp(-torch.cdist(source, target)**2 / (bandwidth**2)) for bandwidth in [1,2,4,8,16]] loss 0 for kernel in kernels: loss kernel.mean() return 1 - loss / len(kernels) ,如有问题可以直接沟通