Python环境下基于原型网络的滚动轴承故障诊断方法

近年来,基于深度学习的故障诊断方法成为研究热点,它依靠海量的数据完成故障诊断模型的训练。然而,在实际的工业过程中,往往无法提供充足的故障数据样本给深度学习模型,在一定程度上限制了其性能。以旋转机械为例,其运行需要保持高稳定性与可靠性,其从正常运行状态过渡到故障状态需要经历漫长的时间,且其故障状态持续时间较短,因此难以采集到足够的故障数据。此外,旋转机械设备的工况易发生变化,采集足够的数据并对其进行标签化是比较困难的,且较为耗费人力。因此,实际工业中采集到的多数是正常数据,故障状态下的数据较少,使得模型无法正确学习到从振动信号到故障类别的映射关系,导致模型欠拟合,泛化能力差。

为解决数据容量限制深度学习应用的问题,小样本学习应运而生。小样本学习又称为少样本学习,它的概念最早从计算机视觉领域兴起。近年来小样本学习得到了广泛关注,并被应用于图像处理和故障诊断等领域。小样本学习的目标是在每一类数据较少的情况下,从匮乏的数据中学习到解决问题的办法。目前,小样本学习的方法主要分为三类:基于优化的方法,基于数据增强的方法和基于度量学习的方法。

基于优化的方法是小样本问题的经典解决方法,该方法通过大规模的源数据集学习特征以得到泛化能力很强的模型,再通过目标数据集对模型进行微调。常用的基于优化的方法包含模型无关的元学习算法MAML和Reptile等。然而,在实际场景中源数据集和目标数据集分布不一定类似,基于优化的方法会导致模型在目标数据集上产生过拟合的问题。此外,基于优化的方法在寻找最优参数的时候需要人工经验对梯度的组合方式进行选择,上述问题限制了基于优化的方法的应用场景。基于数据增强的方法的目的是对原始数据集进行扩充,使数据容量能够满足深度学习模型的需求,是解决小样本学习问题的直接方法。度量学习也称为相似度学习,通过将原始输入映射到嵌入空间得到嵌入特征,并使用某种距离度量函数计算特征之间的差异,从而完成分类任务。

1)基于数据增强的故障诊断算法小样本学习的根本问题在于数据量过少,导致样本的多样性降低,从而限制了深度学习模型的性能。而基于数据增强的方法是一种提高训练集数量和质量的技术,可以在一定程度上增加样本多样性。它可以利用原有数据中的信息,在嵌入空间中对数据进行增强以生成新的数据,该方法能够直接解决小样本学习中数据匮乏的问题。常用的数据增强方法包含数据扩充和特征增强。其中,前者主要是使用无参数的方法,包括对图像进行剪切、旋转等操作,以及对原始数据添加噪声等方式。后者则是训练出深度神经网络,学习原始数据与目标数据之间的映射关系,在特征空间中增加便于分类的特征。

2)基于度量学习的故障诊断算法

针对少量样本的情况,可采用基于数据增强的方法对故障样本进行扩充,再使用扩充后的数据集进行故障诊断。但是对于没有历史累计数据的旋转机械,其故障样本可能只有几十个,这时旋转机械处于极少量故障样本的情形,数据集为极小样本数据集。由于其他文献中少量样本和极少量样本无明确的界限与定义,因此在综合考虑滚动轴承数据的类别数和时频图差异性后,可以对少量样本和极少量样本给出一个简单的定义。其中,少量样本为每个类别的样本数大于等于50且小于等于100的情形,极少量样本为样本数小于50的情形。在极少量样本情形下,数据增强的方法受限,生成样本的多样性无法提升,从而影响故障诊断精度。而度量学习通过特征表达和相似性度量,减少了网络需要学习的参数,从而减弱样本稀缺对模型造成的影响。因此,在极少量样本的情况下使用基于度量学习的方法进行故障诊断是一个比较好的方案。

