驱动关键机构时频分析改进麻雀搜索卷积神经网络故障诊断【附代码】

博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。

 ✅ 具体问题可以私信或扫描文章底部二维码。


(1)带式输送机驱动机构作为整个输送系统的动力来源,其结构通常包括电机、减速器、联轴器以及传动滚筒等部分。这些部件在长期高负荷运行过程中易出现各类故障,如轴承磨损、齿轮断齿、轴系不对中、转子不平衡等,严重影响设备运行的可靠性与安全性。为深入研究故障发生时的振动响应特性,需建立能够反映故障特征的动力学模型。通过构建多自由度集中质量模型,将驱动机构中的转动部件视为弹性体,并引入故障因素如齿轮裂纹、轴系偏心、齿侧间隙变化等,可形成一组非线性微分方程组。该方程组描述了系统在故障状态下的动力学行为,包括振动位移、速度及加速度随时间的变化关系。借助MATLAB平台中的数值计算工具,例如四阶五级Runge-Kutta算法,可对该动力学模型进行求解,模拟不同故障类型与严重程度对系统振动响应的影响。通过参数化分析,比如改变齿轮裂纹深度、调整轴承游隙大小,能够得出振动信号幅值、频率成分以及能量分布随故障恶化的变化趋势。根据仿真结果,可选取具有典型意义的故障参数作为实验条件,例如将转轴间隙设定为5毫米、齿轮裂纹深度设为1.6毫米,用于后续实验研究。在此基础上,搭建带式输送机驱动机构实验台,通过加速度传感器采集振动信号,并利用粒子群优化最大相关峭度解卷积(PSO-MCKD)对原始振动数据进行预处理,以增强信号中的周期性冲击成分,抑制背景噪声。此外,提取多种时域统计特征量,包括有量纲与无量纲指标,如均值、方差、峭度、裕度因子、波形指标等,为后续故障诊断提供特征基础。

(2)传统的故障诊断方法大多依赖于信号处理技术与人工特征提取,不仅过程繁琐、效率低下,而且需要专业领域知识,限制了其在实际工业场景中的应用推广。为解决这一问题,提出一种基于混合专家系统(MOE)增强的卷积神经网络(CNN)故障诊断模型。该模型充分利用卷积神经网络在图像特征提取方面的优势,将一维振动信号通过重构或变换为二维形式进行输入。首先,利用前述PSO-MCKD方法对原始振动信号进行滤波预处理,突出故障引起的冲击特征,减少噪声干扰。随后,构建一种多分支的混合专家网络结构,各专家子网络专注于不同类型故障的特征学习,并通过门控网络动态加权组合各专家输出,从而增强模型对复杂故障模式的非线性映射与区分能力。该模型采用端到端训练方式,避免了传统方法中手工提取特征的局限性,实现了故障特征的自动学习与分类。实验结果表明,所提出的MOE-CNN模型在诊断准确率上显著优于传统CNN模型以及支持向量机(SVM)、人工神经网络(ANN)等传统机器学习方法,尤其在小样本不平衡数据集上仍能保持良好的泛化性能与鲁棒性。

(3)在实际工业环境中,采集到的振动信号往往受到强噪声干扰与变工况影响,导致单通道卷积神经网络的诊断性能下降。为进一步提升模型抗干扰能力与特征表达能力,提出一种基于多通道输入与注意力机制结合的卷积神经网络模型(CBAM-CNN)。该方法首先从预处理后的振动信号中提取多组时域统计特征,构成特征向量集,作为网络的多通道输入,每一通道代表不同方面的故障信息。网络主体采用深度卷积结构,通过在每一个卷积层之后引入卷积块注意力模块(CBAM),使模型能够自适应地关注重要特征区域并抑制无关信息。CBAM由通道注意力与空间注意力两部分组成,分别从特征通道和空间位置两个维度计算注意力权重,实现对关键故障特征的强化提取。最大池化层后接入该模块,有助于在保留显著特征的同时降低计算复杂度。为验证所提模型的有效性,在带式输送机驱动机构数据集上进行多组对比实验,包括与标准CNN、未加入注意力机制的多通道CNN以及其他注意力模型(如SE-Net)进行性能比较。结果证明,所提出的CBAM-CNN模型在不同噪声水平与负载条件下均具有更高的诊断精度与稳定性,特别在信噪比较低时仍能保持较好的识别效果。

