基于一维残差卷积自动编码器的滚动故障轴承诊断

        滚动轴承故障诊断实质上是“特征提取+模式分类”的问题,即首先对原始震动信号进行特征提取,提取出其中的关键特征,然后采用分类器如SVM,KNN进行模式分类,可以说提取的特征越具表达性,分类器的精度就越高。表达性差的特征,不管换成啥分类器,精度都提高不了多少,而表达性强的特征,就算采用简单的KNN,精度都很高。

        因此,合理的特征提取是提高故障诊断精度的关键。现有的震动信号特征提取可以大致分为3类:1、基于信号处理,2、基于特征降维,3、基于学习(待会儿会说啥意思)。基于信号处理的特征提取方式分为时域特征(如,均值,方差,最大值,功率极值等,这种方式一般精度不高),然后就是基于频域(经典的就是FFT快速傅里叶变换,这种方式是最常见、应用最多的,几乎涉及各个领域,文献上由于这个方法不能多尺度变换啥的、还有窗口固定啥的,因此提取不到局部特征,大部分文献都对FFT进行对比,可以说FFT就是批判的对象),最后就是时频域联合(常用的小波(包)分解、经验模态,然后结合各种熵变换求取熵值或者希尔伯特黄变换求取谱特征,现在也陆陆续续出来很多相关改进,比如变分模态分解之类的)。基于特征降维主要就是利用基坐标把高维原始数据映射到低维空间,提取嵌入其中的低维特征,降维方法有线性(如PCA、LDA),非线性(如KPCA),以及流行学习(如LPP,NPE),现有的文献也主要是对这些方法进行改进,比如没有核的改成基于核函数的,全局的改成局部的,非监督的改成监督的等。基于学习的也是本文的主要内容,大部分文献指出,采用信号处理与特征降维的方法属于是手工特征提取,提取到的手工特征受人为因素的影响很大,比如FFT变换后要选择其中的一些具有表达性的频谱分量,这个选择过程要经过多次尝试才能确定,而随着深度学习的提出,由于深度学习自身就有特征提取的能力,因此很多文献都采用深度学习实现震动信号的特征提取,主要分为监督式与非监督,监督式的有采用CNN的,可以看我另一篇文章就是采用基于1D-CNN与2D-CNN的双流CNN实现特征提取,在训练双流CNN的过程中用到了标签,因此是监督式的,还有就是非监督的,如受限玻尔兹曼机、自动编码器,这些方法没有用到标签,因此是非监督的。采用基于学习的方法因为只需要把网络中某个隐含层的输出作为特征,所以不用像手工特征那样耗时(其实网络调参也是需要时间的,而实践证明这个调参过程是十分难受,研究过深度学习的基本都懂,因此我对这句话不太认同)。

        好了,上面介绍了现有的特征提取方法,引出今天的内容:基于一维残差卷积自动编码器的特征提取,主要是参考下面这个文献(ps:要是原文献作者看到了,觉得我贴过来不太好的话,请立即联系我,我会在第一时间删除),文献截图如图1所示:

                                                                                         图1 参考文献截图

       这个文献提出了改进的卷积自动编码器(1DRCAE),简单地说就是借鉴深度参数网络的bottleneck,在传统的1D-CAE中间加入两个 bottleneck。我这篇文章也是采用这种结构,来做滚动轴承的故障诊断。

1,一维残差卷积自动编码在mnist数据集上的应用。

       首先我采用tensorflow1.14进行这个网络的搭建,主要用到了tf.layers,做好的网络运用在mnist的重构上,网络结构为输入(784*1)-卷积(784*8)-池化(392*8)-卷积(392*4)-池化(196*4)-bottleneck196*4)-bottleneck(反卷积,196*4)-反卷积1(392*4)-反卷积2(784*8)-输出(反卷积3,1784*1)。采用的bottleneck如图2所示,得到结构如图3。

                                                

                                                                               图2 残差块的网络结构

       

                                                                                     图3 mnist重构结果

           图3是网络训练1次的重构结果(每一次都要把训练集分批并全部跑一次),可以看出来,效果是极好的。

2,基于一维残差卷积自动编码器的滚动轴承故障诊断

