英文名称

Multiscale Kernel Based Residual Convolutional Neural Network for Motor Fault Diagnosis Under Nonstationary Conditions

中文名称

非平稳条件下基于多尺度核的残差卷积神经网络故障诊断

摘要

本文针对非平稳状态下电机信号的特殊物理特性,提出了一种基于多尺度核的残差卷积神经网络(CNN)用于电机故障诊断。 我们的贡献主要有两个方面。 首先,我们注意到由于电机运行条件的变化,每个电机故障类别在振动信号中都有不同的模式。 为了捕获这些模式,在CNN体系结构中应用了多尺度核算法。 其次,由于电机振动信号是由来自不同传输路径的许多不同分量组成的,因此它们是非常复杂和可变的。 为了使体系结构能够从深度和层次表示空间中提取故障特征,需要足够的网络深度,然后当网络深度过深时将导致退化问题。 该方法将残差学习嵌入到多尺度核CNN中,以避免性能下降,构建更深的网络。

解决对象

机械振动信号通常是长的一维(1-D)复杂信号。 由于机械故障的运行条件和噪声背景的变化,需要提取更深层次、更复杂的特征进行故障诊断。 另外,非平稳条件下的机械信号可能要复杂得多。 因此,如果用深度网络来诊断机械故障,就需要用深度一维结构来从这些复杂的信号中提取特征。 然而,实验发现,当深度网络开始收敛时,一个问题已经暴露出来:随着网络深度的增加,精度趋于饱和,然后下降,这并不是过拟合造成的。 因此,网络深层层的增加可能会导致甚至更严重的退化问题。 另一方面,由于传统的深度网络具有固定的单尺度卷积核和池大小,所以对输入信号的分析是固定尺度的,而工业系统总是工作在可变的条件下,这就导致了信号的时变。 因此,尽管深度学习是数据分析的有力工具,但从时变信号中提取特征的效果较差。

创新点

1、我们提出了一个设计良好的用于电机故障诊断的深度网络MK-RECNN。 MKRESCNN采用多尺度卷积核从多个尺度上捕获原始故障信号的特征,提高了捕获特征的鲁棒性和非平稳条件下的表征能力。 此外,我们还利用身份映射和残差映射,使甚深网络能够有效地学习故障特征,同时克服了传统深度网络存在的性能下降问题。
2、由于该方法是基于CNN的,因此继承了CNN的优点,无需信号处理技术就能从原始时间序列信号中提取特征和识别故障。

主要研究思路

A. Residual Learning

理论上,如果附加层没有学习任何东西,只是复制最后一层的特征(称为身份映射),训练误差应该不会增加。 受这一直觉的启发,残差学习被嵌入到所提出的框架中。 对于深度网络结构,输入x的学习特征表示为h(x),由于残差学习比传统的特征学习更容易,所以我们期望网络学习残差f(x)=h(x)-x。 残差学习采用每隔几层堆叠的方法,如图所示 1. 通过一个快捷连接操作得到的输出y给出如下:
在这里插入图片描述
如果残值不等于0,增加网络中的层数仍能提高网络性能。 另一方面,如果残值为0,则当前层只是一个身份映射,既不会提高也不会降低。 这样可以避免退化问题,因此可以构建更深的网络。

B. Convolutional Neural Networks

省略(过于简单)

C. Multiscale Kernel CNNs

工业系统故障诊断是一个时间序列信号识别或回归问题。然而,该问题的解决仍存在一些挑战:首先,单尺度卷积核大小使得网络仅从一个尺度提取特征。然而,由于分量、系统或采样频率[33]的变化,信号不会保持在相同的尺度上,这意味着固定的卷积核大小并不适用于每个信号。第二,工业系统通常不是在理想的条件下工作。许多因素可能导致信号的变化,如风力涡轮机的风速变化,负载变化,发动机的任务剖面。因此,如果我们想要一种故障诊断方法在工业系统中广泛应用,就必须考虑在变化的操作条件下分析信号的能力。
首先,我们构造一个基本的CNN块 ,然后,将两个基本的CNN块堆叠起来,构成MK-CNN的子块,如图所示 2. 如前所述,残差学习将网络扩展到一个非常深的结构,没有退化问题,因此在每个CNN子块之间探索残差学习结构,构造用于复杂特征提取的深度网络。
在这里插入图片描述
一个CNN块可以通过堆叠几个子块来构造
在这里插入图片描述
mk-cnn块的说明,它由三个子块组成。 在每个子块进行BN运算后应用身份映射,以避免退化问题。
我们注意到多尺度CNN最近已成功地应用于风力机齿轮箱的故障诊断[35]。 然而,本文中的多尺度表示灵活的卷积核,[35]中的多尺度表示灵活的平均步长。 也就是说,在[35]中,原始输入通过三种方式转换:S=1,S=2和S=3,其中S是一个不重叠窗口的长度。 例如,s=2是以2的步幅计算原始信号中每两项的平均值。 S=3是以3的步幅计算原始信号中每三项的平均值。 这样,[35]中提出的方法可以通过计算平均值作为样本来产生多尺度长度的原始信号。 本文提出的方法不是对原始信号进行降采样或取平均,而是采用不同尺度的卷积核。 这是因为下采样和取平均值不能改变原始信号的轮廓形状,这可能会限制CNN的性能。 利用不同大小的核函数可以从多尺度不同视图的原始信号中学习特征,使得CNN可以在多尺度视图中学习特征。

