代码已开源!多分支多尺度CNN在强噪声变载荷条件下轮对轴承故障诊断中的应用

论文来源:

IEEE TRANSACTIONS ON INDUSTRIAL INFORMATICS, VOL. 16, NO. 7, JULY 2020

英文名称

Multibranch and Multiscale CNN for Fault Diagnosis of Wheelset Bearings Under Strong Noise and Variable Load Condition

中文名称

多分支多尺度CNN在强噪声变载荷条件下轮对轴承故障诊断中的应用

摘要

高速列车轮对轴承故障诊断的关键问题是从振动信号中提取故障特征。 针对复杂度高、耦合性强、信噪比低的振动信号,提出了一种新的多分支多尺度卷积神经网络,能够从振动信号的多个信号分量和时间尺度中自动学习和融合丰富且互补的故障信息。 该方法结合了传统的滤波方法和多尺度学习的思想,可以扩展特征学习过程的广度和深度。 因此,所提出的网络可以得到更好的性能。 在轮对轴承数据集上的实验结果表明,该方法具有较好的抗逆能力和载荷域适应性,与现有的5种网络相比,可以更准确地诊断12种故障类型。

研究对象

振动信号复杂度高、信噪比低(高噪声)、变负载

主要研究思路

本文将多尺度学习引入CNN。通过多尺度卷积模块实现多尺度学习。利用具有不同卷积核的多个卷积层同时学习不同时间尺度的信号特征,并利用序列特征融合层融合多尺度特征。在此模块的基础上,提出了多尺度网络,从振动信号中挖掘出更深、更丰富的多尺度特征,从而增强了CNN在故障特征学习方面的鲁棒性,由于从多个分支提取的特征是不同的,CNN可以综合多个度的特征做出最佳判断。

创新点

1)将传统的滤波技术与CNN相结合,提出了一种多分支网络来从多个信号分量中提取丰富的特征。
2)利用多尺度学习的思想,开发了一个多尺度卷积模块,该模块可以从振动信号中学习长期和短期特征,从而提高了CNN对多尺度特征的学习能力。
3)利用非多特征融合层对多分支网络和多尺度网络学习到的丰富特征进行自适应融合和优化。
4)在上述改进的基础上,最终生成了基于MBSCNN的框架,该框架能够自动学习和融合丰富互补的特征,从而在强噪声和变载荷条件下准确诊断轮对轴承的各种故障类型。

网络模型架构

本文旨在从振动信号的各个分量和各个时间尺度中自动学习和融合丰富互补的特征,以解决强噪声和变载荷条件下轮对轴承的故障诊断任务。 一种鲁棒的智能故障诊断方法应该允许深入和全面地学习信号特征,例如同时学习长期和短期特征或提取与故障相关的低频信号特征的能力。 为此,本文构建了一个集信号转换、多特征学习、多特征融合和故障分类于一体的端到端网络。 该方法将传统的滤波技术和多尺度学习相结合,其核心贡献是提出了一个深入全面的特征提取和特征融合框架。MBSCNN网络框架由多分支特征学习、多尺度特征学习、多特征融合和故障分类四个主要部分组成 。
在这里插入图片描述

A. Multibranch Learning

  1. Identical Mapping Branch:
    通常是指深度学习中的某些神经网络结构中的一个分支。该分支从输入数据开始,通过一系列卷积、池化、批量归一化等操作,最终输出与输入具有相同空间分辨率的特征图。这个分支通常被用来增强模型的表示能力和稳定性,并促进信息的流动。在一些网络结构中,如ResNet和DenseNet,这个分支被称为“shortcut connections”、“skip connections”或“identity shortcut”。
    该网络架构中相同映射分支(IMB)的目的是从原始信号中学习全局故障特征信息。
  2. Denoising Branch:
    去噪分支(DB)旨在从原始信号中获得高信噪比的信号分量,以增强CNN对故障特征的学习和识别能力。 在实际HST操作中,噪声往往来自多个源。 我们假设噪声服从不同的概率分布,并且相互独立。 根据中心极限定理,随着噪声源数目的增加,这些信号的归一化和趋于高斯分布。 因此,DB首次将高斯滤波器引入振动信号中,并与CNN相结合,以提高网络的抗噪能力。
  3. Low-Frequency Branch:
    相对于载波信号,故障信号往往具有低频分量,包含更多的判别故障特征。 LFB首先通过低通滤波器得到X的低频分量,然后利用多个卷积层学习低频分量的特征。在信号处理中,有许多低通滤波器,如限幅滤波器、中值滤波器和滑动平均滤波器。 LFB由移动平均滤波器实现。

