news 2026/4/24 18:11:36

加法神经网络剪枝无线传感器轴承诊断【附代码】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
加法神经网络剪枝无线传感器轴承诊断【附代码】

博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。

✅成品或者定制,扫描文章底部微信二维码。


(1) 面向边缘计算的一维加法神经网络架构设计

针对传统卷积神经网络在无线传感器节点上计算资源受限的问题,本研究采用加法运算替代乘法卷积操作构建轻量化诊断模型。加法神经网络通过线性滤波器组与输入信号的差值计算来提取特征,相比传统卷积层能够显著降低浮点运算次数和硬件功耗开销。网络结构设计上采用多尺度特征提取策略,通过堆叠不同感受野的加法层捕获振动信号在时域和频域的多层次特征表征。为增强模型的非线性表达能力,在加法层之间引入批归一化和ReLU激活函数,同时设计跳跃连接机制将浅层细粒度特征与深层语义特征进行融合,构建端到端的故障模式识别通路。针对轴承故障振动信号的周期性和瞬态冲击特性,网络输入层采用滑动窗口分段策略对原始时序数据进行预处理,将连续振动信号转化为固定长度的样本序列,通过数据增强技术扩充训练集规模提升模型泛化性能。输出层设计为多分类softmax层,能够同时识别正常状态、内圈故障、外圈故障和滚动体故障等多种工况模式。

(2) 基于结构化稀疏约束的通道剪枝优化方法

为进一步压缩模型参数量和计算复杂度使其适配嵌入式硬件平台,本研究提出结合稀疏正则化和交替优化的剪枝策略。首先通过在损失函数中引入组稀疏惩罚项对加法层的滤波器通道施加结构化约束,促使训练过程中部分通道的权重参数趋向于零,从而识别出对诊断性能贡献较小的冗余特征通道。采用近端梯度下降算法求解带约束的优化问题,将参数更新分解为梯度下降步和软阈值收缩步交替执行,在保证模型精度的前提下逐步增强权重矩阵的稀疏性。在剪枝决策阶段,根据各通道权重的范数大小进行重要性排序,设置全局剪枝率阈值移除低重要性通道及其对应的批归一化参数。为避免剪枝后精度骤降,采用分层渐进式剪枝策略,从网络浅层到深层逐步提高剪枝比例,并在每轮剪枝后进行微调训练恢复模型性能。针对不同故障类别样本数量不均衡的问题,在剪枝过程中引入类别敏感的重要性评估机制,对稀缺故障类别相关的特征通道赋予更高保留优先级,确保压缩后的模型对各类故障均具有鲁棒的判别能力。

(3) 分布式边缘诊断的嵌入式系统实现与通信优化

将剪枝优化后的轻量化模型部署到无线传感器网络的终端节点,实现本地化实时故障诊断与按需数据传输。嵌入式实现采用定点量化技术将浮点权重参数转换为低比特整数表示,通过查找表加速激活函数计算,并利用SIMD指令优化加法运算的并行执行效率。传感器节点采集振动加速度信号后,在本地完成信号预处理、特征提取和模式识别全流程,仅当检测到异常工况或诊断置信度低于阈值时才向汇聚节点发送诊断结果和关键特征向量,相比原始数据全量传输方案可将通信开销降低两个数量级。针对多节点协同监测场景,设计基于令牌传递的时分复用通信协议,避免节点间数据碰撞导致的重传能耗。

