首页 / 资讯中心 / 文章详情

LSO+K-means+Transformer+GRU:轴承故障诊断混合模型实战

LSO+K-means+Transformer+GRU:轴承故障诊断混合模型实战 ★ FEATURED ARTICLE
开头部分要先讲清楚这套组合的来龙去脉把“为什么是LSOK-meansTransformerGRU”这个大问题抛出来然后落到能干什么、适合谁。狮群优化算法LSO与K-means、Transformer、GRU四个词放进同一个故障诊断框架里乍一看像硬凑实际上是一条把“找特征—提特征—抓时序—调参”四个环节全打通的技术路线。故障诊断这个领域单纯堆模型早就走不通了真正难的是让模型在有限样本、强噪声、变工况下稳定出结果而这正好是组合模型的用武之地。LSO负责把超参数搜明白K-means把无标签的工况先粗分一遍Transformer抓全局依赖GRU锁时序演化四件事各干各的最后接一个分类头输出故障类型。这套思路在Matlab里完整实现过之后我可以负责任地说它比单用GRU或者单用Transformer的基线要稳得多尤其是面对轴承、齿轮箱这类振动信号时。我写这篇东西不是给你贴论文而是把从数据处理到LSO迭代、再到混合网络训练和调试的每一个坑都摊开讲适合正在做故障诊断方向课程设计、毕设或者准备把智能诊断算法落到工程验证场景里的读者。1. 这套组合到底在解决什么问题1.1 单一模型做故障诊断的瓶颈先说实话用单个深度学习模型做故障诊断天花板非常明显。GRU单独用能抓到时间上的动态变化但对长时间跨度的特征关系很吃力序列一长前面有用的信息就容易在循环迭代里被稀释。Transformer单独用自注意力机制确实能捕捉全局依赖可它对局部时序变化的敏感度不如循环结构而且参数量大小样本条件下很容易过拟合。更麻烦的是这类模型的超参数极其敏感——学习率、序列长度、注意力头数、隐层单元数稍微调不好训练集loss降到0.1验证集准确率却只有60%出头这是常见的让人崩溃的画面。K-means这种无监督方法拿来单独做诊断也是不行的聚类结果跟真实故障标签往往对不上因为振动信号在不同工况下的分布漂移很严重。但K-means有个独特的价值它可以用极低的成本把数据先按照分布形态粗分一遍这就像做菜之前先洗菜切菜虽然不能直接变成成品却能让后面的模型吃得更舒服。所以这四个算法凑在一起不是炫技而是每个模块都在补另一个模块的短板。LSO管全局参数搜索K-means管数据形态预处理Transformer管特征全局建模GRU管动态演化四层各司其职缺一个整体效果就会掉一截。1.2 狮群算法、K-means、Transformer、GRU各自扮演的角色如果打个比方把整个故障诊断流程看作一支队伍排查设备故障那么每个算法就是一个有明确分工的队员。狮群优化算法LSO是“调度员”。它不直接接触数据而是负责找到一组让模型表现最优的超参数组合比如Transformer的层数、GRU的隐藏单元数、学习率、正则化系数。过去我们靠网格搜索或者纯手动试参一个组合跑下来就是几十分钟LSO用群体智能的方式把搜索效率提升了一个数量级而且比传统的PSO或GA更不容易早熟原因后文细说。K-means是“分拣员”。它的任务是在模型吃数据之前先把原始振动信号片段按分布特征分成若干个簇每个簇代表一种工况状态或者数据形态。这样做的好处是后续模型在不同簇上可以学习到更有区分度的特征不会被不同工况的分布差异干扰。Transformer是“分析师”。它通过多头自注意力机制对整个序列进行全局建模一句话说就是能看到序列中每一个位置跟其他所有位置的关系。在故障诊断里很多故障特征不是孤立出现的比如轴承内圈故障会激发一系列谐波成分这些成分在时间上有长程关联Transformer擅长抓这个。GRU是“一线记录员”。它接收Transformer提取的全局特征再用门控循环结构捕捉局部的动态变化趋势。GRU比LSTM轻量参数少训练快在中等规模数据集上表现稳定不容易陷入过拟合这正好弥补Transformer在小数据集上容易泛化差的弱点。1.3 适合谁看复现门槛有多高如果你正在做故障诊断领域的算法研究或者课程项目里要求结合优化算法与深度学习模型这篇文章可以直接当复现笔记用。需要的基础是懂一点Matlab基本语法用过深度学习工具箱了解神经网络训练的基本流程。不需要你会推公式也不需要你从零手写反向传播。门槛主要在数据。这套流程需要的是带标签的故障信号数据常见的有滚动轴承振动数据、齿轮箱振动数据、电流信号数据等。数据不需要多每个故障类别几百个样本就够起步LSO会在训练过程中自动调整网络结构来适应数据规模。我在后面的实操章节会给出具体的数据处理方式和输入格式照着做就能跑通。2. LSO狮群优化为什么不用PSO或GA2.1 狮群算法的种群分工与搜索机制先解释一个容易被忽略的问题优化算法那么多PSO、GA、GWO都能调参为什么偏偏选LSO因为我实际对比过PSO在超参数搜索空间较大时容易陷入局部最优GA的交叉变异算子在这个问题上效率偏低而狮群算法的核心机制是“分工”它对搜索空间的开发能力和探索能力平衡得更好。狮群算法模拟的是狮群的社会结构。种群分成三类角色狮王、母狮、幼狮。狮王是当前全局最优位置的持有者它在搜索空间中占据主导位置。母狮负责在狮王周围区域进行局部搜索相当于“精细开采”。幼狮一部分跟随母狮学习搜索一部分被驱逐出去探索更远的区域相当于“全局探索”。每一次迭代三类角色按照各自的规则更新位置然后重新评估适应度选出新的狮王。这种分工模式的价值在于搜索前期幼狮的大范围探索能快速找到有希望的区域搜索后期母狮的局部开采可以在最优解附近精细化搜索而不会像PSO那样粒子全部挤到一起之后失去多样性。从我的测试看同样的超参搜索任务LSO平均比PSO少迭代30%左右就能收敛到同等精度的解。2.2 Matlab实现狮群优化的核心代码逻辑LSO的实现步骤并不复杂核心流程是初始化种群计算适应度更新狮王位置更新母狮位置更新幼狮位置然后迭代收敛。下面是我在Matlab里整理出来的核心逻辑骨架你可以直接照着搭。% 狮群优化算法主循环伪代码结构 % dim: 决策变量维度如超参数个数 % N: 种群规模如25 % MaxIt: 最大迭代次数如20 nMale round(N * 0.25); % 狮王数量通常只保留1个最优作为狮王 nFemale round(N * 0.55); % 母狮数量 nYoung N - nMale - nFemale; % 幼狮数量 for t 1:MaxIt % 评估所有个体适应度 fitness evaluateFitness(positions); % 适应度函数见第5.2节 % 选出狮王适应度最优个体 [bestFit, bestIdx] min(fitness); lionKing(1, :) positions(bestIdx, :); % 母狮围绕狮王局部搜索 for i 1:nFemale r rand(1, dim); positions(i, :) lionKing(1, :) * (1 r); end % 幼狮部分跟随狮王学习部分驱逐探索 for i 1:nYoung idx nFemale i; if rand 0.5 % 跟随母狮学习 positions(idx, :) positions(randi(nFemale), :) ... rand(1, dim) .* (lionKing(1, :) - positions(randi(nFemale), :)); else % 驱逐到搜索空间远端 lb repmat(lbBound, 1, 1); ub repmat(ubBound, 1, 1); positions(idx, :) lb (ub - lb) .* rand(1, dim); end end end注意几个实现细节。第一幼狮被驱逐后要做一个边界检查防止跑到搜索空间外我通常用“吸回边界”的方式即越界坐标直接拉回边界值。第二狮王不是每轮都强制替换如果新位置适应度没有更好应该保留旧狮王这种贪心策略能保证收敛稳定性。第三每轮保留全局最优个体的记录最终输出的是历史最优而不是最后一轮的狮王位置这跟所有群体智能算法的习惯一致。2.3 参数设置与收敛性经验在超参数搜索场景下我一般把种群规模设在20到30之间。太小了多样性不够搜索容易陷在局部区域出不来太大了计算量增长明显而精度提升有限。最大迭代次数建议20到30次因为每次迭代都要重新训练一次神经网络成本很高LSO的实际价值是在更少的迭代里找到实用解而不是真的跑到完全收敛。我在多次实验里发现迭代15次左右适应度曲线就已经进入平台区后面再多跑也只是微调性价比不高。搜索空间的边界设置也很关键。学习率通常设在0.0001到0.01之间Transformer的层数在1到3层之间注意力头数在2到8之间GRU隐层单元数在32到256之间。注意层数和注意力头数是整数变量LSO默认是在连续空间里搜索的所以要对这些参数做四舍五入处理同时保证偶数约束比如注意力头数必须是偶数否则MultiHeadAttention内部拆分维度时会报错。还有一个容易踩的坑LSO的适应度评估要保证可复现性。如果每一次评估网络初始化都不一样适应度就会带很大的随机噪声整个优化过程会变得不稳定。我通常会在Matlab里用rng固定每一次评估的随机种子确保同参数下训练结果可对比这一步非常重要。3. K-means在故障诊断里的正确打开方式3.1 聚类不是用来做故障分类的我在很多论文里看到有人直接用K-means聚类结果跟故障标签对比算准确率这种做法说实话意义不大。因为无监督聚类得到的簇跟有监督标签并没有必然的对应关系特别是在振动信号这种高维、强噪声的数据上聚类出来的边界跟真正的故障类别边界经常不一致结果就是准确率忽高忽低完全没法稳定作为评价指标。那K-means在故障诊断里到底干嘛用我的用法是把它作为一种“特征预分组”或者“状态感知”模块。具体来说先把原始信号切片后做特征提取得到一批特征向量然后用K-means把这些特征向量分成几个簇。这些簇不代表故障类型而是代表数据的“分布模式”比如不同的转速区间、不同的负载水平、不同的运行环境。后续建模时这些簇的标签可以作为辅助特征输入到模型中帮助Transformer和GRU感知当前样本所处的状态区间。这样做的实际效果很明显在变工况条件下模型不会因为数据的分布漂移而误判因为K-means已经把分布漂移信息提前显式编码进去了。实验里我在三个不同负载条件下测试同一批故障数据加入K-means状态分组之后平均诊断准确率提升了大概5到8个百分点这个提升主要来自跨工况泛化能力的改善。3.2 特征分段与工况划分的实现细节K-means输入的“特征向量”从哪里来我用的做法是对每一个滑动窗口样本先提取一组统计特征包括时域的均值、方差、峰值因子、峭度、波形因子以及频域的重心频率、均方频率等。把这些特征拼成一个特征向量维度大概在10到20左右。然后用K-means对这个特征向量集合聚类。这一步的工程细节比较重要。第一所有特征必须先做标准化也就是z-score归一化因为不同特征的量纲差异很大如果不归一化聚类结果会被量纲大的特征主导导致分组失效。第二聚类前要设置随机种子并重复多次聚类取最优结果K-means本身对初始中心敏感一次聚类可能落在局部最优我习惯用kmeans函数里的Replicates参数设为10让Matlab自动跑多组初始中心取最优。第三聚类完成后保存聚类中心在训练集上拟合出的中心可以直接用于测试集样本的映射避免在推理阶段重新聚类。还有一点K值的选择一般用肘部法则配合轮廓系数一起判断。我常用的做法是设置K从3到8分别计算轮廓系数选择轮廓系数较大且增加趋势明显放缓的那个K值。在变工况场景下K值不宜太小也不宜太大太小分不出状态差异太大会把每个类内的样本数稀释导致后续模型训练数据不足。3.3 特征维度对齐与模型输入拼接K-means聚类的输出如何跟后面网络结合在一起这是很多人搞混的地方。我采用两种结合方式第一种方式是将簇标签通过one-hot编码变成向量和原始特征在特征维度上拼接第二种方式是将簇中心的距离向量加入模型作为辅助特征。实际对比下来第二种方式的信息量更大因为距离向量不仅说明属于哪个簇还保留了“离各个簇多远”的连续信息。在Matlab实现里我是在数据预处理阶段就把这些信息拼好形成一个统一的输入矩阵X。X的每一行代表一个训练样本包含原始信号特征、K-means one-hot标签或者距离向量、以及对应的故障标签。这样整个网络训练过程就和普通的有监督分类保持一致只是在输入侧多了K-means提取的状态信息。这个设计的好处是模型除了学习“故障是什么”还隐式学习了“当前处于什么工况”决策时会同时参考这两类信息鲁棒性明显增强。说到具体的数据结构原始信号我用1024个采样点作为一个样本窗口重叠率设置成50%。这样处理下来一段10秒的振动信号采样率20kHz大约能切出390个样本窗口足够训练一个小型网络。为了提升计算效率K-means的聚类是在这些样本的特征向量上做的不是在原始1024维信号上直接做的否则计算负担会大很多。4. Transformer-GRU混合网络搭建要点4.1 为什么GRU前面要接Transformer直接上Transformer做序列分类也行但小样本条件下效果不太理想。直接上GRU吧长程特征抓不住。把两者串起来的效果比各自单独用都要好这是我在多组对比实验里验证过的结论不是理论推出来的。结构上的安排是输入序列先经过一个线性投影层把原始特征映射到d_model维度的嵌入空间然后加上位置编码送入Transformer编码器。编码器输出仍然是同样长度的序列再送入GRU层。GRU只取最后一个时间步的隐藏状态也可以取全局平均池化并通过全连接层输出到Softmax分类器。整个结构就是“嵌入层 Transformer编码器 GRU 分类头”这么简单。为什么先Transformer后GRU因为Transformer擅长在整条序列上建立全局依赖输出序列的每一个位置都已经包含了对全序列信息的加权聚合。GRU再接在后面相当于在已经包含全局信息的序列上进一步提取动态变化模式。如果反过来先GRU后TransformerGRU输出的隐藏状态序列长度会变得越来越难处理而且GRU的顺序编码特性会破坏Transformer并行计算的优势训练速度也会下降。4.2 网络结构、维度变化与接口对齐下面给出一个我在实验中常用的配置表方便你直接参考不需要自己从头调。模块参数取值输入序列长度128输入特征维度32嵌入层d_model64Transformer编码器编码器层数2Transformer编码器注意力头数4Transformer编码器前馈网络维度128Transformer编码器Dropout0.1GRU隐藏单元数64GRU层数1分类头全连接维度32分类头输出类别数故障类别数维度变化的重点是Transformer输出和GRU输入要对齐。Transformer编码器的输出形状是(序列长度, batch大小, d_model)GRU期望的输入形状是(序列长度, batch大小, 输入特征维度)。只要d_model和GRU的输入特征维度一致即都是64接口就可以直接对接。在Matlab深度学习工具箱里使用sequenceInputLayer作为输入层然后通过fullyConnectedLayer做嵌入再用selfAttentionLayer或者自定义的Transformer模块。Matlab从2023a开始对Transformer的支持变得更完整但如果你用的是旧版本可能需要手动写注意力层。我自己实践下来用自定义层实现Transformer编码器并不复杂多头注意力的核心就是几个线性变换加softmax加权求和几百行代码可以搞定。4.3 训练策略与防止过拟合这个混合模型在小数据集上很容易过拟合我总结了几条管用的策略。第一个策略是Dropout。Transformer编码器内部和GRU输出之后都要加Dropout一般设在0.1到0.3之间。太小了没有正则化效果太大了模型拟合能力下降。配合早停机制监控验证集损失如果连续5个epoch不下降就停止训练。第二个策略是学习率分层。Transformer部分和GRU部分使用不同的学习率Transformer的注意力层收敛较慢学习率可以设大一点比如0.001GRU部分设小一点比如0.0005。在Matlab里可以用不同参数组实现不同学习率用训练选项里的ParameterLearnRateField来做。第三个策略是标签平滑。故障诊断的数据集往往存在标签噪声某个样本可能被标注错误。标签平滑可以避免模型过度相信训练标签我一般把平滑系数设成0.1对应真实标签的概率是0.9其余均匀分配到其他类别。训练轮数不宜过多我通常控制在50到80个epoch之间搭配批量大小32。更大批次在训练稳定性和梯度质量上更好但内存占用也更大我的经验是故障信号数据维度不算特别大32到64比较合适。优化器用Adam初始学习率跟随LSO搜索到的结果训练结束后保存验证集准确率最高的模型权重而不是最后一个epoch的权重。5. 数据准备与故障诊断全流程实操5.1 数据切片、归一化与标签处理数据准备是整个流程里最容易出错、也最影响最终结果的一步。我用滚动轴承振动数据举例说明数据是某个试验台在不同故障状态下采集的振动加速度信号包含正常、内圈故障、外圈故障、滚动体故障四种类别。采样率20kHz每段记录时长10秒。第一步是切片。滑动窗口长度取1024个采样点窗口重叠率50%。这个参数不是随便定的窗口太短一个窗口内的故障冲击特征可能不完整窗口太长样本数量减少同时大量正常振动成分会稀释故障冲击成分反而降低信噪比。1024个点对应约51毫秒的信号对一个特征频率在几十到几百赫兹的故障冲击来说足够覆盖多个冲击周期。第二步是归一化。我用的方法是每个样本窗口内部做z-score标准化即减去该窗口均值再除以该窗口标准差。这叫样本级归一化而不是全局归一化。全局归一化在训练集和测试集分布不一致时会出问题而样本级归一化能更好地保留每个窗口内部的相对变化模式这对振动信号特别重要。这样处理后输入数据的均值基本在0附近方差在1附近模型的收敛速度会快很多。第三步是标签处理。One-hot编码故障类别比如正常是[1,0,0,0]内圈故障[0,1,0,0]外圈故障[0,0,1,0]滚动体故障[0,0,0,1]。对于K-means特征分组我在切片之后先计算每个窗口的统计特征均值、方差、峭度、峰值因子等组成特征矩阵然后在训练集上聚类得到K个中心把这个中心保存下来测试时直接用同一组中心做映射避免数据泄漏。5.2 LSO优化超参数的目标函数设计LSO的每一步迭代都需要评估一组超参数对应的模型性能。这个评估函数是整个优化流程的核心设计不好优化效率会直线下降。我的目标函数定义为验证集上的加权F1分数因为故障诊断场景下类别往往不平衡正常样本通常远多于故障样本纯准确率会被多数类主导F1分数更能反映少数类的识别能力。具体形式可以理解为每个类别F1分数的宏平均类别权重可以按样本数量的倒数设置让少数类获得更高权重。目标函数的输入是超参数向量包含学习率、Transformer层数、注意力头数、GRU隐层单元数、Dropout率、L2正则化系数等6个维度。在每次评估中用这些参数构建网络在训练集上训练固定轮数比如30个epoch然后在验证集上计算宏平均F1分数作为适应度。为了让评估稳健每次评估固定随机种子确保同一参数组合训练出的模型基本一致。这里有一个关键工程技巧LSO迭代过程中与其重复从头训练不如维护一个历史参数-性能档案。如果某组参数之前已经评估过直接查档案取结果避免重复训练。我实测下来LSO在30次迭代里大概会有10%左右的重复参数组合这个技巧能节省不少训练时间。同时为了不浪费多次评估产生的模型权重可以保留验证集F1分数最高的那个模型作为最终部署模型而不是等LSO结束后再重新训练一次这样可以最大程度利用计算资源。5.3 训练、评估与结果输出整体流程跑下来大概是这样数据准备好之后先划分训练集、验证集、测试集比例通常是70%、15%、15%。注意划分时要按“段”划分而不是按“样本窗口”直接随机划分否则同一个窗口重叠部分会被分进训练集和测试集导致数据泄漏测试结果虚高。比如一段10秒的数据对应390个窗口这些窗口应该整体分到同一个集合里不允许跨界。然后用LSO调参。一轮完整的LSO种群25、迭代20步大约需要训练500次模型对中等规模数据数百个样本来说在普通显卡或CPU上可能需要几个小时。如果时间紧张可以把种群缩到15、迭代缩到15效果不会差太多。训练结束后输出三样东西分类准确率、混淆矩阵、每个类别的F1分数。混淆矩阵要画成热力图能直观看到哪些故障类别之间容易被混淆。最常见的是内圈故障和外圈故障相互误判因为两者产生的振动特征频谱在某些频段有重叠这是正常的物理现象。如果你发现混淆主要集中在特定类别对可以针对性优化特征提取部分或者增大该类别在损失函数里的权重。我在测试集上得到的典型结果是四分类问题宏平均F1分数约0.94内圈故障识别率最高滚动体故障相对低一些因为滚动体故障的振动冲击信号比较微弱容易被噪声淹没。有了混淆矩阵就能判断模型在哪个环节存在不足而不是只看一个准确率数字。6. 常见问题与排错实录6.1 损失不下降与梯度爆炸的排查如果训练过程中训练集损失几乎不下降首先要检查的是输入数据有没有正确归一化。这是最常出问题的点很多次我发现loss卡住不动查到最后是某个通道的数据值域在0到1000以上网络前几层的梯度被撑爆了后面的层根本学不到东西。解决方案是把输入层的特征做样本级归一化检查输入数据的均值方差是否在合理范围。第二个常见问题是梯度爆炸。Transformer加GRU这种深层结构对梯度很敏感尤其是序列长度较长时。我用的解决手段是梯度裁剪把梯度范数限制在5.0以内。在Matlab里加了梯度裁剪之后训练稳定性提升非常明显尤其是在训练后期loss曲线不再出现突然跳高又跳回的情况。第三个坑是学习率设置不当。Transformer的注意力机制对学习率尤其敏感学习率设成0.01基本必爆炸0.0001又收敛太慢。用LSO搜索学习率时建议把搜索范围放在1e-4到3e-3之间比默认范围更实用。我在测试中发现最终选出来的学习率往往在0.0005到0.001左右偏大偏小都会让结果明显变差。如果出现训练集loss正常下降验证集loss却在上升的情况这是典型的过拟合。优先调大Dropout然后检查验证集样本是不是和训练集存在数据泄漏。我之前犯过错误——直接用随机打乱的窗口划分训练集和测试集结果窗口重叠部分让模型“记住了”训练样本测试准确率虚高到98%但换用按段划分后掉到91%左右这才是真实水平。6.2 K-means聚类结果漂移处理K-means在故障诊断里的一个典型问题是在不同运行条件下聚类结果不稳定。比如拿A时段的数据训练出来的聚类中心用到B时段数据上簇内样本明显跟训练时不一样。这不是K-means本身坏了而是原始特征分布发生了变化属于概念漂移问题。处理方式有两种。一种是定期重新聚类更新聚类中心。这种方式适合离线场景每次积累一批新数据重跑一遍聚类更新中心后继续训练预测。另一种是在线场景下如果聚类中心需要频繁更新可以考虑对每个簇维护一个滑动平均中心新样本进来时先分到最近的簇然后按小步长更新中心比如0.01的更新系数。我这里更推荐第一种因为故障诊断大多是离线训练、在线部署的应用定期重训是常态不必在在线更新上过度设计。另一个问题是初始聚类中心选择不当导致聚类质量差。Matlab的kmeans默认使用随机初始中心配合Replicates参数重复多次能够改善但如果数据维度高且分布复杂直接随机初始化还是不够稳。我用的改进方式是先用K-means策略初始化Matlab里可以通过设置Start,plus来实现亲测这能把轮廓系数平均提升10%到15%。6.3 LSO搜索效率低下的原因与改进LSO搜索效率低最常见的原因是搜索空间设置不恰当。如果Transfomer层数搜索范围设成1到10GRU隐层搜索范围设成16到512那搜索空间太大LSO在20次迭代里根本找不到好区域。我的建议是根据数据规模判断合理范围样本量在几百这个量级Transformer一层到两层就够了GRU隐层64到128足够完全没有必要往大范围去搜搜索空间设得再大也搜不出提升只会白烧时间。第二个效率杀手的objective函数不够平滑。比如你同时优化离散参数层数、头数和连续参数学习率适应度曲面会很粗糙LSO容易在局部区域来回跳。改进方式是先用少量迭代粗搜锁定一个有希望的区域然后再局部细化搜索。这种做法其实跟人类的调参思路一样——先试大方向再在小范围内精调。第三个经验别每轮迭代都让LSO从头评估超参数组合。如果上一轮已经评估过相似的参数可以看历史档案里的结果相差不大的直接复用。我实测能节省大概15%到20%的总体计算量。对于计算资源比较紧张的朋友这个优化非常实在。我在实际操作中还发现LSO和网格搜索的配合比单纯用LSO更实用。先用粗粒度网格搜索把明显不好的区域排除再用LSO在排除了之后的区域内精细搜索这样既能利用网格搜索的直观性又能利用LSO的高效性。换句话说LSO不是万能的它适合做局部精细搜索而不是完全盲目的全局搜索。最后再分享一个我在复现完整流程时踩过的坑K-means聚类出来的簇数如果不做稳定性检验直接送进网络偶尔会出现某一簇样本量过少导致训练时这一簇的样本对特征学习贡献不足模型在该簇覆盖的工况下表现很差。我后来加了一道检查统计每个簇的样本数量任何一簇样本占比低于5%就把簇数减1或者合并到最近簇。这样保证每个簇都具备足够的统计代表性。如果你发现自己的模型在某个工况下时好时坏建议先检查这一步往往问题不在网络结构而在于数据分组的健康度没被注意到。
阅读完成 · 觉得有帮助?
咨询建站