2,1 网络训练

        首先,采用的是西储大学的轴承故障数据,共10类故障,每一类取1000个样本,每个样本1024个样本点,按7:2:1划分训练集,验证集与测试集。网络结构为:输入(1024*1)-卷积(1024*8)-池化(512*8)-卷积(512*4)-池化(256*4)-bottleneck,256*4)-bottleneck(反卷积,256*4)-反卷积1(512*4)-反卷积2(1024*8)-输出(反卷积3,1024*1)。损失曲线如图4所示,某个样本的重构信号与原始信号如图5所示。

                                     

                                                                                                 图4  loss curve

                               

                                                                             图5 1DRCAE的输入输出对比

             从图4上看,网络收敛的很好,从图5上看,1DRCAE能够很好地震动信号进行重构。

2.2 特征提取

           对上面训练好的网络,我们取第一个bottleneck的输出,就是最中间隐含层的输出作为SVM的输入构建故障分类器,得到的特征同样是1024维。

2.3 故障分类

        最终测试集分类正确率只有87%,直接采用原始数据只有65%,因此特征提取还是有用的。但是这个结果不能让人满意,因为我那个基于1D-CNN与2D-CNN的双流CNN,提取的特征有98%的正确率,此外我还做过其他的融合网络,比如1D-CNN与LSTM,2D-CNN与lstm,正确率至少都有96%。这个才87%。 

        分析原因可能是隐含层的特征有1024维,里面包含太多的冗余数据。为此我加深了网络层次,结构为输入(1024*1)-卷积(1024*8)-池化(512*8)-卷积(512*4)-池化(256*4)-卷积(256*4)-池化(128*4)-bottleneck,128*4)-bottleneck(反卷积,128*4)-反卷积1(128*4)-反卷积2(256*8)-反卷积3(512*8)-输出(反卷积4,1024*1),这样提取的特征维度为128*4=512维,对应的SVM分类正确率为90%

3 结果

        利用上述网络的重构结果都很好,网络也收敛了,正确率有90%,正确率不是很高,但这个网络结合了1D-CAE与残差网络单元,还是可以玩玩儿的

  • 25
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 55
    评论
下面是一个使用一维收缩残差去噪的卷积自编码器的示例代码: ```python import tensorflow as tf from tensorflow.keras.layers import Conv1D, Conv1DTranspose, Input, Reshape # 定义卷积自编码器 def autoencoder(input_shape): # 编码器 inputs = Input(shape=input_shape) encoded = Conv1D(32, 3, activation='relu', padding='same')(inputs) encoded = Conv1D(16, 3, activation='relu', padding='same')(encoded) # 解码器 decoded = Conv1DTranspose(16, 3, activation='relu', padding='same')(encoded) decoded = Conv1DTranspose(32, 3, activation='relu', padding='same')(decoded) decoded = Conv1D(1, 3, activation='sigmoid', padding='same')(decoded) # 构建自编码器模型 autoencoder = tf.keras.Model(inputs, decoded) return autoencoder # 定义残差连接 def residual_block(x, filters, kernel_size): residual = x x = Conv1D(filters, kernel_size, activation='relu', padding='same')(x) x = Conv1D(filters, kernel_size, activation=None, padding='same')(x) x = tf.keras.layers.add([x, residual]) x = tf.keras.layers.Activation('relu')(x) return x # 定义带有一维收缩残差卷积自编码器 def residual_autoencoder(input_shape): # 编码器 inputs = Input(shape=input_shape) encoded = Conv1D(32, 3, activation='relu', padding='same')(inputs) encoded = residual_block(encoded, 16, 3) # 解码器 decoded = Conv1DTranspose(16, 3, activation='relu', padding='same')(encoded) decoded = residual_block(decoded, 32, 3) decoded = Conv1D(1, 3, activation='sigmoid', padding='same')(decoded) # 构建自编码器模型 autoencoder = tf.keras.Model(inputs, decoded) return autoencoder # 创建卷积自编码器模型 input_shape = (256, 1) # 输入形状 model = residual_autoencoder(input_shape) model.summary() ``` 上述代码中,我们定义了一个带有一维收缩残差卷积自编码器模型。编码器部分由两个卷积层组成,解码器部分也是两个卷积层。在编码器中使用了一维残差连接来增加网络的深度和学习能力。最后,通过构建自编码器模型,并打印模型摘要,可以查看模型的结构和参数数量。请根据你的需求进行适当的修改和调整。
评论 55
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值