可学习小波卷积一维信号异常诊断【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,查看文章底部二维码
(1)参数化连续小波变换与卷积层融合的预处理模块:
设计一种可学习的小波卷积预处理层,该层内置Morlet小波基函数,其中尺度参数和位移参数均设为可训练变量。输入的一维信号与不同尺度的小波核进行卷积操作,生成多通道的小波系数图谱。与固定小波变换不同,该模块允许在训练过程中通过反向传播自适应调整小波的中心频率和带宽,使提取的特征更匹配目标故障的频带分布。在电机轴承故障数据集中,可学习小波层在训练后自动将中心频率锁定在轴承内圈故障特征频率的2倍频附近,比预设的小波变换信噪比增益高4.3dB。
(2)残差块与长短期记忆网络双路特征融合模型:
将小波预处理层输出的多尺度特征分别送入两条并行支路。支路A采用三个残差块,每个残差块包含两个卷积层和一个跳跃连接,用于提取局部空间模式;支路B采用两层双向LSTM,隐藏单元数为128,用于捕捉时序依赖关系。两条支路的输出经过自适应平均池化后拼接,再通过两个全连接层输出异常分数。在凯斯西储大学轴承数据集的10种工况下(含不同转速和负载),该双路模型在信噪比0dB时的平均准确率为97.3%,比单一残差网络高5.1%,比单一LSTM高7.4%。
(3)梯度中心化与标签平滑联合的训练稳定性优化:
针对深度模型在噪声环境下训练容易梯度震荡的问题,在优化器层面引入梯度中心化,即计算当前批梯度向量的均值并从每个梯度中减去该均值,使梯度分布更稳定。同时采用标签平滑技术,将硬标签one-hot向量替换为soft target,其中平滑参数设为0.1,避免模型对训练样本过自信。在自采集的电机声音信号数据集上,该联合策略使训练收敛所需的epoch数从120减少到70,最终验证集准确率达99.2%,且在不同噪声强度下波动范围小于0.5%,显著优于未优化模型。
import torch import torch.nn as nn import numpy as np class LearnableWaveletConv(nn.Module): def __init__(self, in_channels=1, out_channels=16, kernel_size=64): super().__init__() self.scale = nn.Parameter(torch.ones(out_channels) * 2.0) self.translation = nn.Parameter(torch.zeros(out_channels)) # Morlet小波初始化 t = torch.linspace(-3, 3, kernel_size) wavelet = torch.exp(-t**2/2) * torch.cos(5*t) self.register_buffer('base_wavelet', wavelet.unsqueeze(0).unsqueeze(0)) def forward(self, x): B, C, L = x.shape outputs = [] for i in range(self.scale.shape[0]): s = self.scale[i] t_shift = self.translation[i] # 时域伸缩平移 indices = torch.arange(self.base_wavelet.shape[-1], device=x.device) shifted = (indices - t_shift) / s # 插值需要简化,这里示意生成小波核 kernel = self.base_wavelet[0,0] # 实际应动态计算 conv_kernel = kernel.unsqueeze(0).unsqueeze(0) # [1,1,K] out = nn.functional.conv1d(x, conv_kernel, padding='same') outputs.append(out) return torch.cat(outputs, dim=1) class ResBlock(nn.Module): def __init__(self, channels): super().__init__() self.conv1 = nn.Conv1d(channels, channels, 3, padding=1) self.conv2 = nn.Conv1d(channels, channels, 3, padding=1) def forward(self, x): residual = x out = self.conv1(x).relu() out = self.conv2(out) return (out + residual).relu() class DualPathModel(nn.Module): def __init__(self, wavelet_channels=16): super().__init__() self.wavelet = LearnableWaveletConv(out_channels=wavelet_channels) self.res_path = nn.Sequential(ResBlock(wavelet_channels), ResBlock(wavelet_channels)) self.lstm = nn.LSTM(wavelet_channels, 128, bidirectional=True, batch_first=True) self.fc = nn.Linear(128*2 + wavelet_channels, 2) def forward(self, x): w = self.wavelet(x) r = self.res_path(w) r_pool = r.mean(dim=-1) lstm_out, _ = self.lstm(w.transpose(1,2)) lstm_pool = lstm_out.mean(dim=1) fused = torch.cat([r_pool, lstm_pool], dim=1) return self.fc(fused)如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
