项目介绍 MATLAB实现基于门控循环单元(GRU)进行轴承剩余寿命预测(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢
目录
MATLAB实现基于门控循环单元(GRU)进行轴承剩余寿命预测的详细项目实例... 2
请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人 或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解)... 2
MATLAB实现基于门控循环单元(GRU)进行轴承剩余寿命预测的详细项目实例
请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人
或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解)
轴承作为旋转机械中的关键基础部件,在工业生产、轨道交通、风力发电、航空航天以及智能制造等众多场景中承担着支撑旋转部件、传递载荷和保证设备稳定运转的核心任务。转子能否稳定、连续、低振动、高效率地工作,与轴承的健康状态紧密相关。一旦轴承发生疲劳剥落、磨损、裂纹、润滑失效或装配偏差等故障,不仅会导致振动与噪声显著增大,还可能引发整机停机甚至灾难性事故。因此,对轴承健康状态进行在线监测,并对其剩余寿命进行精确预测,已经成为现代工业设备运维管理中的重要课题。
在传统机械维护模式中,常见策略包括定期更换、事后维修、基于经验的预防性维护等。这些方式在早期工业环境下能够基本满足需求,但在当前生产节拍加快、设备价值高昂、停机损失巨大的背景下,已经暴露出明显不足。定期更换会造成大量剩余寿命被浪费,维护成本偏高;事后维修则存在突发停机风险,影响生产连续性,并可能在故障扩展阶段损坏更多部件。以轴承为代表的关键部件,其维护策略正从传统的被动式维护,逐步过渡到基于状态的预测性维护与健康管理。为实现这一目标,需要对轴承的剩余寿命进行更加可靠和精细化的估计。
随着传感技术与数据采集技术的进步,轴承的振动信号、声发射信号、温度、电流等多源数据可以在较高采样频率下长期采集和存储,为数据驱动的剩余寿命预测提供了丰富的基础。振动信号作为反映轴承内部微小磨损和结构缺陷最敏感、最直接的信号之一,被应用得最为广泛。通过对振动信号进行时域、频域以及时频域分析,可以提取均方根、峰值因子、峭度、包络谱特征、能量谱特征、小波能量等多种健康指标。但这些传统特征提取和建模方法往往依赖经验,难以充分捕获整个退化过程的复杂非线性动态关系。
数据驱动的剩余寿命预测思路在近十多年中发展迅速。早期方法往往依赖传统统计回归模型、状态空间模型或简单的机器学习方法,例如线性回归、支持向量机、随机森林等。这类方法在某些工况下可以取得一定效果,但在处理长时间序列、强非线性、噪声干扰明显、退化模式多样的轴承数据时,存在表达能力不足、特征需要人工设计、对工况变化敏感等局限。尤其是在轴承运行后期,退化速度往往呈加速趋势;同时负载、转速变化会改变振动能量分布,这些复杂因素使得传统方法难以建立统一且鲁棒的预测模型。
深度学习在语音识别、自然语言处理和图像处理等领域的成功应用,启发了将深度神经网络引入设备健康管理和剩余寿命预测领域的研究。在众多深度学习结构中,循环神经网络及其改进结构在处理时间序列问题时具有天然优势,能够通过隐含状态存储和更新历史信息,从而刻画数据在时间维度上的关联特征。标准循环神经网络在理论上可以处理长序列,但在实际训练中容易出现梯度消失或梯度爆炸问题,导致远距离依赖难以学习。为缓解这一问题,门控循环单元(GRU)和长短时记忆网络(LSTM)被提出,并在许多预测任务中显示出显著优势。
与LSTM相比,GRU结构更为简洁,只包含更新门和重置门两种门控机制,参数数量更少,训练速度更快,在数据规模有限或需要快速迭代的工业场景中更具有实用价值。GRU通过门控机制自适应地控制历史信息的保留和遗忘,使得网络可以根据轴承退化阶段自动调整记忆长度,从而更好地捕获残余寿命随时间变化的复杂规律。对于轴承剩余寿命预测任务,GRU能够利用长时间维度上的振动特征序列或健康指标序列,对未来一段时间的退化趋势进行建模,并输出当前时刻对应的剩余寿命估计值。
在工程实现方面,MATLAB在信号处理、时间序列分析和工程仿真领域拥有完整、成熟的工具链环境。利用MATLAB可以方便地完成振动信号预处理、特征提取、数据可视化、深度学习建模与训练,以及后续部署到工程系统的流程。尤其是在R2025b版本中,深度学习工具箱对序列网络、dlarray、dlnetwork等对象进行了不断完善,使得构建、训练和调试GRU网络用于回归任务更加稳定和高效。通过将传感器采集的轴承运行全寿命周期数据导入MATLAB环境,结合信号处理函数进行预处理,再接入深度学习网络进行建模,可以构建出一条贯通数据、算法和工程验证的完整技术路线。
针对轴承剩余寿命预测问题,引入基于GRU的深度学习模型,可以充分利用振动信号中蕴含的时间依赖信息,避免过于依赖人工经验进行特征工程。同时,借助MATLAB平台,可以在统一环境下进行数据清洗、特征构造、网络结构调整、超参数调优以及预测效果可视化和误差分析,从而形成一套可复用、可扩展的轴承剩余寿命预测方案。这样一套方案不仅有助于提升单个设备的安全性和可靠性,还可以为构建设备群的预测性维护系统提供研究基础和工程样例,对推动智能运维和工业数字化转型具有重要的现实意义。
项目目标与意义
提升轴承剩余寿命预测精度
主要目标之一是构建一个以门控循环单元为核心的时间序列回归模型,使其能够在存在噪声、工况变化和传感器漂移等复杂环境下,稳定地给出较高精度的轴承剩余寿命预测结果。传统基于阈值的健康指标方法往往在退化早期难以敏感反映寿命信息,而GRU通过在时间维度上的累积和记忆,可以在尚未出现剧烈振动增幅时,从细微的趋势变化中推断出潜在的退化轨迹。在模型训练阶段,通过引入多工况、多加载条件下的全寿命数据,结合合适的损失函数和正则化策略,使预测误差在整个寿命区间内保持稳定。通过实验对比,可以把均方误差、平均绝对误差控制在工程可接受范围,尤其关注后期高速退化阶段的预测稳定性。通过这种方式,目标不仅是提高单点预测精度,还包括改善整个退化曲线的拟合质量,从而使预测结果更符合轴承真实物理退化过程,为维护决策提供较为可靠的时间尺度依据。
降低运维成本与非计划停机风险
轴承的失效常常会造成整台设备停机,进而影响生产计划和经济效益。构建基于GRU的剩余寿命预测模型后,可以在轴承仍具备一定剩余寿命的阶段提前发出预警,辅助制定更为合理的维修计划和备件采购计划。通过对关键设备进行周期性监测,将预测出的剩余寿命与生产计划窗口进行匹配,可以在合适时间安排计划检修,避免临时停机,降低生产中断造成的损失。从运维成本角度看,通过延长健康轴承的使用时间,减少不必要的提前更换,同时防止故障扩展损伤其他高价值部件,总体维护成本会显著下降。此外,模型可以在运维管理系统中作为实时模块运行,当检测到寿命预测曲线出现异常加速下降趋势时,及时将信息推送给工程技术人员,实现由被动抢修向主动预防的转变。长期运行后,还可以根据预测结果和实际寿命的对比,不断修正维护策略,实现资产全寿命周期的精细化管理。
构建可复用的深度学习预测框架
项目目标不仅是针对某一套轴承数据构建一个专用模型,更重要的是在MATLAB环境下形成一套可复用、可扩展的深度学习预测框架。该框架包含数据预处理模块、特征构建模块、网络结构定义模块、训练与验证模块、模型评估模块等,可以适应不同类型振动数据和不同寿命定义方式的需求。通过参数化网络结构(如GRU层数、隐藏单元数、序列长度、批大小等),以及脚本化的训练流程,后续针对其他轴承型号或者其他旋转部件(齿轮、联轴器等)时,只需要更换数据和少量调整参数即可快速迁移复用。这样的框架在教学、科研以及企业内部工程试验中都有较高价值。更进一步,可以在此框架基础上扩展多输入多输出结构,融合载荷、转速、温度等多源信息,实现更复杂的健康状态建模,为构建统一的设备健康预测平台打下基础。
推动智能运维与工业数字化示范应用
轴承剩余寿命预测作为设备预测性维护中的一个典型应用场景,是智能运维系统的重要组成部分。通过构建基于GRU的模型并在MATLAB中实现完整流程,可以为相关行业提供一个具有可操作性和可验证性的技术样例。该项目有助于工程师和研究人员理解如何将时间序列深度学习模型与实际的振动数据相结合,从数据采集、处理、建模到预测结果展示和应用,形成贯通全流程的实践路径。在工业数字化转型过程中,需要大量这样的示范应用场景来验证技术路线、评估经济收益、总结部署经验。将该项目成果嵌入到设备监控系统或云平台后,可以形成面向轴承的智能监测模块,为后续扩展到更多设备、更多工艺环节提供模板。尤其是在风电机组、流程制造与智慧工厂环境中,通过这种模块化的预测模型,可以逐步构建面向整厂的健康管理与优化运维体系,推动工业系统向更高效率、更高可靠性和更低能耗方向发展。
项目挑战及解决方案
轴承退化数据的获取与质量问题
轴承剩余寿命预测的基础在于具备足够多、覆盖全寿命周期且质量可靠的退化数据。但是,在实际工业环境中,持续采集从健康到失效的完整数据并不容易。一方面,关键设备不允许运行到完全失效,这会造成安全风险和产能损失;另一方面,传感器安装位置、采样频率、数据采集系统稳定性等因素也会影响数据质量,经常出现丢包、噪声干扰、环境振动叠加等问题。当数据存在缺失段、时间戳偏移、传感器饱和或冲击干扰时,直接用于模型训练会导致网络学习到错误模式,从而影响剩余寿命预测的准确性与鲁棒性。对退化数据进行严格的预处理和质量控制是整个项目的首要挑战。
解决这一问题需要多层次策略。首先,在实验室环境或试验台架上构建轴承全寿命循环试验系统,通过设定不同载荷、转速和润滑条件,采集多组从健康到失效的振动数据,确保数据覆盖多种典型退化模式。对于已经采集好的数据,利用MATLAB的信号处理工具对时域波形进行去趋势、去直流分量、带通滤波,尽量抑制噪声与环境干扰。对存在缺失的片段,可以通过插值或剔除策略处理;对明显异常的冲击点,结合阈值和统计特征进行判断和修正。其次,在构建训练样本时,将连续的长序列切分为多个长度一致的子序列,并对各段数据进行标准化或归一化处理,使网络输入具有统一的数值尺度,减小个体差异与测点差异带来的影响。控制数据质量后,再将其输入GRU模型进行训练,可以显著提升模型的稳定性,减少因数据噪声导致的预测偏差。
轴承寿命标签定义与退化映射困难
对轴承剩余寿命进行建模时,如何定义寿命标签以及如何构建特征与寿命之间的映射关系,是一个关键且具有挑战性的问题。在理论上,剩余寿命是时间维度上的连续变量,需要从当前运行状态推断未来退化直至失效的时间。然而,在实际试验数据中,寿命往往通过某一故障阈值来确定,如振动均方根超过某值、包络谱特定频带能量达到某比例等。这些定义本身具有一定主观性,不同的阈值选择会导致不同的标签,使得模型学习存在不确定性。同时,同一批数据需要从每个时间点往后计算剩余寿命,这涉及到将时间序列向量映射到一个变化的标量,这种强非线性映射在不同工况间的可迁移性也存在挑战。
针对上述难点,解决方案包括多方面设计。首先,在标签构造阶段,采用统一的寿命定义标准,将失效时刻固定为某一统计指标超过阈值的时间点,并将各试验样本进行时间对齐,比如使用归一化寿命百分比表示退化过程。对于每一条时间序列,采用“时间距离失效点”的方式构建剩余寿命标签,即对每一个时间窗对应一个剩余寿命数值。这样形成输入子序列和对应RUL标签的配对集合。其次,在网络建模时,采用回归损失函数(如均方误差),让GRU直接拟合剩余寿命的数值。为了提高稳健性,可以对标签进行适度平滑或分段处理,例如在寿命后期使用更密集的数据点,以增强网络对快速退化阶段的学习能力。此外,通过对多组数据的交叉验证与对比,观察不同标签定义方式对预测结果的影响,从中筛选出既符合工程经验又利于网络收敛的寿命标签构造策略。这种规范的标签体系可以明显改善模型的可解释性和可推广性。
GRU网络结构、训练策略与工程可用性平衡
门控循环单元在理论上具有很强的序列建模能力,但在轴承剩余寿命预测场景中,网络结构设计、训练策略选择和工程部署需求之间存在平衡问题。如果网络层数和隐藏单元数量设置过大,会带来训练时间过长、对数据量要求过高以及过拟合风险;如果结构过于简单,又可能无法充分学到退化曲线的复杂模式。此外,不同工况和数据集对超参数的敏感程度不同,学习率、批大小、序列长度等参数选择需要通过实验调整。对于工程应用,模型不仅要在实验数据上表现良好,还必须具备一定泛化能力,能在新设备或新工况下保持合理预测性能,这对网络的正则化、早停策略以及数据增强方式提出更高要求。
解决这一挑战可以从结构设计、训练流程与工程集成三个方面着手。结构设计方面,采用一到两层GRU堆叠,并在输出端接入全连接层和回归层,通过逐步试验确定合适的隐藏单元数;同时引入dropout层减少过拟合。训练流程方面,利用MATLAB深度学习工具箱中的训练选项设置合适的初始学习率、学习率衰减策略、最大轮数以及mini-batch规模,通过监测验证集误差实现早停,从而在避免过拟合的前提下获得较优模型。在工程集成方面,将训练好的网络导出为可调用的函数或脚本接口,配合数据预处理模块,形成一套“输入振动数据,输出剩余寿命”的简单接口模式,便于集成到上位机监控软件或边缘设备中。通过这种系统化的设计,使GRU网络既保留足够的建模能力,又在实现复杂度和运行效率上满足工程应用要求。
项目模型架构
输入数据结构与特征表示
模型架构的基础在于对输入数据结构的合理设计和特征表示形式的选择。轴承的原始振动信号通常为高频采样的一维时间序列,单通道或多通道形式存在。直接将整段高频信号送入GRU会导致序列长度过长,计算负担沉重且不利于网络收敛,因此需要先进行适当的分段和特征压缩。常用做法是将连续运行数据按固定时间窗或固定采样点数进行切分,例如每个时间窗包含若干采样点,通过滑动窗口方式构造大量局部片段。对于每个窗口,可以选择两种思路:将窗内原始波形作为序列输入;或者对每个窗口计算若干统计特征(均值、均方根、峰值、峭度、频域能量等),用特征随时间变化构成较低维度的时间序列。前者保留更多细节信息,后者可以显著降低维度并提高计算效率。
在本项目架构中采用“特征序列输入”方式更适合工程落地:对每个时间窗计算一组时域与频域特征,将特征向量在时间维度上串联,形成长度为T、特征维度为F的矩阵,作为GRU网络的输入。这样,网络的每个时间步接收一个F维特征向量,从而在时间维度上学习特征变化与剩余寿命之间的关系。同时,为适应MATLAB深度学习工具箱对序列输入的要求,使用细胞数组或标准化的数值数组表示不等长序列,并在训练前进行归一化,将所有特征线性缩放到[0,1]或标准正态分布范围,以避免不同量纲和数值范围差异对网络训练造成不利影响。通过这种输入结构设计,可以在保证足够表达能力的前提下,有效控制网络的参数规模和计算消耗。
GRU层的核心结构与门控机制
门控循环单元是整个模型架构的核心。其工作原理基于门控机制,通过更新门和重置门控制历史信息的保留与遗忘,从而缓解梯度消失问题,提升对长序列的建模能力。在每个时间步,GRU接收当前输入向量和上一时刻的隐状态,通过一系列线性变换和非线性激活,计算出更新门值、重置门值以及候选隐状态,然后根据更新门输出新的隐状态。更新门的作用是决定在多大程度上保留上一时刻的隐状态信息,重置门则控制当前输入与历史信息的融合程度。对于轴承退化过程,这种机制可以让网络在早期退化阶段更注重长期趋势,在后期快速损伤阶段更加敏感于近期变化,实现自适应的记忆长度调整。
在MATLAB中构建GRU层时,可以直接使用深度学习工具箱提供的gruLayer,通过设置隐藏单元数量决定内部状态维度。多个GRU层可以堆叠使用,通过在时间维度上多次抽象特征,增强模型对复杂退化模式的表达能力。为了防止过拟合,可以在GRU层之间加入dropout层,对部分通道输出进行随机屏蔽,使网络在训练时不会过度依赖某些特定特征路径,从而提升泛化能力。在本项目架构中,通常采用一到两层GRU堆叠,并在第一层后设置适度的dropout。通过这种结构,网络在时间维度上形成自底向上的特征抽象流程,同时依托门控机制保持长程依赖信息。
输出回归层与剩余寿命估计
在GRU层之后,需要将时间序列的最后隐状态或一系列隐状态映射到一个标量输出,对应当前时间窗的剩余寿命估计值。常见做法是在GRU后接入全连接层,再接入回归层。全连接层负责将隐藏状态向量映射到一维输出空间,回归层则配置合适的损失函数用于训练。对于剩余寿命预测任务,一般选择均方误差损失,使网络在训练过程中最小化预测寿命与真实寿命之间的平方差。在结构设计时,可以通过设置GRU层的“OutputMode”为“last”,使网络只输出序列末端的隐状态,表示对整个输入序列信息的综合记忆,这对于当前时刻剩余寿命预测非常直接;如果需要利用序列中间时刻的信息进行多步预测,也可以设置为“sequence”,然后在后续层进行处理。
针对轴承退化过程的特点,重点在于当前时刻对应的剩余寿命,因此采用“last”模式更为适合。在训练阶段,通过不断调整GRU和全连接层的权重,使网络学习到从特征序列到寿命值的非线性映射。当输入数据充分、标签构造合理时,网络可以在不同退化阶段保持较小的预测误差。输出层设计还可以考虑对寿命值进行归一化,将RUL映射到[0,1]区间,以改善数值稳定性,训练完成后再将预测值反归一化到真实时间单位(如小时、采样段数)。通过这种方式,模型在数值空间和物理空间之间建立了稳定的映射关系。
网络训练流程与损失优化策略
网络训练流程决定了模型参数的收敛速度与最终性能。基于GRU的轴承剩余寿命预测模型采用有监督训练方式,即输入为特征序列,输出为对应的寿命标签。在MATLAB环境中,通过定义层结构数组、指定训练选项,并调用trainNetwork函数即可完成训练过程。训练选项包括最大训练轮数、mini-batch大小、初始学习率、学习率衰减方式、梯度阈值以及验证数据等。对于退化预测任务,数据量通常不是非常巨大,因此可以采用中等批大小和较温和的学习率,避免震荡和过拟合。为了提升泛化能力,可以将数据分为训练集和验证集,利用验证集误差监控训练过程,当验证误差不再下降时提前终止训练。
在损失优化策略方面,标准做法是使用均方误差作为主要目标函数,并配合自适应优化算法(如Adam)进行参数更新。对于轴承RUL预测,后期退化阶段的预测更为关键,可以在损失函数中对接近失效点的数据赋予更高权重,或者在训练样本构造时适当增加后期数据比例,使网络对这一阶段的拟合更充分。还可以通过L2正则化或dropout抑制过拟合,保证模型在新样本上的表现稳定。训练过程中,通过绘制训练误差和验证误差随轮数变化的曲线,直观评估收敛状况,对网络结构和超参数进行迭代调整,直至获得性能较优且稳定的模型。
模型部署、可视化与工程集成
完成训练和验证后,需要将模型集成到工程环境中,用于实际轴承剩余寿命在线预测。在MATLAB中,可以通过保存训练好的网络对象,编写预测脚本或函数接口,实现对新采集振动数据的实时或离线寿命估计。可视化部分也是模型架构的重要组成部分,通过绘制预测寿命曲线和真实寿命曲线、误差直方图、散点对比图等,可以直观展示模型性能,帮助工程人员理解模型行为。对于多工况数据,可以对不同工况下的预测结果进行分组比较,分析模型在不同负载、转速条件下的适应性。
在工程集成方面,可以经过两种路径应用。一种是在MATLAB环境中与上位机通信,将传感器采集的数据导入MATLAB进行周期性分析,并通过图形界面展示寿命预测结果;另一种是利用MATLAB编译工具将模型打包为可执行程序或生成C/C++代码,部署到边缘计算设备上,实现就地快速预测。在部署过程中,仍需保留数据预处理和特征计算模块,确保输入格式与训练阶段保持一致。通过这样完整的模型架构设计,从输入数据、GRU网络结构、回归输出到训练优化与工程部署形成闭环,使得基于GRU的轴承剩余寿命预测具备从实验到实际应用的可行路径。
项目模型描述及代码示例
dataFile = 'bearing_run2.mat'; % 定义轴承振动数据文件名,方便统一管理数据来源
vibSignal = rawDataStruct.vibration; % 提取振动信号字段,作为后续特征提取和窗口划分的基础时间序列
fs = rawDataStruct.fs; % 提取采样频率参数,用于滤波设计和时间窗长度换算
timeVec = (0:numel(vibSignal)-1)/fs; % 根据样本点数和采样频率构造时间向量,便于后续可视化和窗口定位
dcComponent = mean(vibSignal); % 计算振动信号的直流分量,通过均值反映偏置情况
bpFilt = designfilt('bandpassiir','FilterOrder',4,... % 使用IIR带通滤波器设计函数,指定4阶滤波器阶数以兼顾性能与稳定性
'HalfPowerFrequency1',500,'HalfPowerFrequency2',10000,... % 设置带通滤波下限500Hz和上限10000Hz以保留故障相关频段
vibFilt = filtfilt(bpFilt,vibSignal); % 使用零相位滤波函数对信号进行前后向滤波,避免相位畸变影响特征
winLenSec = 0.1; % 定义时间窗长度为0.1秒,用于将长时间序列分段处理
winLen = round(winLenSec*fs); % 将时间窗长度从秒转换为对应的样本点数量,保证窗长度与采样频率一致
stepLen = round(winLen*(1-overlapRate)); % 根据窗口长度和重叠率计算窗口步长,从而确定滑动窗口的移动距离
numWins = floor((numel(vibFilt)-winLen)/stepLen)+1; % 根据信号长度和窗口参数估算可提取的窗口数量
for k = 1:numWins % 遍历所有窗口索引,对每个窗口提取特征
idxStart = (k-1)*stepLen + 1; % 计算当前窗口起始样本索引,基于步长和窗口序号
idxEnd = idxStart + winLen - 1; % 计算当前窗口结束样本索引,确保窗口长度一致
rmsVal = rms(seg); % 计算该窗口信号的均方根值,反映整体能量水平
end
featureMin = min(featureMat,[],1); % 计算每个特征维度的最小值,为归一化提供下界
featureMax = max(featureMat,[],1); % 计算每个特征维度的最大值,为归一化提供上界
featureNorm = (featureMat - featureMin) ./ featureRange; % 对特征矩阵进行按列归一化,将所有特征缩放到0到1之间
timeWinCenter = ((0:numWins-1)*stepLen + winLen/2)/fs; % 计算每个窗口中心对应的时间,用于与寿命标签对齐和可视化
剩余寿命标签构造与对齐示例
totalLifeTime = timeWinCenter(end); % 将最后一个窗口中心时间视为失效时刻,作为总寿命的估计值
rulVec = totalLifeTime - timeWinCenter; % 对每个窗口计算到失效时刻的剩余时间,形成RUL序列
rulNorm = rulVec / max(rulVec); % 将剩余寿命序列除以最大值进行归一化,便于数值稳定训练
seqLen = 20; % 设置每个序列包含20个窗口,用于构成GRU输入的时间步长度
numSeq = numSamples - seqLen + 1; % 根据总样本数和序列长度计算可构造的序列数量
X = cell(numSeq,1); % 初始化输入序列单元数组,每个单元存放一个特征时间序列
Y = zeros(numSeq,1); % 初始化输出标签数组,每个元素对应一个序列末尾的RUL
for i = 1:numSeq % 遍历所有可构造的序列索引
seqStart = i; % 当前序列的起始窗口索引,从第一段开始滑动
seqEnd = i + seqLen - 1; % 当前序列的结束窗口索引,保证包含固定数量的时间步
X{i} = featureNorm(seqStart:seqEnd,:)'; % 将当前序列特征片段转置为特征维度×时间步矩阵,符合序列网络输入格式
numTrain = floor(0.8*numSeq); % 将全部序列按80%比例划分为训练集数量
idxPerm = randperm(numSeq); % 生成随机排列索引,用于打乱样本顺序以避免时间顺序偏倚
idxTrain = idxPerm(1:numTrain); % 选择前80%随机索引作为训练集索引
idxVal = idxPerm(numTrain+1:end); % 剩余20%索引作为验证集索引,用于监控模型泛化性能
YTrain = Y(idxTrain); % 按训练索引提取对应的训练标签向量
XVal = X(idxVal); % 按验证索引提取输入验证序列集合
inputSize = size(featureNorm,2); % 输入特征维度等于特征矩阵列数,即每个时间步包含的特征数量
numHiddenUnits = 64; % 设置GRU隐藏单元数量为64,在表达能力和计算复杂度之间取得平衡
gruLayer(numHiddenUnits,'OutputMode','last','Name','gru1') ... % 第一个GRU层,隐藏状态维度为64,输出最后时间步的隐状态用于回归
dropoutLayer(0.3,'Name','drop1') ... % dropout层随机丢弃30%的通道输出,缓解过拟合并提升泛化能力
fullyConnectedLayer(32,'Name','fc1') ... % 全连接层将GRU隐藏状态映射到32维中间特征空间,增加非线性组合能力
reluLayer('Name','relu1') ... % ReLU激活层引入非线性,提高网络对复杂模式的拟合能力
fullyConnectedLayer(1,'Name','fc_out') ... % 输出全连接层将特征压缩为单一标量,代表当前序列末端的RUL估计值
regressionLayer('Name','regoutput')]; % 回归层用于定义回归损失(均方误差),指导网络参数更新以逼近标签
训练选项设置与网络训练示例
maxEpochs = 80; % 设置最大训练轮数为80轮,在保证充分学习的同时控制训练时间
miniBatchSize = 64; % mini-batch大小设置为64,有利于在稳定梯度估计与运行效率之间取得均衡
learnRate = 1e-3; % 初始学习率选取0.001,为常用安全值,便于网络平稳收敛
options = trainingOptions('adam', ... % 使用Adam优化算法进行参数更新,具备自适应学习率和较快收敛特性
'MiniBatchSize',miniBatchSize,... % 指定每次梯度更新使用的样本数量为miniBatchSize
'InitialLearnRate',learnRate,... % 指定初始学习率为前面设定的learnRate
'LearnRateDropPeriod',20,... % 每隔20个轮次降低一次学习率,配合整体训练进度进行调整
'Shuffle','every-epoch',... % 在每个训练轮结束后打乱训练数据顺序,降低顺序相关性对学习的影响
'ValidationFrequency',validationFrequency,... % 指定验证频率为每隔若干mini-batch进行验证评估
'Plots','training-progress',... % 打开训练进度图形显示,实时观察损失和准确性曲线方便调试
'Verbose',true); % 设置详细输出标志为true,在命令行显示训练状态信息
netGRU = trainNetwork(XTrain,YTrain,layers,options); % 使用trainNetwork函数基于定义的层和选项在训练集上训练GRU网络
模型预测与误差评估示例
YPredTrain = predict(netGRU,XTrain,'MiniBatchSize',miniBatchSize); % 使用训练好的GRU网络对训练集输入序列进行预测以评估拟合程度
YPredVal = predict(netGRU,XVal,'MiniBatchSize',miniBatchSize); % 使用训练好的GRU网络对验证集输入序列进行预测以评估泛化性能
YTrainTrue = YTrain; % 将训练集真实RUL标签赋值给本地变量,便于后续误差计算和可视化
YValTrue = YVal; % 将验证集真实RUL标签赋值给本地变量,便于后续误差计算和可视化
valMAE = mean(abs(YPredVal - YValTrue)); % 计算验证集平均绝对误差,衡量模型在未见数据上的预测误差
trainRMSE = sqrt(mean((YPredTrain - YTrainTrue).^2)); % 计算训练集均方根误差,反映误差的能量级别
valRMSE = sqrt(mean((YPredVal - YValTrue).^2)); % 计算验证集均方根误差,反映验证集预测误差的整体水平
fprintf('Validation MAE: %.4f, RMSE: %.4f\n',valMAE,valRMSE); % 在命令窗口打印验证集MAE和RMSE,用于评估模型泛化性能
plot(YValTrue,'b-o','LineWidth',1); hold on; % 绘制验证集真实RUL曲线,使用蓝色线和圆点标记
plot(YPredVal,'r-*','LineWidth',1); % 在同一坐标轴上绘制网络预测RUL曲线,使用红色线和星号标记
title('验证集轴承剩余寿命预测对比'); % 设置图形标题为验证集RUL预测对比,突出图像主题
grid on; % 打开网格线显示,便于观察曲线变化趋势和误差大小
numFullSeq = numSamples - seqLen + 1; % 根据完整样本数和序列长度计算全寿命可预测的序列数量
RULFullTrue = zeros(numFullSeq,1); % 初始化全寿命真实RUL标签数组,用于与预测结果对比
for i = 1:numFullSeq % 遍历全寿命所有起始窗口索引
seqStart = i; % 当前全寿命预测序列起始索引
seqEnd = i + seqLen - 1; % 当前全寿命预测序列结束索引,保证包含固定时间步长度
RULFullTrue(i) = rulNorm(seqEnd); % 记录该片段末端对应的真实归一化RUL作为参考标签
RULFullPred = predict(netGRU,XFull,'MiniBatchSize',miniBatchSize); % 使用训练好的网络对全寿命所有序列进行批量预测
figure; % 新建图形窗口展示全寿命预测曲线
plot(RULFullTrue,'k-','LineWidth',1.2); hold on; % 绘制真实全寿命RUL曲线,使用黑色实线突出真实退化轨迹
plot(RULFullPred,'g--','LineWidth',1.2); % 绘制预测全寿命RUL曲线,使用绿色虚线显示模型估计结果
xlabel('时间窗口序号'); % 设置横坐标标签为时间窗口序号,指示退化过程推进程度
legend({'真实全寿命RUL','预测全寿命RUL'},'Location','best'); % 加入图例说明两条曲线含义,便于区分
title('轴承全寿命剩余寿命预测曲线'); % 设置图形标题突出表现全寿命维度上的预测效果
grid on; % 打开网格线辅助读数和比较局部误差
modelFile = 'GRU_RUL_Model.mat'; % 指定模型保存文件名称,用于持久化存储训练结果
save(modelFile,'netGRU','featureMin','featureRange','seqLen'); % 将训练好的网络和归一化参数以及序列长度一起保存,便于预测阶段复用
load(modelFile,'netGRU','featureMin','featureRange','seqLen'); % 在后续预测脚本中加载模型及相关参数,恢复训练环境配置
newSignalFilt = filtfilt(bpFilt,newSignal); % 使用同一带通滤波器对新信号滤波,保持频带一致性
numWinsNew = floor((numel(newSignalFilt)-winLen)/stepLen)+1; % 根据新信号长度计算可提取的窗口数量
featureMatNew = []; % 初始化新信号特征矩阵
for k = 1:numWinsNew % 遍历所有新信号窗口索引
idxStart = (k-1)*stepLen + 1; % 当前窗口起始索引
idxEnd = idxStart + winLen - 1; % 当前窗口结束索引
seg = newSignalFilt(idxStart:idxEnd); % 截取该窗口信号片段
kurtVal = kurtosis(seg); % 计算峭度特征
peakVal = max(abs(seg)); % 计算峰值特征
meanVal = mean(seg); % 计算均值特征
featureMatNew = [featureMatNew; featureVec]; % 追加到新信号特征矩阵
featureNormNew = (featureMatNew - featureMin) ./ featureRange; % 使用训练阶段的最小值和范围对新特征进行归一化
numSamplesNew = size(featureNormNew,1); % 计算新特征样本数量
for i = 1:numSeqNew % 遍历所有新数据序列
seqStart = i; % 当前序列起始索引
seqEnd = i + seqLen - 1; % 当前序列结束索引
XNew{i} = featureNormNew(seqStart:seqEnd,:)'; % 构造特征维度×时间步格式的输入序列
end
figure; % 新建图形窗口展示新数据RUL预测结果
plot(RULNewPred,'m-','LineWidth',1.2); % 绘制预测的归一化RUL曲线,使用洋红色线突出结果
title('新数据轴承剩余寿命预测曲线示例'); % 设置图形标题说明该图展示的是新数据预测情况
数据加载与基本预处理示例
dataFile = 'bearing_run2.mat'; % 定义轴承振动数据文件名,方便统一管理数据来源
vibSignal = rawDataStruct.vibration; % 提取振动信号字段,作为后续特征提取和窗口划分的基础时间序列
fs = rawDataStruct.fs; % 提取采样频率参数,用于滤波设计和时间窗长度换算
timeVec = (0:numel(vibSignal)-1)/fs; % 根据样本点数和采样频率构造时间向量,便于后续可视化和窗口定位
dcComponent = mean(vibSignal); % 计算振动信号的直流分量,通过均值反映偏置情况
bpFilt = designfilt('bandpassiir','FilterOrder',4,... % 使用IIR带通滤波器设计函数,指定4阶滤波器阶数以兼顾性能与稳定性
'HalfPowerFrequency1',500,'HalfPowerFrequency2',10000,... % 设置带通滤波下限500Hz和上限10000Hz以保留故障相关频段
vibFilt = filtfilt(bpFilt,vibSignal); % 使用零相位滤波函数对信号进行前后向滤波,避免相位畸变影响特征
winLenSec = 0.1; % 定义时间窗长度为0.1秒,用于将长时间序列分段处理
winLen = round(winLenSec*fs); % 将时间窗长度从秒转换为对应的样本点数量,保证窗长度与采样频率一致
stepLen = round(winLen*(1-overlapRate)); % 根据窗口长度和重叠率计算窗口步长,从而确定滑动窗口的移动距离
numWins = floor((numel(vibFilt)-winLen)/stepLen)+1; % 根据信号长度和窗口参数估算可提取的窗口数量
for k = 1:numWins % 遍历所有窗口索引,对每个窗口提取特征
idxStart = (k-1)*stepLen + 1; % 计算当前窗口起始样本索引,基于步长和窗口序号
idxEnd = idxStart + winLen - 1; % 计算当前窗口结束样本索引,确保窗口长度一致
rmsVal = rms(seg); % 计算该窗口信号的均方根值,反映整体能量水平
end
featureMin = min(featureMat,[],1); % 计算每个特征维度的最小值,为归一化提供下界
featureMax = max(featureMat,[],1); % 计算每个特征维度的最大值,为归一化提供上界
featureNorm = (featureMat - featureMin) ./ featureRange; % 对特征矩阵进行按列归一化,将所有特征缩放到0到1之间
timeWinCenter = ((0:numWins-1)*stepLen + winLen/2)/fs; % 计算每个窗口中心对应的时间,用于与寿命标签对齐和可视化
剩余寿命标签构造与对齐示例
totalLifeTime = timeWinCenter(end); % 将最后一个窗口中心时间视为失效时刻,作为总寿命的估计值
rulVec = totalLifeTime - timeWinCenter; % 对每个窗口计算到失效时刻的剩余时间,形成RUL序列
rulNorm = rulVec / max(rulVec); % 将剩余寿命序列除以最大值进行归一化,便于数值稳定训练
seqLen = 20; % 设置每个序列包含20个窗口,用于构成GRU输入的时间步长度
numSeq = numSamples - seqLen + 1; % 根据总样本数和序列长度计算可构造的序列数量
X = cell(numSeq,1); % 初始化输入序列单元数组,每个单元存放一个特征时间序列
Y = zeros(numSeq,1); % 初始化输出标签数组,每个元素对应一个序列末尾的RUL
for i = 1:numSeq % 遍历所有可构造的序列索引
seqStart = i; % 当前序列的起始窗口索引,从第一段开始滑动
seqEnd = i + seqLen - 1; % 当前序列的结束窗口索引,保证包含固定数量的时间步
X{i} = featureNorm(seqStart:seqEnd,:)'; % 将当前序列特征片段转置为特征维度×时间步矩阵,符合序列网络输入格式
numTrain = floor(0.8*numSeq); % 将全部序列按80%比例划分为训练集数量
idxPerm = randperm(numSeq); % 生成随机排列索引,用于打乱样本顺序以避免时间顺序偏倚
idxTrain = idxPerm(1:numTrain); % 选择前80%随机索引作为训练集索引
idxVal = idxPerm(numTrain+1:end); % 剩余20%索引作为验证集索引,用于监控模型泛化性能
YTrain = Y(idxTrain); % 按训练索引提取对应的训练标签向量
XVal = X(idxVal); % 按验证索引提取输入验证序列集合
inputSize = size(featureNorm,2); % 输入特征维度等于特征矩阵列数,即每个时间步包含的特征数量
numHiddenUnits = 64; % 设置GRU隐藏单元数量为64,在表达能力和计算复杂度之间取得平衡
gruLayer(numHiddenUnits,'OutputMode','last','Name','gru1') ... % 第一个GRU层,隐藏状态维度为64,输出最后时间步的隐状态用于回归
dropoutLayer(0.3,'Name','drop1') ... % dropout层随机丢弃30%的通道输出,缓解过拟合并提升泛化能力
fullyConnectedLayer(32,'Name','fc1') ... % 全连接层将GRU隐藏状态映射到32维中间特征空间,增加非线性组合能力
reluLayer('Name','relu1') ... % ReLU激活层引入非线性,提高网络对复杂模式的拟合能力
fullyConnectedLayer(1,'Name','fc_out') ... % 输出全连接层将特征压缩为单一标量,代表当前序列末端的RUL估计值
regressionLayer('Name','regoutput')]; % 回归层用于定义回归损失(均方误差),指导网络参数更新以逼近标签
训练选项设置与网络训练示例
maxEpochs = 80; % 设置最大训练轮数为80轮,在保证充分学习的同时控制训练时间
miniBatchSize = 64; % mini-batch大小设置为64,有利于在稳定梯度估计与运行效率之间取得均衡
learnRate = 1e-3; % 初始学习率选取0.001,为常用安全值,便于网络平稳收敛
options = trainingOptions('adam', ... % 使用Adam优化算法进行参数更新,具备自适应学习率和较快收敛特性
'MiniBatchSize',miniBatchSize,... % 指定每次梯度更新使用的样本数量为miniBatchSize
'InitialLearnRate',learnRate,... % 指定初始学习率为前面设定的learnRate
'LearnRateDropPeriod',20,... % 每隔20个轮次降低一次学习率,配合整体训练进度进行调整
'Shuffle','every-epoch',... % 在每个训练轮结束后打乱训练数据顺序,降低顺序相关性对学习的影响
'ValidationFrequency',validationFrequency,... % 指定验证频率为每隔若干mini-batch进行验证评估
'Plots','training-progress',... % 打开训练进度图形显示,实时观察损失和准确性曲线方便调试
'Verbose',true); % 设置详细输出标志为true,在命令行显示训练状态信息
netGRU = trainNetwork(XTrain,YTrain,layers,options); % 使用trainNetwork函数基于定义的层和选项在训练集上训练GRU网络
模型预测与误差评估示例
YPredTrain = predict(netGRU,XTrain,'MiniBatchSize',miniBatchSize); % 使用训练好的GRU网络对训练集输入序列进行预测以评估拟合程度
YPredVal = predict(netGRU,XVal,'MiniBatchSize',miniBatchSize); % 使用训练好的GRU网络对验证集输入序列进行预测以评估泛化性能
YTrainTrue = YTrain; % 将训练集真实RUL标签赋值给本地变量,便于后续误差计算和可视化
YValTrue = YVal; % 将验证集真实RUL标签赋值给本地变量,便于后续误差计算和可视化
valMAE = mean(abs(YPredVal - YValTrue)); % 计算验证集平均绝对误差,衡量模型在未见数据上的预测误差
trainRMSE = sqrt(mean((YPredTrain - YTrainTrue).^2)); % 计算训练集均方根误差,反映误差的能量级别
valRMSE = sqrt(mean((YPredVal - YValTrue).^2)); % 计算验证集均方根误差,反映验证集预测误差的整体水平
fprintf('Validation MAE: %.4f, RMSE: %.4f\n',valMAE,valRMSE); % 在命令窗口打印验证集MAE和RMSE,用于评估模型泛化性能
plot(YValTrue,'b-o','LineWidth',1); hold on; % 绘制验证集真实RUL曲线,使用蓝色线和圆点标记
plot(YPredVal,'r-*','LineWidth',1); % 在同一坐标轴上绘制网络预测RUL曲线,使用红色线和星号标记
title('验证集轴承剩余寿命预测对比'); % 设置图形标题为验证集RUL预测对比,突出图像主题
grid on; % 打开网格线显示,便于观察曲线变化趋势和误差大小
numFullSeq = numSamples - seqLen + 1; % 根据完整样本数和序列长度计算全寿命可预测的序列数量
RULFullTrue = zeros(numFullSeq,1); % 初始化全寿命真实RUL标签数组,用于与预测结果对比
for i = 1:numFullSeq % 遍历全寿命所有起始窗口索引
seqStart = i; % 当前全寿命预测序列起始索引
seqEnd = i + seqLen - 1; % 当前全寿命预测序列结束索引,保证包含固定时间步长度
RULFullTrue(i) = rulNorm(seqEnd); % 记录该片段末端对应的真实归一化RUL作为参考标签
RULFullPred = predict(netGRU,XFull,'MiniBatchSize',miniBatchSize); % 使用训练好的网络对全寿命所有序列进行批量预测
figure; % 新建图形窗口展示全寿命预测曲线
plot(RULFullTrue,'k-','LineWidth',1.2); hold on; % 绘制真实全寿命RUL曲线,使用黑色实线突出真实退化轨迹
plot(RULFullPred,'g--','LineWidth',1.2); % 绘制预测全寿命RUL曲线,使用绿色虚线显示模型估计结果
xlabel('时间窗口序号'); % 设置横坐标标签为时间窗口序号,指示退化过程推进程度
legend({'真实全寿命RUL','预测全寿命RUL'},'Location','best'); % 加入图例说明两条曲线含义,便于区分
title('轴承全寿命剩余寿命预测曲线'); % 设置图形标题突出表现全寿命维度上的预测效果
grid on; % 打开网格线辅助读数和比较局部误差
modelFile = 'GRU_RUL_Model.mat'; % 指定模型保存文件名称,用于持久化存储训练结果
save(modelFile,'netGRU','featureMin','featureRange','seqLen'); % 将训练好的网络和归一化参数以及序列长度一起保存,便于预测阶段复用
load(modelFile,'netGRU','featureMin','featureRange','seqLen'); % 在后续预测脚本中加载模型及相关参数,恢复训练环境配置
newSignalFilt = filtfilt(bpFilt,newSignal); % 使用同一带通滤波器对新信号滤波,保持频带一致性
numWinsNew = floor((numel(newSignalFilt)-winLen)/stepLen)+1; % 根据新信号长度计算可提取的窗口数量
featureMatNew = []; % 初始化新信号特征矩阵
for k = 1:numWinsNew % 遍历所有新信号窗口索引
idxStart = (k-1)*stepLen + 1; % 当前窗口起始索引
idxEnd = idxStart + winLen - 1; % 当前窗口结束索引
seg = newSignalFilt(idxStart:idxEnd); % 截取该窗口信号片段
kurtVal = kurtosis(seg); % 计算峭度特征
peakVal = max(abs(seg)); % 计算峰值特征
meanVal = mean(seg); % 计算均值特征
featureMatNew = [featureMatNew; featureVec]; % 追加到新信号特征矩阵
featureNormNew = (featureMatNew - featureMin) ./ featureRange; % 使用训练阶段的最小值和范围对新特征进行归一化
numSamplesNew = size(featureNormNew,1); % 计算新特征样本数量
for i = 1:numSeqNew % 遍历所有新数据序列
seqStart = i; % 当前序列起始索引
seqEnd = i + seqLen - 1; % 当前序列结束索引
XNew{i} = featureNormNew(seqStart:seqEnd,:)'; % 构造特征维度×时间步格式的输入序列
end
figure; % 新建图形窗口展示新数据RUL预测结果
plot(RULNewPred,'m-','LineWidth',1.2); % 绘制预测的归一化RUL曲线,使用洋红色线突出结果
title('新数据轴承剩余寿命预测曲线示例'); % 设置图形标题说明该图展示的是新数据预测情况
更多详细内容请访问
http://【机械故障诊断】基于门控循环单元的轴承剩余寿命预测模型MATLAB实现基于门控循环单元(GRU)进行轴承剩余寿命预测的详细项目实例(含完整的程序,GUI设计和代码详解)_粒子群优化BiLSTM神经网络资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/90218903
https://download.csdn.net/download/xiaoxingkongyuxi/90218903
https://download.csdn.net/download/xiaoxingkongyuxi/90218903
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐







所有评论(0)