资讯动态

小样本轴承故障诊断:CWT+多尺度注意力+原型网络实战

发布时间:2026/10/22 5:42:23 来源:尧图企业网站定制
先说一个很多人容易忽略的事实滚动轴承故障诊断本身不算新课题但“小样本条件下的故障诊断”才是从实验室走向产线的关键门槛。现场碾磨机、电机、泵这些旋转设备故障样本收集困难、损坏类型又不均衡正常样本一大把故障样本可能就几十条。这也是为什么基于数据驱动的深度学习方法在论文里刷分很轻松一到现场就失灵——数据不够什么深度模型都白搭。这套“连续小波变换 多尺度注意力 原型网络”的路子就是专门奔着“用少量故障样本把诊断模型训出来”去的整体用 Pytorch 实现工程落地相对顺手。这套方案适合谁如果你是做旋转机械状态监测的算法工程师、研究小样本学习的在校同学或者正在头疼“故障数据太少但产线又必须早预警”的设备管理人员那这篇文章的思路可以直接抄。它解决的核心矛盾是传统 CNN 分类器在故障类别样本极少时容易过拟合或学不到可分的特征而原型网络Prototypical Networks天然支持从少量样本中构建类别判别中心连续小波变换则把一维振动信号变成二维时频图让网络看到的不只是幅值而是频率成分随时间的变化这对轴承这类非平稳冲击信号尤为重要多尺度注意力说白了就是让模型自己学会“该看哪个频带的哪个时间段”把有限的参数用在刀刃上。下面我会把这套方案的思路梳理、关键参数、Pytorch 实操细节和一些排查经验展开讲从信号处理到模型训练尽量给到可以直接落地的参考。1. 整体方案设计思路为什么偏偏是这三样搭配1.1 从一维振动信号到二维时频图CWT 的不可替代性先说连续小波变换。轴承故障产生的振动信号本质上是周期性脉冲激励叠加在旋转谐波和噪声背景上。内圈故障、外圈故障、滚动体故障它们的冲击频率周期不一样脉冲形态和能量分布也不一样。如果只用 FFT 看全频段的幅值谱会丢掉“冲击发生在哪个时刻”的信息很多早期故障信号特征非常微弱峰值只持续几个毫秒FFT 一平均就糊掉了。短时傅里叶变换STFT虽然有时域分辨率但窗长固定后低频和高频的时间分辨率不可兼得——这是傅里叶方法的固有矛盾。CWT 的好处在于它用一组可缩放平移的小波基函数去匹配信号。高频段小波被压缩时间分辨率高能捕捉瞬态冲击低频段小波被拉长频率分辨率高能看清调制成分。滚动轴承故障信号的故障特征频率通常分布在几百赫兹到几千赫兹冲击本身又包含高频谐振成分正好是 CWT 最擅长表达的信号类型。在实际项目中我一般直接对原始振动信号做 CWT得到小波系数矩阵后取模值作为时频能量图。这个二维矩阵就是后续卷积网络的输入。相比直接把一维波形喂给 1D-CNN这种处理有两个好处一是网络可以用成熟的 2D 图像分类结构ResNet、VGG、EfficientNet 这些预训练思想都能借用二是时频图天然把“信号的时间关系”和“频率关系”同时建模卷积核的感受野可以同时覆盖两者特征表达效率更高。1.2 小样本学习的核心框架原型网络的工作机制接下来是原型网络。很多人第一次听说原型网络容易把它理解成“对每个类做模板匹配”这个直觉方向是对的但里面有细节。原型网络的核心思想是为每一个故障类别学习一个“原型向量”这个原型是该类别所有支持集样本的特征平均。分类时查询样本的特征向量和所有类别的原型向量计算距离取距离最近的那个类别作为预测结果。训练时用的损失函数是交叉熵但分类依据不是全连接层的线性变换而是特征空间中的欧氏距离。这里的“小样本任务”通常描述成 N-way K-shot每个训练回合随机抽取 N 个故障类别每类 K 个样本作为支持集另外抽一些同类样本作为查询集。比如 5-way 5-shot就是每次任务里有 5 类故障每类 5 个标记样本做原型再拿每类另外若干样本做查询。模型在每个回合中只见过这 5 类、每类 5 个样本却要求它对查询样本完成分类。这种训练方式模拟了真实测试时“每类只有几个样本可用”的场景。有人会问为什么不用普通的 Softmax 分类器假如故障类别有 10 个故障样本总共 200 个普通的分类器也能训啊。问题在于工业现场经常出现“新增故障类型”。设备磨损程度变化、新出现的故障模式在原有的固定分类体系里根本没有对应的标签类别。原型网络的分类型头不是固定的它的分类机制完全建立在支持集样本的特征上来了一个新的故障类别只要抽几个样本算一个原型网络就能把新类别纳入判别空间不需要重新训练整个模型更不用动网络结构。这个特性在生产现场非常宝贵。1.3 多尺度注意力机制让模型把注意力花在关键时频区域最后说多尺度注意力。轴承故障信号的特征是多尺度的外圈故障的冲击频率可能几百赫兹而冲击激发的固有共振频率可以到几千甚至上万赫兹。如果卷积网络只用固定尺寸的卷积核比如 3×3它的感受野是固定的很难同时捕捉“宽范围低频调制”和“局部高频冲击”。多尺度注意力模块的思路是设计多个不同感受野的分支每个分支用不同膨胀率dilation rate的卷积核去提取特征然后把各分支的特征按注意力权重融合。膨胀率 1 的分支保留局部细节膨胀率 2、4 的分支逐步扩大感受野覆盖更宽的时间或频率范围。融合权重不是人为设定的而是通过注意力机制从数据中学习出来的让模型根据当前样本的时频分布自行决定该侧重哪个尺度分支。这个设计还有个实际动机。小样本场景下模型可用样本少如果所有特征通道都平等对待噪声频带和无关谐波成分会严重干扰原型计算。注意力机制压缩了无关信息的影响让原型向量更聚焦于真实的故障特征区域对类间区分度的提升其实比加宽网络更有效。2. 连续小波变换的参数选择与特征图构建细节2.1 小波基函数的选择Morlet 小波是默认答案CWT 的第一步是选小波基。工程上做轴承诊断我基本不会纠结直接用 Morlet 小波。原因有三第一Morlet 是复值小波能同时给出幅值和相位信息虽然我们通常只用幅值但复数小波的带宽和中心频率可控适合分析调幅调频信号第二Morlet 小波的波形是一个正弦波乘以高斯包络和轴承故障产生的衰减振荡冲击形态很相似匹配度高产生的时频能量聚集性比 Daubechies 系列好得多第三工程验证充分几乎所有公开的轴承故障诊断研究里用 Morlet 的占绝大多数遇到问题时能找到大量参考经验。实际代码里用 Pytorch 或者 PyWavelets 都行。PyWavelets 里有现成的pywt.cwt转换逻辑清晰适合批量处理离线数据集如果要在训练过程中动态做 CWT 增强可以预先算好所有样本的时频图存成数组训练时直接从数组中读取省得每次迭代都重复算。2.2 尺度序列、采样率和时频分辨率权衡CWT 的参数中尺度序列是最关键的。小波尺度直接对应分析频率尺度越小中心频率越高。需要确定的参数有三个采样率 fs、尺度数量、尺度范围。先说采样率。常见的公开轴承数据集一般给 12kHz 或 48kHz 的采样率现场采集系统也常用 25.6kHz。采样率决定了可分析的频率上限按照 Nyquist 定理有效分析频率最高到 fs/2。对轴承故障诊断来说故障特征频率通常在 1kHz 以内但冲击激发的共振频带可能到 5kHz 以上所以建议采样率至少 12kHz有条件尽量到 25.6kHz 以上。尺度范围的选择标准是让你的目标频带落入分析范围。尺度 a 和中心频率 fc 的关系是实际频率 f fc / (a × dt)其中 dt 1/fs。如果 Morlet 小波中心频率是 0.8125这是常用值dt 对应 12kHz 采样那么尺度 a10 大致对应频率 f 0.8125/(10×1/12000) 975Hz。你可以按目标频带反推尺度范围。尺度数量一般取 64 或者 128。数量太少频率分辨率粗糙不同故障特征频率可能混在一起数量太多计算量大而且产生的时频图在频率轴上的冗余信息过多卷积网络并不需要那么密的频率采样。我的经验是128 个尺度基本够用64 个尺度已经能到 90% 以上的诊断效果具体看你的故障类型数。这里给一个参考配置表参数推荐值备选值注意事项采样率 fs12kHz / 25.6kHz48kHz低于 8kHz 时分析高频冲击会勉强样本长度2048 点 / 4096 点1024 点至少覆盖 3~5 个故障特征周期小波基Morlet复数墨西哥帽 / db10别用 Haar太粗糙尺度数量64 / 128256小样本优先选 64避免过拟合时频图尺寸128×128224×224输入 CNN 前需要调整统一尺寸2.3 从一维信号到二维图像的完整预处理流程实际预处理流程大概分五步。第一步截取样本。把连续的振动信号切成固定长度的片段每个片段独立成一个样本。切的时候注意如果故障特征频率是某个值样本长度至少要包含几个完整的冲击周期否则时频图里看不到规律性的周期性脉冲。比如内圈故障特征频率是 100Hz采样率 12kHz一个周期是 120 个采样点2048 点样本包含约 17 个周期足够。第二步去趋势和归一化。很多采集系统会有直流偏移或缓慢漂移信号需要减去均值必要时做高通滤波去掉低频趋势项。归一化一般用最大值绝对值归一化把信号缩放到 [-1, 1]避免不同样本之间幅值差异对 CWT 结果的影响。第三步做 CWT。对每个样本计算连续小波变换得到复数小波系数矩阵然后取模值abs(coef)得到二维实数矩阵维度是 [尺度数, 时间点数]。第四步幅值压缩和归一化。小波系数的幅值跨度非常大直接作为图像输入大值会主导损失函数。我一般会先对幅值取对数或者用log(1 abs(coef))再做 min-max 归一化到 [0,1] 区间。第五步尺寸调整。CWT 的原始输出是 [64, 2048] 这样的尺寸太宽了直接输入 CNN 不现实。用 OpenCV 或 PIL 的resize插值到 128×128 或 224×224。注意我个人偏好 128×128因为小样本场景下模型参数越少越好过大的图像会显著增加过拟合风险。2.4 一个容易被忽略的细节时频图方向的语义一致性时频图放进卷积网络它的坐标轴是有物理意义的。行方向是频率尺度轴列方向是时间轴。如果不同样本在生成时因采样点截取位置不同导致同样的故障冲击出现在时频图的不同水平位置那卷积网络就需要从不同位置提取同一个特征这会增加学习难度。所以训练时采样截取最好有策略。一种做法是从信号中均匀错位截取让网络学习位置不变性另一种是触发式截取用简单的阈值检测找到冲击强烈的位置再切片但现场自动化程度不高时容易把其他冲击误当故障。我的经验是训练时用随机起点截取同时配合数据增强里的随机平移测试时固定使用统一起点截取这样既有了多样性又保证了评估稳定性。3. 原型网络与多尺度注意力模块的设计要点3.1 小样本任务划分Episode 机制到底怎么理解先明确一个概念原型网络的训练不是“一个 batch 里有所有类别的样本”而是“一个 episode 里只有 N 个类别的少量样本”。假设你的训练集有 10 个故障类别包括正常每次训练随机抽出其中 5 类每类抽 5 个样本作为支持集再每类抽 5 个样本作为查询集这就是一个 5-way 5-shot 的训练回合。这个回合里网络要完成的任务是看 25 个支持集样本把它们按类别平均成 5 个原型然后对 25 个查询样本做分类计算交叉熵损失反向传播更新特征提取器的参数。为什么要用这种方式训练因为如果只在普通分类任务上预训练模型学到的是“区分这 10 个固定类别的决策边界”一旦测试出现新类别它的特征空间分隔方式不一定有泛化能力。Episodic 训练迫使模型不断适应随机抽出的类别组合学的不是“某个类的分类器参数”而是“如何从少量样本构建一个可分性强的特征空间”。放到轴承诊断里如果你的全部故障数据来自电机驱动端训练任务中的 N 个类别就是从这些故障类型里随机抽的。而实际部署时现场出现的新磨损程度、新故障类型只要支持集给几个样本模型就能在测试时把它们纳入判别体系不需要任何训练更新。这就是这套方法最实用的地方。3.2 原型计算与前向过程欧氏距离为什么比余弦距离更稳模型的前向过程可以拆成五步。第一步特征提取。支持集和查询集的一批样本都输入特征提取器 f_φ得到维度为 d 的特征向量。特征提取器可以是 ResNet 去掉全连接层后的输出也可以是轻量 CNN 的输出输出向量一般用全局平均池化压到一维。第二步计算原型。对每个类别 k把该类所有支持集样本的特征取平均c_k (1 / |S_k|) * Σ f_φ(x_i), x_i ∈ S_k这一步就是纯粹的向量平均没有任何可学习参数。第三步计算距离。对查询样本 x_j计算它的特征向量与每个原型 c_k 之间的欧氏距离 d(f_φ(x_j), c_k)。原型网络的原始做法里作者特别强调欧氏距离比余弦距离好原因是欧氏距离定义的空间更符合“样本围绕原型各向同性分布”的假设而余弦距离只关注方向、不关注长度会丢失特征本身的尺度信息。实践中我也验证过这个结论换成余弦距离后准确率确实掉了几个点。第四步Softmax 归一化。距离值取负号后经过 softmax得到查询样本属于每个类别的概率p(yk | x_j) exp(-d(f_φ(x_j), c_k)) / Σ_k exp(-d(f_φ(x_j), c_k))注意这里用欧氏距离而不是平方欧氏距离损失函数里可以直接用交叉熵原因在于 softmax 内部对距离取负号后已经保证数值稳定不需要额外开平方。第五步计算损失。对查询集中的每个样本用交叉熵损失求和反向传播只更新特征提取器 f_φ 的参数。这里有一个工程细节为了防止距离值过大导致 softmax 输出接近 one-hot 而梯度消失有人会在距离上乘以一个温度系数 ω。模型收敛后一般同类样本的特征距离在 2~4异类距离在 5~8。如果训练中发现损失下不去或者准确率波动大可以试调温度系数。3.3 多尺度注意力模块的结构设计和插入位置多尺度注意力模块的设计我实际操作下来最稳定的是这样组合先用几个不同膨胀率的深度可分离卷积分支并行提取特征。假设输入特征图是 X形状是 [B, C, H, W]。三个分支分别用 3×3 卷积、膨胀率分别为 1、2、4 的空洞卷积提取特征。每个分支后接 BatchNorm 和 ReLU。输出分别记为 F1, F2, F3。然后做特征融合。把三个分支的输出在通道维度拼接起来再经过 1×1 卷积把通道数压回 C。这里是第一次信息融合。接下来接一个通道注意力对融合特征做全局平均池化和全局最大池化分别经过一个共享的两层感知机输出逐元素相加后用 sigmoid 得到通道权重和融合特征逐通道相乘。最后接一个空间注意力对上述输出沿通道维度求均值得到 [B,1,H,W]经过一个 7×7 卷积和 sigmoid得到空间权重逐元素乘回原来的特征最终得到模块输出。整个模块用残差连接加到输入 X 上。这个结构每个部分都有它的作用。空洞卷积分支构建多尺度感受野通道注意力回答“哪些故障特征通道更重要”空间注意力回答“时频图哪个区域值得关注”。一套下来模型就能聚焦到时频图上的冲击亮斑区域而不是被背景噪声带着跑。插入位置有讲究。我建议放在特征提取器的高层也就是网络尾部靠近原型计算的位置。原因很简单低层特征主要是边缘、纹理这些局部的通用信息不适合做强语义级注意力高层特征已经包含了故障类别的判别模式这个时候做多尺度融合和注意力加权能直接影响原型向量的质量。具体到 ResNet 结构我会替换掉 layer4 之后的那一层或者在原来全局池化之前插入。3.4 骨干网络选型在小样本面前深不是优点而是负担很多读者会默认选择 ResNet-50、ResNet-101 这种深度网络作为骨干。在小样本场景下这是个大坑。原因在于可学习的参数量越大就需要越多的数据来约束它。5-way 5-shot 的每个 episode 只有 25 个支持样本深网络很容易在这些样本上直接死记硬背。除非你有大规模同领域数据做预训练否则不建议直接用超过 ResNet-18 容量的网络。我更推荐自己搭一个轻量特征提取器4~5 层卷积每层卷积核数量从 16 逐步递增到 128中间夹着 BatchNorm 和 ReLU下采样用最大池化或者步长为 2 的卷积。最后一层接全局平均池化输出 128 维或 256 维的特征向量。这个参数量在百万级别小样本条件下比 ResNet-50 稳定得多。多尺度注意力模块接在这个轻量网络的尾部膨胀率分支控制在三个以内避免引入太多额外参数。很多实战项目里诊断准确率的差距主要来自特征图和任务构造方式而不是骨干网络堆得有多深。把骨干控制在 ResNet-18 以内的体量加上提前终止和正则化是稳妥做法。4. Pytorch 实操数据组织、网络搭建与训练配置4.1 数据划分与加载千万别把同工况数据混进训练和测试工业数据的划分比很多人想的更讲究。如果你直接把原始振动信号随机切段然后把切好的样本随机分成训练集和测试集那你评估出来的准确率很可能虚高。原因很微妙同一段连续信号里切出来的两个样本高度相关训练集里出现过的工况特征在测试集里也天然存在模型其实是记住了信号片段而不是学懂了故障特征。正确做法是按“时间连续段”或者“工况条件”划分。采集到的振动信号通常按秒或分钟存储应该先把整个文件按时间顺序分割成若干大段训练集取前面若干段的样本测试集取后面若干段的样本绝不交叉。如果现场有多组转速、载荷工况可以做更严格的协议用工况 A 的数据训练用工况 B 的数据测试这样检验的是模型的跨工况泛化能力。小样本诊断进产线最怕的就是换了个工况模型就崩所以划分策略要严格宁可准确率看起来低一些也要真实可用。4.2 Episodic 采样器与数据载入的标准姿势在 Pytorch 里标准的 DataLoader 是按类别均匀采样但原型网络需要的是“每个 batch 是一个 episode”所以数据载入逻辑要单独写。核心思想是建立训练集类别到样本索引的映射字典每个 episode 开始时随机抽取 N 个类别每个类别随机抽取 K 个支持样本和 Q 个查询样本通常 K5Q5 或 10。这些样本组合成支持集张量 [NK, C, H, W] 和查询集张量 [NQ, C, H, W]同时记录每个样本的类别标签用 0~N-1 的整数重新编号便于计算损失。训练时每个 epoch 跑多少个 episode 取决于数据规模。一般训练集类别多、每类样本量几十个的时候每个 epoch 跑 100 个 episode 就够了类别少的情况下跑 50 个 episode防止反复采样同一批样本造成过拟合。验证阶段固定一个随机种子每次评估用同一批 episode保证结果可比。4.3 损失函数、优化器和训练超参数的参考配置优化器选 AdamW 或者带动量的 SGD 都可以。我的经验是小样本任务里 SGD 的泛化能力优于 Adam但 Adam 收敛更快调参更省事。如果你有精力调学习率SGD 配 momentum0.9初始学习率 0.001配合余弦退火训练后期效果更稳如果图省事AdamW 初始学习率 3e-4权重衰减 1e-4也能正常收敛。损失函数就是查询集的交叉熵没有额外花哨项。多尺度注意力模块的监督信号完全来自这个损失不需要单独为注意力加辅助损失——加辅助损失在数据充足时有用小样本下纯粹是增加过拟合风险。训练轮数一般 100~150 个 epoch。每轮结束后在验证集上计算 acc保存验证集准确率最高的模型参数。注意验证集也要按 episode 方式评估随机抽多个测试 episode取平均准确率并记录标准差。只跑一两个 episode 的评估结果方差太大至少要 30 个 episode 以上的平均数字才可靠。超参数参考表超参数推荐值说明N-way5训练类别数跟你的故障类别数匹配K-shot5支持集每类样本数样本太少可降为 3Q-query10查询集每类样本数输入尺寸128×128小样本场景避免过大特征维度128 / 256轻量网络输出优化器SGD(m0.9)泛化性好收敛稳学习率1e-3配合余弦退火或阶梯下降Epoch100~150提前终止以验证集为准温度系数1~2距离 range 异常时调整4.4 常见的数据增强手段与时频图增强策略很多做图像分类的同学会把 RandomCrop、RandomHorizontalFlip 直接搬过来但对时频图要慎重。水平翻转相当于时间反转会让原本的冲击序列变成倒序轴承信号的因果关系被破坏类别信息不一定还能保持垂直翻转更危险直接颠倒频率轴低频变高频类别关系彻底错乱。这两种增强对于时频图基本不用。真正有用的增强有两类。一类是信号层面的在原始一维信号上做随机幅度缩放、随机平移、叠加噪声再重新生成时频图。这样增强的是样本多样性包含物理意义。另一类是图像层面的随机在时频图上遮挡某个小区域类似 Cutout或者在时间轴方向做小范围的随机裁剪加 resize。时间方向的平移对轴承冲击信号来说是安全的相当于改变截取时刻。但注意小样本场景下增强要谨慎使用。只有一个故障样本时大面积遮挡可能把真实故障特征也遮掉反而教坏模型。我的经验是轻度增强幅度缩放 0.9~1.1 倍、时间轴随机平移不超过样本长度的 10%Cutout 的遮罩块尺寸控制在 16×16 以内。4.5 CWT 批量转换的效率优化CWT 计算的瓶颈在小波卷积如果每个样本在训练时实时计算训练速度会非常慢。我通常的工程安排是离线阶段把所有样本做 CWT得到时频图数组直接以 NumPy 矩阵的形式存内存或磁盘训练阶段只做读取和简单的图像增强。如果数据集规模大、内存放不下可以分批次在数据加载器里做 CWT但建议在加载器里缓存结果。PyWavelets 的pywt.cwt在 CPU 上跑一个 2048 点样本、128 个尺度大约耗时 5~10ms一万个样本就是 50~100 秒可接受。如果嫌慢可以把多个尺度的小波滤波结果用 Pytorch 卷积实现在 GPU 上并行计算能快一个量级。5. 训练中反复踩过的坑与排查方法5.1 CWT 处理完的结果怪异先查尺度范围和采样率关系一个常见的坑生成的时频图里所有能量都集中在图的最底部或最顶部看起来就像一条横线。原因几乎总是尺度范围设错。如果你在 12kHz 采样率下分析的频率范围集中在 3kHz~6kHz但你只选了尺度 1~64小尺度对应高频率频率范围可能被推得太高超过了信号有效频带。反过来低频故障特征频率可能没落在分析频带内。排查的方法是打印小波中心频率和尺度序列的关系手动算一下你选择的尺度范围对应的实际频率范围是否覆盖了目标频带。不要把尺度范围当作“超参数”随手填一个 1~128先计算再实验。头几次调试时我会把某个样本的时频图直接可视化保存下来用肉眼确认故障冲击成分是否以明显亮斑出现再做后续训练。5.2 小样本场景下的严重过拟合模型在验证集上崩盘最常见的问题是训练损失在下降但验证准确率始终不动甚至越来越差。这说明模型已经开始死记硬背训练集的少量样本了。排查顺序有四个第一特征提取器是不是太深太宽了换更轻量的骨干或者减少各层卷积核数量。第二支持集样本是不是被特征提取器投影到了过度复杂的空间尝试降低特征维度到 64 或 128。第三数据增强是不是没加或者太弱小样本下完全没有增强过拟合几乎必然。第四训练轮数是不是太长了小样本任务往往 50 到 100 个 epoch 就到顶了硬训到 200 个 epoch验证集准确率反而下降。定期保存验证集最优模型而不是直接保存最后一个 epoch 的参数。还有一个隐蔽的原因验证集的评估方式。如果验证集和训练集来自同一段连续信号验证集准确率虚高但换到现场数据就崩。按工况划分数据之后准确率下降是正常的那才是真实泛化性能。5.3 原型网络在类内离散度大时失效如何稳定原型原型网络有一个天然弱点当同一故障类别内部存在明显分布差异时比如同一类故障在不同转速下的特征差异很大简单地取支持集样本特征的平均来作为原型可能被离群样本带偏。这种情况下有几个修法。最直接的是增加 K-shot 数量K 从 5 提到 10让原型估计更稳定。其次是训练时采用“硬正样本挖掘”或“原型细化”第一次算完原型后计算支持集样本与各自原型的距离去掉距离过大的离群支持样本重新计算原型再做查询集分类。这个技术在样本数量允许时效果不错相当于给原型做了一个简单的鲁棒化。另外可以考虑做一个“原型修正模块”把支持集所有样本的特征拼接后经过一个小型注意力网络输出一个修正向量加到原始原型上。但这个模块在小样本下容易过拟合使用前务必加上强正则化和充分的验证。5.4 类与类之间总是混淆时频图信息不够还是注意力没抓到重点如果混淆矩阵里某两类错误率特别高比如滚动体故障和正常状态总是分不开先别急着调模型回到时频图上看这两类样本的时频图视觉差异是否明显。如果人眼都看不出区别那要先回到信号处理环节检查采样率设置是否够高、分析频带是否选对、样本长度是否覆盖足够的冲击周期。一种非常典型的情况是滚动体故障的冲击特征比较微弱同时伴随较强的旋转谐波成分。CWT 时频图上谐波成分的亮带会掩盖故障冲击的亮点。此时可以加一个前置的梳状滤波或者包络解调预处理先把旋转谐波去掉再送进 CWT。这一步在论文里很少有人提但工程上非常管用。另外检查多尺度注意力模块是不是全部注意力权重集中在了某些固定通道。打印一组测试样本的注意力热力图如果看到网络总是盯着时频图左上角或者固定频带的位置说明训练过程产生了位置偏差可以通过增强时间平移或者调整空间注意力卷积核大小缓解。5.5 训练速度慢和显存瓶颈原型网络训练时每个 episode 包含支持集和查询集backbone 需要同时对两组样本做前向传播。如果你的 batch 是指 episode 个数且每个 episode 内有 25 个支持样本加 25 个查询样本显存占用比普通分类训练高不少。小显存的同学可以把支持集和查询集分开前向也就是先算支持集特征和原型再在计算查询集特征时复用同一个 backbonePytorch 会自动累积梯度不需要两个分支同时驻留显存。这个操作在代码实现上也很简单支持集和查询集拼接成一个大张量走一次前向当然方便但显存紧张时拆开走两次时间换空间损失函数不受影响。训练批次大小可以调小到 8 或 4 个 episode梯度积累两轮再更新参数速度和显存都能兼顾。最后的调整心得实际操作中我的体会是整套方案的瓶颈往往不在模型结构而在 CWT 特征图质量。第一次跑通之后与其急着换个更大的骨干网络不如先花时间把尺度范围、样本长度、归一化方式这些信号处理细节调到位。同一个数据集CWT 参数调整前后最终诊断准确率的差距可能超过 15 个百分点这比任何网络结构上的修修补补都来得直接。还有一个小技巧是建议在支持集样本上做局部遮挡增强——对时频图随机遮住小块区域能显著增强小样本下特征提取器的稳定性。我试过这个操作之后测试集上的准确率波动明显变小。后续如果要继续扩展可以考虑把查询集的近邻信息引入原型修正或者用半监督方式把大量无标注的正常样本利用起来这些方向在工业落地中都有很大潜力。但先把这一条完整链路跑通已经能解决很多现场实际的“故障数据不够却必须诊断”的难题了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