(4)卷积神经网络的性能在很大程度上依赖于超参数的选择,包括学习率、批大小、卷积核尺寸、网络深度等。人工调参不仅耗时费力,且难以找到全局最优配置,导致诊断模型性能波动较大。为实现超参数自动优化与模型性能提升,提出一种基于连续小波变换(CWT)时频图像与改进麻雀搜索算法(SSA)优化的CNN故障诊断方法。该方法首先对滤波后的振动信号进行连续小波变换,生成时频图像,以同时保留信号在时间与频率域上的特征信息,为卷积神经网络提供更丰富的输入源。在此基础上,采用一种融合Levy飞行策略与萤火虫算法机制的改进型麻雀搜索算法(LEFSSA),用于优化CNN的关键超参数。Levy飞行策略增强了全局搜索能力,避免陷入局部最优;萤火虫算法机制则通过个体间的吸引与移动行为改善种群多样性。优化目标为验证集上的分类准确率,通过迭代寻找最优超参数组合。实验结果表明,经LEFSSA优化后的CNN模型,其诊断性能显著优于人工设置参数模型及其他优化算法(如遗传算法、粒子群算法)调参的模型,不仅收敛速度更快,而且准确率与泛化能力均有明显提升,为带式输送机驱动机构的智能故障诊断提供了一种行之有效的新途径。


import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Conv1D, MaxPooling1D, Flatten, Dense, Dropout, Multiply, GlobalAveragePooling1D, Reshape
from tensorflow.keras.layers import BatchNormalization, Activation, concatenate
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.utils import to_categorical
import pywt

# 生成模拟振动信号:正常、轴承故障、齿轮故障
def generate_vibration_signal(fs, duration, fault_type):
    t = np.linspace(0, duration, int(fs * duration), endpoint=False)
    freq1 = 50  # 基频
    freq2 = 150  # 故障特征频率
    normal_signal = np.sin(2 * np.pi * freq1 * t) + 0.5 * np.sin(2 * np.pi * 3 * freq1 * t)
    
    if fault_type == 'normal':
        sig = normal_signal
    elif fault_type == 'bearing_fault':
        impact = signal.ricker(int(fs * 0.02), 100)  # 模拟冲击
        impact_signal = np.zeros_like(t)
        for i in range(len(impact_signal)):
            if i % int(fs / freq2) == 0:
                impact_signal[i:i+len(impact)] += impact
        sig = normal_signal + 0.6 * impact_signal
    elif fault_type == 'gear_fault':
        mod_depth = 0.4
        mod_freq = 30
        modulated = (1 + mod_depth * np.sin(2 * np.pi * mod_freq * t)) * normal_signal
        sig = modulated + 0.3 * np.random.randn(len(t))
    else:
        raise ValueError("Unknown fault type")
    
    # 添加噪声
    noise = 0.1 * np.random.randn(len(sig))
    return sig + noise

# 生成数据集
fs = 1000  # 采样频率
duration = 1  # 信号持续时间
num_samples_per_class = 200
labels = ['normal', 'bearing_fault', 'gear_fault']
data = []
y = []

for label in labels:
    for _ in range(num_samples_per_class):
        sig = generate_vibration_signal(fs, duration, label)
        data.append(sig)
        y.append(label)

X = np.array(data)
y = np.array(y)

# 标签编码
lb = LabelBinarizer()
y_onehot = lb.fit_transform(y)
y_categorical = to_categorical(lb.transform(y))

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y_categorical, test_size=0.2, random_state=42)