基于度量学习的方法主要研究如何在特定任务上学习一个距离函数,该函数可以对样本对之间的相似性进行度量,从而使基于近邻思想的算法得到较好的模型参数。度量学习中的深度度量学习可以学习原始数据与嵌入空间的映射关系,使得同类别的样本对距离较近,而不同类别的样本对距离较远。通过使用距离函数度量待分类样本与其他样本的距离,便可完成分类任务。其中,基于度量学习的方法中具有代表性的网络为匹配网络、孪生网络、原型网络和关系网络等。由于其出色的分类性能,近年来基于原型网络的故障诊断方法得到了较多关注,逐渐成为研究的热点。

原型网络是一种基于度量学习的小样本学习方法。该方法旨在学习各类样本在一个度量空间的原型表示,通过比较查询样本与各类原型之间的距离,将查询样本归入距离最近的类别,从而达到分类的目的。

鉴于此,提出一种基于原型网络的滚动轴承故障诊断方法,运行环境为Python,可能采用的数据集如下:

数据集A-D由西储大学CWRU轴承数据集而来,数据集E-F由KAt数据集而来,主代码如下:

import numpy as np
import scipy.io as sio 
import os
import Prototypical_Network as PN
import randomdef get_data(datapath, is_normalization=False, is_fft=False):data = sio.loadmat(datapath)try:trainX = data['trainX'].astype(np.float32) testX = data['testX'].astype(np.float32) trainY = data['trainY']testY = data['testY']   if trainY.shape[0]>1:trainY = np.argmax(trainY, axis=1)testY = np.argmax(testY, axis=1)else:trainY = trainY-1testY = testY-1except:X = data['X'].astype(np.float32) Y = np.argmax(data['Y'], axis=1)trainX, testX, train_indices, test_indices = utils.split_train_test(X, test_ratio=0.5)trainY, testY = Y[train_indices], Y[test_indices]if is_fft:trainX = np.absolute(np.fft.fft(trainX, axis=1)).astype(np.float32) testX = np.absolute(np.fft.fft(testX, axis=1)).astype(np.float32) if is_normalization:trainX, mu, sigma = utils.zscore(trainX, dim=0)testX = utils.normalize(testX, mu, sigma)return trainX, trainY, testX, testYdef get_sample_data(X, Y, num=10, classes=None):if classes is None: classes = len(np.unique(Y))Xs, Ys = [], [],for i in range(classes):idx = np.where(Y==i)idx = random.sample(list(idx[0]), num)Xs.extend(X[idx])    Ys.extend(Y[idx])    return np.array(Xs), np.array(Ys)# ---------------------------------------------
#  few-shot learning with prototypical network
# ---------------------------------------------
datasets = ['dataA', 'dataB', 'dataC', 'dataD', 'dataE', 'dataF']
datapath = 'datasets/'
for i in [0]:utils.setup_seed(seed=0)data = datasets[i]save_result = f'./results/{data}'#utils.setup_seed(seed=0)trainX, trainY, testX, testY = get_data(datapath+data, is_fft=True)trainX, trainY = get_sample_data(trainX, trainY, num=10) # randomly select a small number of training data### Define Netsencoder = PN.encoder()### Train Netsmodel = PN.Protonet(trainX, trainY, n_epoch=200, is_normalization=True)model = model.train(encoder)### testout = model.test(testX)result = {}result['distance'] = out['distance']result['prediction'] = out['prediction']result['embedding'] = out['embedding']result['loss'] = model.lossresult['prototypes'] = model.prototypes.detach().cpu().numpy()result['true_label'] = testYif not os.path.exists(save_result): os.makedirs(save_result)sio.savemat(f'{save_result}/result-{model.n_support}shot.mat', result)   

结果如下:

完整代码可由知乎学术咨询获得:

Python环境下基于原型网络的滚动轴承故障诊断方法

工学博士,担任《Mechanical System and Signal Processing》审稿专家,担任《中国电机工程学报》优秀审稿专家,《控制与决策》,《系统工程与电子技术》,《电力系统保护与控制》,《宇航学报》等EI期刊审稿专家。

擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/573678.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rollup 与其它工具的集成

Rollup 与其它工具的集成 与其他 NPM 包场景实例应用插件安装命令更新src/main.js 文件结果 解决方案插件安装命令添加到配置文件中结果 rollup/plugin-commonjs 对等依赖项作用配置文件 Babel作用安装命令配置文件 与其他 NPM 包 场景 项目可能会依赖于从 NPM 安装到 node_m…

Chrome 插件 storage API 解析