B. Multiscale Learning

  1. Multiscale Convolutional Module:
    在这里插入图片描述
    多尺度卷积模块(MSC)巧妙地调整卷积核的大小,使卷积层能够学习不同时间尺度的特征,从而将多尺度学习与CNN有效地结合起来。 具体来说,MSC采用多个并行卷积层,卷积核大小不同,在不同的尺度上同时学习丰富的特征,并采用卷积操作跨信道融合多尺度特征(将不同尺度特征连接起来)。
  2. Deep Multiscale Network:
    网络的浅层学习信号的低级特征,而网络的深层学习信号的高级特征。 CNN可以学习信号的低层/中层/高层特征,通过简单地堆叠卷积层可以丰富这些层特征。 为了了解高层故障特征,本文构造了由多个MSC组成的深度多尺度网络(DMSN)。
    在这里插入图片描述

C. Multifeature Fusion

BSCNN学习的多个分支或尺度的特征是对原始信号的不同理解水平。 这些特征并不总是相互促进,甚至可能相互矛盾并造成误判。 因此,一种有效的多特征融合机制对于CNN是非常必要的。 MBSCNN在两个方面采用了多特征融合技术。 一种是利用特征融合层CS对MSC中的多尺度特征进行融合,另一种是利用特征融合层CB对三个分支学习的多个信号特征进行融合。 CS和CB都利用卷积层的特征学习和提取能力自适应地融合多特征信息。 主要区别在于卷积层的数目和卷积核的数目。

D. Fault Classification

MBSCNN采用全局平均池[31]来代替CNN中的全连通层。 它可以有效地避免在全连接层容易出现的过拟合问题,从而提高CNN的泛化能力。 对于轮对轴承故障诊断任务,在分类层采用Softmax函数给出诊断结果。

总结

1)多尺度运算:THEMBSCNN使用多个并行卷积层来学习多尺度特征。 MSCNN采用多尺度粗粒度操作,对原始信号进行降采样,容易丢失原始信号的某些特征。
2)多分支运算:MSCNN中有三个分支,这三个分支只用于学习多尺度特征。 MBSCNN将多分支学习与传统的滤波方法相结合,从不同的信号分量中提取更本质的故障信号特征。
3)多特征融合:MSCNN不进行任何特征融合操作,将学习的特征直接输入分类器得到结果。 MBSCNN采用多个特征融合层对多分支学习和多尺度学习所获得的特征信息进行融合和优化,促使CNN做出最佳判断。

论文链接

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

域适应性是变载荷作用下轮对轴承故障诊断中的一个重要问题。 我们不能从所有负载条件中收集训练数据; 因此,在现有载荷下训练的诊断模型应该能够在新的载荷条件下工作。 在这种应用中,训练数据和测试数据之间的特征空间和类空间是相同的,只有特征分布不一致。 它是一个典型的领域适应性问题。 不仅研究特征分布的不一致性,而且研究特征空间或类空间的不一致性也是迁移学习的研究内容之一。 在这一部分中,我们验证了MBSCNN的负载域适应性。 采集了各种载荷工况下轮对轴承的振动信号。 我们选取了在竖向荷载作用下的56、146、236和272kN四种振动信号作为数据集。 将其中一个载荷数据作为测试集,另三个载荷数据作为训练集,得到了四组实验数据。

