基于可逆残差网络与互信息最大化的化工泵故障诊断【附代码】
✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)可逆残差块与内存高效训练:
化工泵监测数据序列长,传统残差网络反向传播需存储中间激活值,内存占用大。采用可逆残差网络,每个残差块的输出由输入和残差函数通过可逆变换得到,反向传播时可从输出重构输入,无需存储中间值。设计可逆残差块公式为y1 = x1 + F(x2),y2 = x2 + G(y1),其中F和G是卷积层。在保持表达能力的同时,内存消耗降低约50%。在化工泵振动数据上,可逆网络与标准ResNet准确率相近(97.2% vs 97.5%),但显存占用从8GB降至4GB。
(2)局部互信息最大化与对比学习:
为了提升特征的代表性,在训练中加入局部互信息最大化目标。对于每个样本,从其特征图中随机采样多个局部patch,计算每个patch与全局特征之间的互信息,并最大化该互信息。这迫使局部patch携带全局信息,增强对故障相关区域的感知。同时,使用负样本对(不同样本的patch)降低互信息,形成对比损失。在只有少量标注数据时,该自监督任务大幅提升了后续分类精度。
(3)图正则化与故障传播建模:
将化工泵及其上下游设备(阀门、管道、容器)构建为图,节点特征为可逆网络提取的特征,边为工艺连接。在分类损失中加入图拉普拉斯正则化,使得相邻节点特征相似(表示正常状态)或差异明显(表示故障隔离区)。通过该正则化,模型能够利用工艺知识辅助诊断,在孤立故障样本不足时提高鲁棒性。实验中,当某类故障样本仅5个时,图正则化使准确率从74%提升到86%。
import torch import torch.nn as nn import torch.nn.functional as F class InvertibleResidualBlock(nn.Module): def __init__(self, channels): super().__init__() self.F = nn.Sequential(nn.Conv1d(channels//2, channels//2, 3, padding=1), nn.ReLU()) self.G = nn.Sequential(nn.Conv1d(channels//2, channels//2, 3, padding=1), nn.ReLU()) def forward(self, x): x1, x2 = x.chunk(2, dim=1) y1 = x1 + self.F(x2) y2 = x2 + self.G(y1) return torch.cat([y1, y2], dim=1) def local_mutual_information_loss(global_feat, local_patches): # global_feat: [B, D], local_patches: [B, K, D] # 最大化互信息:global与local的相似度,对比其他样本的local B, K, D = local_patches.shape global_exp = global_feat.unsqueeze(1).expand(B, K, D) # [B, K, D] pos_score = (global_exp * local_patches).sum(dim=-1) # [B, K] # 负样本:batch内其他样本的patches neg_patches = local_patches.reshape(B*K, D) neg_score = global_feat @ neg_patches.T # [B, B*K] # InfoNCE loss = -torch.log(pos_score.exp().sum(dim=1) / (pos_score.exp().sum(dim=1) + neg_score.exp().sum(dim=1))).mean() return loss def graph_laplacian_regularization(node_features, adj): # node_features: [num_nodes, D] L = torch.diag(adj.sum(dim=1)) - adj loss = torch.trace(node_features.T @ L @ node_features) return loss / (node_features.size(0)**2)如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