Chrome.storage API 解析 使用 chrome.storage API 存储、检索和跟踪用户数据的更改 一、各模块中的 chrome.storage 内容 1. Service worker 中 runtime 内容 2. Action 中 runtime 内容 3. Content 中 runtime 内容 二、权限(Permissions) 如果需使…

自己编译SQLite或将SQLite移植到新的操作系统(六)

返回:SQLite—系列文章目录 上一篇:SQLite中的动态内存分配(五) 下一篇:SQLite—系列文章目录 1.0 引言 对于大多数应用程序,推荐的构建方法 SQLite是使用合并代码 文件 sqlite3.c 及其相应的头文件 sqlite3.…

机器学习预测气候变化对产量的影响

通过机器学习预测作物产量 今天分享一篇文献解读,将围绕论文《结合机器学习和环境变量约束气候变化下作物产量变化预测的不确定性》展开,该研究通过将动态线性模型(DLM)和随机森林机器学习模型(RF)分别与9个全球网格作物模型(GGCM)集成来整合和克服这两种建模框架的…

C++队列queue用法详解

一、queue的介绍 1. 队列是一种容器适配器,专门用于在 FIFO 上下文 ( 先进先出 ) 中操作,其中从容器一端插入元素,另一端 提取元素。 2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类, qu…

大型驱动水冷负载电阻、缓冲器、滤波器和快速放电电阻

EAK业界首创双面水冷负载电阻器,独特的设计,用户更方便的串联并联使用,强大的水流带走更多因充放电带来的热量。AlN高可靠性氮化铝基板保证了热膨胀不会影响电阻的工作。 液冷电阻器使用水或离子水作为冷却剂。通过添加乙二醇,可以…

题目:小明的背包1(蓝桥OJ 1174)

问题描述&#xff1a; 解题思路&#xff1a; 01背包模板题 题解&#xff1a; // 未优化的01背包 // #include <bits/stdc.h> // using namespace std; // using ll long long; // const int N 1e2 9, M 1e3 9; // int a[N][M]; // ll dp[N][M];// int main() // {…

详解智慧路灯杆网关的集中供电能力

智慧路灯杆网关是智慧杆物联网系统中不可或缺的设备。智慧杆网关不仅可以作为杆载设备与云平台、设备与设备之间的桥梁&#xff0c;促进数据的无缝传输&#xff0c;而且还能提供高效的能源管理和供电功能。 BMG8200系列交流型智慧路灯杆网关就集成了强大的供电能力&#xff0c;…

商品房预售合同备案流程是什么?怎么办理??

商品房预售合同备案后即视为正式合同&#xff0c;具有一般合同的效力。 而在签订商品房时&#xff0c;合同双方应仔细查看预售的相应条款&#xff0c;以便更好地保护自己的合法权益。 购房合同备案流程 &#xff08;一&#xff09;自2006年起&#xff0c;所有销售合同均采用网上…

不小心删除的音频文件怎么恢复?不用愁,恢复指南在这里

在数字化时代&#xff0c;音频文件作为我们珍贵的回忆和资料&#xff0c;有时可能因一时的疏忽或误操作而意外丢失。当您不小心删除了某个重要的音频文件时&#xff0c;不必过于焦虑。本文将为您提供一系列实用的恢复方法&#xff0c;帮助您找回那些误删的音频文件。 图片来源于…

实例:NX二次开发批量判断相连曲线是否封闭

一、概述 最近学习曲线命令&#xff0c;前几天看到&#xff0c;在NX二次开发群里有人推了一篇关于写求取封闭曲线面积的文章。之前我已经写过一篇博客了&#xff0c;今天讲这些函数进行封装到自己的NX二次开发库中&#xff0c;方便今后调用&#xff0c;由于自身不是计算机科本出…

4.Python数据分析—数据分析入门知识图谱索引(知识体系下篇)

4.Python数据分析—数据分析入门知识图谱&索引-知识体系下篇 一个人简介二机器学习基础2.1 监督学习与无监督学习2.1.1 监督学习&#xff1a;2.1.2 无监督学习&#xff1a; 2.2 特征工程2.3 常用机器学习算法概述2.3.1 监督学习算法&#xff1a;2.3.2 无监督学习算法&#…