import tensorflow as tf
import tensorflow.keras.layers as layers
import numpy as np
import scipy.io as sio
#%%
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

#%% There are three branches, we need to first construct the data-preprocessing things.
# average moving
def moving_average(x, w=5, padding = 'same'):
    return np.convolve(x, np.ones(w), padding) / w

def guassian_func(x):
    delta = 1
    return 1/(delta*np.sqrt(2*np.pi))*np.exp(-x*x/(2*delta*delta))

def gaussian_filtering(x,padding='same'):
    w = 5
    w_j = np.arange(5)-2
    guassian_coef = [guassian_func(i) for i in w_j]

    return np.convolve(x, guassian_coef, padding)/sum(guassian_coef)

def conv1d_block(x,filters,kernel_size,stride,dr):
    x = layers.Conv1D(filters = filters, kernel_size=kernel_size, strides=stride, padding='same')(x)
    x = layers.BatchNormalization()(x)
    x = layers.Activation('relu')(x)
    y = layers.Dropout(dr)(x)

    return y

def multiscale_module(x, h=4, K=6,C=16,S=2,D=0.5):
    kernel_sizes = [(2**i)*K for i in range(h)]
    all_scales = []
    for i in range(h):
        x0 = conv1d_block(x,int(C/h),kernel_sizes[i],stride=S, dr=D)
        all_scales.append(x0)

    y = tf.concat(all_scales, axis=2)

    return y

def conv_branch(x):
    x = conv1d_block(x,filters=16,kernel_size=6,stride=4,dr=0.5)
    x = conv1d_block(x,filters=32,kernel_size=5,stride=2,dr=0.4)
    x = conv1d_block(x,filters=64,kernel_size=4,stride=2,dr=0.3)
    x = conv1d_block(x,filters=128,kernel_size=3,stride=2,dr=0.2)
    y = conv1d_block(x,filters=256,kernel_size=2,stride=2,dr=0.1)

    return y

def multiscale_branch(x):
    x = multiscale_module(x, h=4, K=6,C=16,S=4,D=0.5)
    x = multiscale_module(x, h=4, K=5,C=32,S=2,D=0.4)
    x = multiscale_module(x, h=4, K=4,C=64,S=2,D=0.3)
    x = multiscale_module(x, h=4, K=3,C=128,S=2,D=0.2)
    y = multiscale_module(x, h=4, K=2,C=256,S=2,D=0.1)
    return y

def MBSCNN(class_number):
    raw_signal = layers.Input(shape=(1024,1))
    lof_signal = layers.Input(shape=(1024,1)) #low frquency
    den_signal = layers.Input(shape=(1024,1)) # denoising

    y1 = multiscale_branch(raw_signal)
    y2 = conv_branch(lof_signal)
    y3 = conv_branch(den_signal)

    y = tf.concat([y1, y2, y3], axis=2)
    y = layers.GlobalAvgPool1D()(y)
    out = layers.Dense(class_number, activation='softmax')(y)

    model = tf.keras.Model(inputs=[raw_signal,lof_signal,den_signal], outputs=out)


    return model


# %%
my_model = MBSCNN(class_number=7)
my_model.summary()
#%% the reference code for loading dataset

# datafile_path = 'Data/my_data'
# data = sio.loadmat(datafile_path)
# X_train = data['X_train']
# X_test = data['X_test']
# X_valid = data['X_valid']

# x_train_raw = X_train
# x_train_den = np.array([moving_average(data) for data in X_train])
# x_train_lof = np.array([gaussian_filtering(data) for data in X_train])

# x_test_raw = X_test
# x_test_den = np.array([moving_average(data) for data in X_test])
# x_test_lof = np.array([gaussian_filtering(data) for data in X_test])


# x_valid_raw = X_valid
# x_valid_den = np.array([moving_average(data) for data in X_valid])
# x_valid_lof = np.array([gaussian_filtering(data) for data in X_valid])


  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值