import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler class AdderLayer(nn.Module): def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0): super(AdderLayer, self).__init__() self.in_channels = in_channels self.out_channels = out_channels self.kernel_size = kernel_size self.stride = stride self.padding = padding self.weight = nn.Parameter(torch.randn(out_channels, in_channels, kernel_size)) def forward(self, x): batch_size = x.size(0) in_len = x.size(2) out_len = (in_len + 2 * self.padding - self.kernel_size) // self.stride + 1 x_unfold = nn.functional.unfold(x.unsqueeze(2), (1, self.kernel_size), padding=(0, self.padding), stride=(1, self.stride)) x_unfold = x_unfold.transpose(1, 2) weight_flat = self.weight.view(self.out_channels, -1) output = -torch.cdist(x_unfold, weight_flat.t(), p=1) output = output.transpose(1, 2).view(batch_size, self.out_channels, out_len) return output class ResidualAdderBlock(nn.Module): def __init__(self, channels, kernel_size): super(ResidualAdderBlock, self).__init__() self.adder1 = AdderLayer(channels, channels, kernel_size, padding=kernel_size//2) self.bn1 = nn.BatchNorm1d(channels) self.relu = nn.ReLU(inplace=True) self.adder2 = AdderLayer(channels, channels, kernel_size, padding=kernel_size//2) self.bn2 = nn.BatchNorm1d(channels) def forward(self, x): residual = x out = self.adder1(x) out = self.bn1(out) out = self.relu(out) out = self.adder2(out) out = self.bn2(out) out += residual out = self.relu(out) return out class BearingFaultDiagnosisNet(nn.Module): def __init__(self, input_channels=1, num_classes=10): super(BearingFaultDiagnosisNet, self).__init__() self.adder_in = AdderLayer(input_channels, 32, kernel_size=64, stride=8, padding=28) self.bn_in = nn.BatchNorm1d(32) self.relu = nn.ReLU(inplace=True) self.block1 = ResidualAdderBlock(32, 16) self.block2 = ResidualAdderBlock(32, 16) self.adder_mid = AdderLayer(32, 64, kernel_size=8, stride=4, padding=2) self.bn_mid = nn.BatchNorm1d(64) self.block3 = ResidualAdderBlock(64, 8) self.global_pool = nn.AdaptiveAvgPool1d(1) self.fc = nn.Linear(64, num_classes) def forward(self, x): x = self.adder_in(x) x = self.bn_in(x) x = self.relu(x) x = self.block1(x) x = self.block2(x) x = self.adder_mid(x) x = self.bn_mid(x) x = self.relu(x) x = self.block3(x) x = self.global_pool(x) x = x.view(x.size(0), -1) x = self.fc(x) return x def channel_pruning(model, prune_ratio=0.3): pruned_model = BearingFaultDiagnosisNet() pruned_model.load_state_dict(model.state_dict()) for name, module in pruned_model.named_modules(): if isinstance(module, AdderLayer): weight = module.weight.data num_channels = weight.size(0) num_keep = int(num_channels * (1 - prune_ratio)) channel_norm = torch.norm(weight.view(num_channels, -1), p=2, dim=1) _, indices = torch.topk(channel_norm, num_keep) indices = indices.sort()[0] module.weight = nn.Parameter(weight[indices]) module.out_channels = num_keep return pruned_model def train_model(model, train_loader, epochs=50): criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-4) scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=15, gamma=0.5) model.train() for epoch in range(epochs): total_loss = 0 correct = 0 total = 0 for inputs, labels in train_loader: optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) l1_reg = sum(torch.norm(p, 1) for p in model.parameters()) loss = loss + 1e-5 * l1_reg loss.backward() optimizer.step() total_loss += loss.item() _, predicted = outputs.max(1) total += labels.size(0) correct += predicted.eq(labels).sum().item() scheduler.step() accuracy = 100.0 * correct / total print(f'Epoch {epoch+1}: Loss={total_loss/len(train_loader):.4f}, Acc={accuracy:.2f}%') return model def generate_synthetic_data(num_samples=5000, seq_length=2048): X = np.random.randn(num_samples, 1, seq_length) y = np.random.randint(0, 10, num_samples) for i in range(num_samples): fault_type = y[i] if fault_type > 0: freq = 20 + fault_type * 10 amplitude = 0.5 + fault_type * 0.1 t = np.linspace(0, 1, seq_length) X[i, 0, :] += amplitude * np.sin(2 * np.pi * freq * t) if fault_type % 3 == 0: impulse_locs = np.random.randint(0, seq_length, size=5) X[i, 0, impulse_locs] += np.random.randn(5) * 2.0 return X.astype(np.float32), y X_data, y_data = generate_synthetic_data() X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size=0.2) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train.reshape(X_train.shape[0], -1)) X_test_scaled = scaler.transform(X_test.reshape(X_test.shape[0], -1)) X_train_scaled = X_train_scaled.reshape(X_train.shape) X_test_scaled = X_test_scaled.reshape(X_test.shape) train_dataset = torch.utils.data.TensorDataset( torch.FloatTensor(X_train_scaled), torch.LongTensor(y_train) ) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True) model = BearingFaultDiagnosisNet(input_channels=1, num_classes=10) trained_model = train_model(model, train_loader, epochs=30) pruned_model = channel_pruning(trained_model, prune_ratio=0.25) test_dataset = torch.utils.data.TensorDataset( torch.FloatTensor(X_test_scaled), torch.LongTensor(y_test) ) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64) pruned_model.eval() correct = 0 total = 0 with torch.no_grad(): for inputs, labels in test_loader: outputs = pruned_model(inputs) _, predicted = outputs.max(1) total += labels.size(0) correct += predicted.eq(labels).sum().item() print(f'Test Accuracy: {100.0 * correct / total:.2f}%')