# 数据预处理:归一化
X_train = (X_train - np.mean(X_train)) / np.std(X_train)
X_test = (X_test - np.mean(X_test)) / np.std(X_test)

# 增加通道维度
X_train = np.expand_dims(X_train, axis=2)
X_test = np.expand_dims(X_test, axis=2)

# 构建CBAM-CNN模型
def channel_attention(input_feature, ratio=8):
    channel = input_feature.shape[-1]
    shared_dense_one = Dense(channel // ratio, activation='relu', kernel_initializer='he_normal', use_bias=False)
    shared_dense_two = Dense(channel, kernel_initializer='he_normal', use_bias=False)
    avg_pool = GlobalAveragePooling1D()(input_feature)
    avg_pool = Reshape((1, channel))(avg_pool)
    avg_pool = shared_dense_one(avg_pool)
    avg_pool = shared_dense_two(avg_pool)
    max_pool = GlobalAveragePooling1D()(input_feature)
    max_pool = Reshape((1, channel))(max_pool)
    max_pool = shared_dense_one(max_pool)
    max_pool = shared_dense_two(max_pool)
    feature = Add()([avg_pool, max_pool])
    feature = Activation('sigmoid')(feature)
    return Multiply()([input_feature, feature])

def spatial_attention(input_feature):
    avg_pool = tf.reduce_mean(input_feature, axis=-1, keepdims=True)
    max_pool = tf.reduce_max(input_feature, axis=-1, keepdims=True)
    concat = Concatenate(axis=-1)([avg_pool, max_pool])
    feature = Conv1D(1, kernel_size=7, padding='same', activation='sigmoid', kernel_initializer='he_normal', use_bias=False)(concat)
    return Multiply()([input_feature, feature])

def cbam_block(input_feature):
    feature = channel_attention(input_feature)
    feature = spatial_attention(feature)
    return feature

def build_cbam_cnn(input_shape, num_classes):
    inputs = Input(shape=input_shape)
    x = Conv1D(64, kernel_size=3, padding='same', activation='relu')(inputs)
    x = BatchNormalization()(x)
    x = MaxPooling1D(pool_size=2)(x)
    x = cbam_block(x)
    x = Conv1D(128, kernel_size=3, padding='same', activation='relu')(x)
    x = BatchNormalization()(x)
    x = MaxPooling1D(pool_size=2)(x)
    x = cbam_block(x)
    x = Conv1D(256, kernel_size=3, padding='same', activation='relu')(x)
    x = BatchNormalization()(x)
    x = MaxPooling1D(pool_size=2)(x)
    x = Flatten()(x)
    x = Dense(128, activation='relu')(x)
    x = Dropout(0.5)(x)
    outputs = Dense(num_classes, activation='softmax')(x)
    model = Model(inputs=inputs, outputs=outputs)
    return model

# 模型编译与训练
input_shape = (X_train.shape[1], 1)
num_classes = y_train.shape[1]
model = build_cbam_cnn(input_shape, num_classes)
model.compile(optimizer=Adam(learning_rate=0.001), loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(X_train, y_train, batch_size=32, epochs=50, validation_split=0.1, verbose=1)

# 模型评估
test_loss, test_acc = model.evaluate(X_test, y_test, verbose=0)
print(f'Test accuracy: {test_acc}')

# 绘制训练过程
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend()
plt.show()

# 生成CWT时频图
def plot_cwt(signal, title):
    scales = np.arange(1, 128)
    coefficients, frequencies = pywt.cwt(signal, scales, 'morl')
    plt.imshow(np.abs(coefficients), extent=[0, 1, 1, 128], cmap='PRGn', aspect='auto',
               vmax=abs(coefficients).max(), vmin=-abs(coefficients).max())
    plt.title(title)
    plt.show()

 


如有问题,可以直接沟通

👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

坷拉博士

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

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

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

打赏作者

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

抵扣说明:

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

余额充值