故障诊断创新算法之【向量化特征+动态路由】基于改进胶囊网络的机械故障诊断(PyTorch)
传统卷积神经网络虽然擅长提取局部频率特征,却忽略了不同故障部件之间的空间位姿关系和内在拓扑结构,提出一种改进胶囊网络,在轴承故障诊断中实现CNN粗特征提取 + 胶囊矢量编码 + 动态路由推理的3级协同架构:大卷积核(尺寸150)抑制强噪,小卷积核(尺寸8)捕获细节,再由预胶囊层将特征图转化为8维空间向量,最后通过3次动态路由迭代自适应调整耦合系数,使数字胶囊层的每个故障向量精准表达该类别固有的模态形态与相对位置信息。间隔损失函数进一步拉开不同故障向量的模长差距。
提出的改进胶囊网络融合了卷积神经网络对振动信号局部特征的深度提取能力与胶囊结构的矢量化空间表征优势。通过卷积池化模块自动学习多尺度故障特征,并利用预胶囊层将底层特征编码为向量形式,再借助动态路由机制迭代计算数字胶囊层与预胶囊层之间的耦合系数,从而精确捕获不同故障类别间的内在关联与位姿信息。最后采用间隔损失函数指导模型训练,实现了从原始振动信号到故障类别的端到端智能诊断。

算法步骤
数据预处理:将原始一维振动信号以 1024 个数据点为一个样本进行无重叠分割,并对每个样本独立进行 z‑score 标准化,使其均值为 0、方差为 1,以消除量纲影响并加速网络收敛。
深度特征提取:通过两层卷积‑池化结构对输入样本进行逐层特征学习。第一层采用大型卷积核(尺寸 150)抑制噪声干扰,第二层采用多个小型卷积核(尺寸 8)提取丰富的局部细节。每个卷积层后均接批归一化、ReLU 激活函数和最大值池化,实现特征降维与非线性映射。
向量化特征编码:将卷积池化输出的特征图输入预胶囊层,该层通过卷积运算生成多个初级胶囊,每个胶囊输出一个 8 维向量,表示局部特征的空间属性与存在概率。所有初级胶囊共同构成一个胶囊向量集合。
动态路由迭代:将预胶囊层的输出作为数字胶囊层的输入。数字胶囊层内部分为 10 个胶囊(对应 10 个故障类别),每个胶囊输出一个 16 维向量。通过 3 次动态路由迭代,利用耦合系数动态调整不同层级胶囊之间的连接权重,使得预测向量与输出向量的内积最大化,从而增强同类特征的一致性。
故障分类输出:计算数字胶囊层每个输出向量的 L2 范数作为该类别存在的概率,选取概率最大值对应的类别作为最终诊断结果。训练过程中采用间隔损失函数(Margin Loss)拉大不同类别向量的模长差距,优化模型参数。
模型训练与评估:按照 7 : 1.5 : 1.5 的比例划分训练集、验证集和测试集,使用 Adam 优化器(学习率 0.001)训练 50 个轮次,每批次 10 个样本。通过验证集调整超参数,最终在测试集上评估模型性能。
def squash(s, dim=-1):
norm = torch.norm(s, p=2, dim=dim, keepdim=True)
norm_sq = norm ** 2
return (norm_sq / (1.0 + norm_sq)) * (s / (norm + 1e-8))
class PrimaryCaps(nn.Module):
def __init__(self, in_channels, out_caps, cap_dim, kernel_size, stride, padding):
super().__init__()
self.conv = nn.Conv2d(in_channels, out_caps * cap_dim,
kernel_size=kernel_size, stride=stride, padding=padding)
self.out_caps = out_caps
self.cap_dim = cap_dim
def forward(self, x):
batch = x.size(0)
out = self.conv(x)
out = out.view(batch, self.out_caps, self.cap_dim, *out.shape[2:])
out = out.view(batch, self.out_caps * out.shape[3] * out.shape[4], self.cap_dim)
return squash(out)
class DigitCaps(nn.Module):
def __init__(self, in_num_caps, in_dim, out_num_caps, out_dim, routing=3):
super().__init__()
self.in_num_caps = in_num_caps
self.in_dim = in_dim
self.out_num_caps = out_num_caps
self.out_dim = out_dim
self.routing = routing
self.W = nn.Parameter(torch.randn(out_num_caps, in_num_caps, out_dim, in_dim) * 0.01)




参考文章:
故障诊断创新算法之【向量化特征+动态路由】基于改进胶囊网络的机械故障诊断(PyTorch)
如果你对信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测有疑问,或者需要论文思路上的建议,欢迎学术付费咨询
担任《MSSP》《中国电机工程学报》《宇航学报》《控制与决策》等期刊审稿专家,擅长领域:信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)