D. End-to-End Multiscale Residual Learning Architecture

第一步:数据采集。 电机振动信号由安装在测试电机上的数据采集系统和传感器采集。
第二步:数据分割。 由于我们的目标是建立一个端到端的诊断系统,使系统更加智能化,所以将采集到的振动信号切割成样本,直接作为训练样本。
第三步:训练MK-RECNN模型。 将振动信号切割成样本后,利用样本进行MK-RECNN模型训练。 本文采用ADAM算法对损失函数进行优化。
第四步:故障诊断。 测试电机的振动信号也以与训练样本相同的方式切割成样本,作为训练后的MK-RECNN模型的输入进行故障识别。 Softmax回归的输出可以反映试验电机的状态或故障类型。

故障诊断模型

在这里插入图片描述

论文链接

https://ieeexplore.ieee.org/document/8842598

代码

转载github:https://github.com/ShaneSpace/MyResearchWorksPublic

import tensorflow as tf
import numpy as np

from tensorflow.keras.utils import to_categorical
from tensorflow.keras import optimizers, Model
from tensorflow.keras.callbacks import  ReduceLROnPlateau
from tensorflow.keras.models import load_model

from tensorflow.keras import utils
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Model
from tensorflow.keras.layers import *

from sklearn.metrics import accuracy_score
import scipy.io as sio
from sklearn.model_selection import train_test_split
import pandas as pd


def normalization_processing(data):
    data_mean = data.mean()
    data_var = data.var()

    data = data - data_mean
    data = data / data_var

    return data

def wgn(x, snr):

    snr = 10**(snr/10.0)
    xpower = np.sum(x**2)/len(x)
    npower = xpower / snr

    return np.random.randn(len(x)) * np.sqrt(npower)


def add_noise(data,snr_num):

    rand_data = wgn(data, snr_num)
    data = data + rand_data

    return data


def stack_conv_block(x, filters, kernel_size, strides=1):
   C1 = Conv1D(filters, kernel_size, strides=strides, padding='same')(x)
   C1 = BatchNormalization()(C1)
   C1 = Activation('relu')(C1)
   C2 = Conv1D(filters, kernel_size, strides=strides, padding='same')(C1)
   C2 = BatchNormalization()(C2)
   xx = Conv1D(filters, 1, strides=strides, padding='same')(x)
   C2 = C2 + xx
   y = Activation('relu')(C2)

   return y

def MSC_1DCNN(class_number):
    input_signal = Input(shape=(1024,1))
    x0 = Conv1D(64,kernel_size = 7, padding='same', strides=1)(input_signal)
    x0 = BatchNormalization()(x0)
    x0 = Activation('relu')(x0)
    x0 = MaxPooling1D(pool_size=2)(x0)

    x01 = stack_conv_block(x0, 64, 3, strides=1)
    x01 = stack_conv_block(x01, 128, 3, strides=1)
    x01 = stack_conv_block(x01, 256, 3, strides=1)
    x01 = GlobalAveragePooling1D()(x01)

    x02 = stack_conv_block(x0, 64, 5, strides=1)
    x02 = stack_conv_block(x02, 128, 5, strides=1)
    x02 = stack_conv_block(x02, 256, 5, strides=1)
    x02 = GlobalAveragePooling1D()(x02)

    x03 = stack_conv_block(x0, 64, 7, strides=1)
    x03 = stack_conv_block(x03, 128, 7, strides=1)
    x03 = stack_conv_block(x03, 256, 7, strides=1)
    x03 = GlobalAveragePooling1D()(x03)

    cat_feature_vec = concatenate([x01,x02,x03])
    x4 = Dense(768, activation='relu')(cat_feature_vec)

    output = Dense(class_number, activation='softmax')(x4)

    model = Model(inputs=input_signal, outputs=output)
    return model


my_model = MSC_1DCNN(class_number=10)
my_model.summary()

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