✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)双路径时频域特征提取与融合网络:
针对传统一维卷积神经网络仅从时域提取特征、忽略频域信息的问题,设计了一种双路径特征提取网络。第一路径直接以原始一维振动信号作为输入,通过一维卷积神经网络提取时域波形特征,网络结构包含三个卷积块,每个卷积块由卷积层、批归一化、ReLU和最大池化组成。第二路径将原始信号通过短时傅里叶变换转换为二维时频谱图(时间-频率-幅值),然后利用二维卷积神经网络提取频域特征。二维卷积神经网络采用预训练的ResNet-18作为主干,利用其在ImageNet上的迁移学习能力加速收敛。两条路径提取的特征向量经过Concat拼接后送入一个全连接分类器进行分类。在凯斯西储大学轴承数据集上,该双路径模型准确率超过99%,相比单一的一维卷积神经网络提高了约2个百分点,证明频域信息的引入有效增强了特征判别能力。
(2)深度残差收缩网络与多尺度卷积注意力的抗噪声增强:
为提升模型在强噪声环境下的鲁棒性,提出了深度残差收缩网络与多尺度卷积注意力结合的诊断模型。深度残差收缩网络在残差块中嵌入了一个软阈值化子网络,该子网络自动学习每个通道的阈值,对不重要的小幅值特征进行软阈值收缩,从而抑制噪声和冗余信息。每个残差块的输出经过全局平均池化、全连接层和sigmoid激活得到缩放系数,再与残差路径相乘,实现自适应特征重标定。同时,在二维卷积特征提取分支中,加入多尺度卷积模块(使用三种不同尺寸的卷积核:3×3、5×5、7×7)和通道注意力机制(SENet),使模型能够捕捉不同尺度的故障冲击成分,并自动增强重要通道。在CWRU数据集中加入信噪比为-6dB的高斯噪声时,该模型仍能保持90%以上的准确率,而基线模型准确率降至70%以下。
(3)跨数据集泛化性能验证与模型:
为了验证模型在不同轴承数据集上的泛化能力,在凯斯西储大学、东南大学和哈尔滨工业大学三个数据集上进行了交叉测试。采用域自适应微调策略:先在源数据集上预训练,然后在目标数据集上用少量标注样本进行微调。实验表明,所提DRSN-2DCNN模型在东南大学数据集上达到99.60%准确率,在哈尔滨工业大学数据集上达到98.25%,显著优于对比模型。为了便于工业部署,对模型进行轻量化改造:将部分标准卷积替换为深度可分离卷积,使用全局平均池化替代全连接层,并采用知识蒸馏技术将大模型知识迁移到小模型上。压缩后的模型参数量减少80%,推理速度提升3倍,准确率仅下降0.5%。该轻量模型已成功部署在嵌入式设备上进行实时轴承故障监测。
import torch import torch.nn as nn import torch.nn.functional as F import numpy as np # 深度残差收缩块 class ResidualShrinkageBlock(nn.Module): def __init__(self, in_channels, out_channels, stride=1): super().__init__() self.conv1 = nn.Conv1d(in_channels, out_channels, 3, stride, 1) self.bn1 = nn.BatchNorm1d(out_channels) self.conv2 = nn.Conv1d(out_channels, out_channels, 3, 1, 1) self.bn2 = nn.BatchNorm1d(out_channels) # 阈值学习子网络 self.gap = nn.AdaptiveAvgPool1d(1) self.fc = nn.Sequential(nn.Linear(out_channels, out_channels//2), nn.ReLU(), nn.Linear(out_channels//2, out_channels), nn.Sigmoid()) self.shortcut = nn.Conv1d(in_channels, out_channels, 1, stride) if in_channels != out_channels else nn.Identity() def forward(self, x): shortcut = self.shortcut(x) out = F.relu(self.bn1(self.conv1(x))) out = self.bn2(self.conv2(out)) # 软阈值 features = self.gap(out).squeeze(-1) thresholds = self.fc(features).unsqueeze(-1) out = out * thresholds out = F.relu(out + shortcut) return out # 多尺度卷积注意力模块 class MultiScaleChannelAttention(nn.Module): def __init__(self, in_channels, kernel_sizes=[3,5,7]): super().__init__() self.convs = nn.ModuleList([nn.Conv2d(in_channels, in_channels, (k,1), padding=(k//2,0)) for k in kernel_sizes]) self.attn = nn.Sequential(nn.AdaptiveAvgPool2d(1), nn.Flatten(), nn.Linear(in_channels, in_channels//4), nn.ReLU(), nn.Linear(in_channels//4, in_channels), nn.Sigmoid()) def forward(self, x): multi_feats = [conv(x) for conv in self.convs] fused = torch.stack(multi_feats, dim=0).mean(dim=0) weights = self.attn(fused).view(fused.size(0), fused.size(1), 1, 1) return x * weights # 双路径融合模型() class DualPathDRSN(nn.Module): def __init__(self, num_classes=10): super().__init__() # 一维路径 self.conv1d = nn.Sequential( ResidualShrinkageBlock(1, 32), ResidualShrinkageBlock(32, 64), nn.AdaptiveAvgPool1d(1) ) # 二维路径(输入2D时频图) self.conv2d = nn.Sequential( nn.Conv2d(1, 32, 3, padding=1), nn.ReLU(), MultiScaleChannelAttention(32), nn.Conv2d(32, 64, 3), nn.ReLU(), nn.AdaptiveAvgPool2d(1) ) self.fc = nn.Linear(128, num_classes) def forward(self, x1d, x2d): feat1d = self.conv1d(x1d).squeeze(-1) feat2d = self.conv2d(x2d).squeeze(-1).squeeze(-1) combined = torch.cat([feat1d, feat2d], dim=1) return self.fc(combined) # 轻量化知识蒸馏示例 def distill(teacher_model, student_model, dataloader, temperature=4.0): teacher_model.eval() student_model.train() optimizer = torch.optim.Adam(student_model.parameters()) for data, labels in dataloader: with torch.no_grad(): teacher_logits = teacher_model(data) student_logits = student_model(data) distill_loss = F.kl_div(F.log_softmax(student_logits/temperature, dim=1), F.softmax(teacher_logits/temperature, dim=1), reduction='batchmean') ce_loss = F.cross_entropy(student_logits, labels) loss = distill_loss * temperature**2 + 0.5 * ce_loss optimizer.zero_grad() loss.backward() optimizer.step() return student_model ",如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