概要

本期实现基于连续小波变换(CWT)特征提取,构建融合CBAM注意力机制的Resnet18网络实现不同工况下的轴承迁移学习故障诊断。

基础知识回顾

迁移学习(Transfer Learning)是一种在机器学习中广泛应用的技术,它利用在一个任务上获得的知识来帮助解决另一个相关任务。迁移学习尤其适用于数据量有限或训练成本较高的情况。它可以显著提高模型的性能和训练效率。

 

 本期采用MATLAB语言编写CBAM-Resnet18网络,实现对西储大学数据的故障诊断。并将在工况0条件下训练好的CBAM-Resnet18模型的残差模块和CBAM模块进行冻结,只对全连接层进行微调,实现在工况1、2、3下的迁移学习。

最终实验结果:

在工况0下,取800个样本进行训练,400个样本进行测试,诊断准确率为:100%

将工况0的模型迁移到工况1时只采用小样本(每种故障取10个样本)对全连接层微调,训练速度只有几秒,测试集(1100个样本)的诊断准确率为:99.2%

将工况0的模型迁移到工况2时,只采用小样本(每种故障取10个样本)对全连接层微调,训练速度只有几秒,测试集(1100个样本)的诊断准确率为:99.6%

将工况0的模型迁移到工况3时,只采用小样本(每种故障取10个样本)对全连接层微调,训练速度只有几秒,测试集(1100个样本)的诊断准确率为:99.6%

1. CBAM-Resnet介绍

近年来,各种注意力机制横空出行,将注意力机制与各种深度学习模型结合,模型对特征提取的能力相较于一般的深度学习网络更加强大,在降低网络学习的参数量的同时也提高了网络模型的泛化能力。

CBAM-ResNet是ResNet的一种改进版本,它结合了CBAM注意力机制模块来提升网络的性能。CBAM模块通过对通道进行重新加权,使网络能够更好地自适应地关注不同通道的重要性。

  • CBAM 注意力模块

论文地址:https://arxiv.org/pdf/1807.06521.pdf

2. CBAM-Resnet的MATLAB实现

本期代码将CBAM机制在MATLAB中实现,并缝合到Resnet18网络中。看一下网络结果图吧。

核心代码如下:这里展示了如何将CBAM模块缝合进去。

% C: 通道数    % r: 降维比例    % blockName: 块名称(如'2a', '2b'等)
    reducedDims = max(floor(C / r), 1);    bnLayerName = ['bn', blockName, '_branch2b'];    resLayerName = ['res', blockName];
    % 断开原始连接    lgraph = disconnectLayers(lgraph, bnLayerName, [resLayerName, '/in1']);
    % ========== 通道注意力模块 ==========    % 平均池化分支    avgBranch = [        globalAveragePooling2dLayer('Name', ['cbam_ch_avg_', blockName])        fullyConnectedLayer(reducedDims, 'Name', ['cbam_ch_fc1_avg_', blockName])        reluLayer('Name', ['cbam_ch_relu_avg_', blockName])        fullyConnectedLayer(C, 'Name', ['cbam_ch_fc2_avg_', blockName])    ];    lgraph = addLayers(lgraph, avgBranch);
    % 最大池化分支    maxBranch = [        globalMaxPooling2dLayer('Name', ['cbam_ch_max_', blockName])        fullyConnectedLayer(reducedDims, 'Name', ['cbam_ch_fc1_max_', blockName])        reluLayer('Name', ['cbam_ch_relu_max_', blockName])        fullyConnectedLayer(C, 'Name', ['cbam_ch_fc2_max_', blockName])    ];    lgraph = addLayers(lgraph, maxBranch);
    % 相加和激活    addLayer = additionLayer(2, 'Name', ['cbam_ch_add_', blockName]);    lgraph = addLayers(lgraph, addLayer);
    sigLayer = sigmoidLayer('Name', ['cbam_ch_sigmoid_', blockName]);    lgraph = addLayers(lgraph, sigLayer);
    % 通道注意力乘法    mulLayer1 = multiplicationLayer(2, 'Name', ['cbam_ch_mul_', blockName]);    lgraph = addLayers(lgraph, mulLayer1);
    % ========== 空间注意力模块 ==========    % 通道维度的平均池化和最大池化需要自定义层    % 简化版本:使用reduce mean/max自定义层或直接用卷积近似
    % 添加用于空间注意力的层    spLayers = [        channelPoolingLayer(['cbam_sp_pool_', blockName])  % 自定义层        convolution2dLayer(7, 1, 'Padding', 'same', 'Name', ['cbam_sp_conv_', blockName])        sigmoidLayer('Name', ['cbam_sp_sigmoid_', blockName])    ];    lgraph = addLayers(lgraph, spLayers);
    % 空间注意力乘法    mulLayer2 = multiplicationLayer(2, 'Name', ['cbam_sp_mul_', blockName]);    lgraph = addLayers(lgraph, mulLayer2);

3.基于CBAM-Resnet模型,在不同工况下实现迁移学习的轴承故障诊断

实验步骤如下:

第一步:处理不同工况的西储大学数据。西储大学数据详情截图如下:

可以看到第二列的电机载荷分为0、1、2、3四种工况,这里只取故障直径为0.1778、0.3556、0.5334mm时的四种工况。对四种工况数据进行处理,处理方式如下:

采取部分重叠的采样方法即从原始信号中采集样本,相邻的采样样本之间存在部分重叠。将原始时域信号每2048个数据点组成一个样本,为了保证每个数据点都能采集到,相邻的样本点会有重叠的1048个数据点,滑动窗口的步长为1000。最终每个工况包含10种故障类型,每种类型包含120个样本。

第一步的代码整理截图如下,最后得到Working condition0.mat、Working condition1.mat、Working condition2.mat、Working condition3.mat,分别表示工况0、1、2、3。

第二步:将第一步数据转换为连续小波变换时频图:

将第一步得到的四种不同工况的数据进行同步提取小波变换,提取的图片放在了相应的“工况x连续小波变换时频图”文件夹内

连续小波变换时频图如下:

然后再将图像进行一个压缩,之所以压缩,是为了后续训练模型节省时间,代码整理截图如下:

第三步:模型训练与不同工况下的迁移学习

首先采用CBAM-Resnet18网络对工况0的数据进行训练与测试,选每组故障的前80个样本进行训练,后40个样本测试,结果如下:

训练时间是171秒。

模型识别前后的Tsne降维图如下:

迁移学习:然后将工况0下训练好的SEResnet18模型的残差模块和SE模块进行冻结,采用工况1、2、3的小样本数据(每种故障类型只取10组样本)对模型的全连接层进行微调,并采用剩下的1100个样本(每种故障类型110个)进行测试。

测试结果如下:

工况0迁移到工况1的测试结果:

迁移学习中,训练时间得到了极大的缩减。

同样的操作,将工况0下训练好的SEResnet18模型迁移到工况2、3,测试结果如下:

工况0迁移到工况2的测试结果:

工况0迁移到工况3的测试结果:

第三步的代码目录截图如下:

代码获取

或者点击下方阅读原文获取。


获取更多代码:

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