如有问题,可以直接沟通

👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 0:52:06

提示工程架构师揭秘:AI驱动提示实时优化的技术方案

提示工程架构师揭秘:AI驱动提示实时优化的技术方案 一、引言:为什么你需要“AI帮你调Prompt”? 1. 一个扎心的痛点:你还在手动“试错式”调Prompt吗? 上周,我遇到一位做AI客服的朋友,他吐槽&…

作者头像 李华
网站建设 2026/4/16 4:34:45

利用RabbitMQ提升大数据系统的消息吞吐量

RabbitMQ在大数据系统中的吞吐量优化实践:从原理到落地 副标题:解决高并发消息场景下的延迟、丢包与性能瓶颈 摘要/引言 在大数据系统中,消息中间件是连接数据源(如日志采集、业务系统)与计算引擎(如Fli…

作者头像 李华
网站建设 2026/4/15 12:04:12

向量的叉乘

叉乘的定义: 对于不共线的两个向量 a 和 b ,他们叉乘的结果是一个新的向量。并且这个向量垂直与a、b两个向量所在的平面。叉乘后向量的模为: | a x b| | a | | b | sinθ叉乘后向量的方向: 将 a b平移至同起点。用右手螺旋定…

作者头像 李华
网站建设 2026/4/23 19:21:23

焊缝跟踪 abb机器人二次开发 上位机由C#+halcon联合编程 提供源码讲解

焊缝跟踪 abb机器人二次开发 上位机由C#+halcon联合编程 提供源码讲解,abb编程及通讯、工业相机标定、halcon图像处理、C#与halcon联合编程等 系统架构与设计理念 本系统是一个高度集成的工业自动化解决方案,采用C# WinForms作为前端界面框…

作者头像 李华
网站建设 2026/4/23 13:42:01

Golang高性能轻量博客程序源码

极速部署,拥抱主题插件化你是否厌倦了臃肿、复杂的博客系统?是否希望拥有一个启动如闪电、资源占用极小,同时又保持足够灵活性的个人写作空间?今天,我们向所有追求极致效率和简洁的开发者、博主推荐一款基于 Go 语言开…

作者头像 李华
网站建设 2026/4/23 10:41:29

互联网大厂Java面试实战:从Spring Boot到Kafka的技术与业务场景解析

面试场景介绍 在当前互联网大厂的Java岗位面试中,面试官通常会结合具体业务场景,深入考察应聘者对核心技术栈的理解和应用能力。本文通过一个音视频场景的模拟面试,展示面试官与应聘者谢飞机的互动,帮助读者系统学习相关技术。第一…

作者头像 李华