这篇文章主要讲解一下如果迁移学习对滚动轴承进行故障诊断,但是文中所用的微调预训练的 SqueezeNet 卷积神经网络是自然图像训练出来的,与轴承故障诊断中所使用的时频谱图相距甚远,虽然分类精度较高,但是可说服性较低,不建议使用。
第三方面包多官网下载链接
本文演示了如何将一维轴承振动信号转换为二维尺度图(时频谱图),并使用预训练网络应用迁移学习对轴承故障进行分类。 迁移学习显著减少了传统轴承诊断方法特征提取和特征选择所花费的时间,并在小型数据集中获得了良好的准确性。
滚动轴承故障
滚动轴承中的局部故障可能发生在外圈、内圈、保持架或滚动体中。 当滚动体撞击外圈或内圈上的局部故障,或者滚动体上的故障经过外圈或内圈时,轴承和传感器之间的高频共振会被激发。
4个关键频率:滚动体通过外圈频率 (BPFO)、滚动体通过内圈频率 (BPFI)、基频(FTF)和滚动体自转频率(BSF)。 BPFO 和 BPFI 的公式如下。
尺度图
尺度图,即时频谱图,两个维度代表时间和频率
内圈故障信号的时域波形及相应的尺度图如下所示
在图中所示的 0.1 秒内,振动信号包含 12 个脉冲,测试轴承的 BPFI 为 118.875 Hz。 因此,尺度图显示了与振动信号中的脉冲对齐的 12 个不同的峰值。 接下来,可视化外圈故障的尺度图。
外圈故障的尺度图在前 0.1 秒内显示 8 个不同的峰值,这与滚动体通过频率一致。 因为外圈时域信号中的脉冲不像内圈故障情况那样占主导地位,所以尺度图中的明显峰值与背景对比相对较小。 正常情况下的尺度图不显示明显峰值。
准备训练数据
数据集包含 14 个 MAT 文件(2 个正常、4 个内圈故障、7 个外圈故障)的训练数据集和带有 6 个 MAT 文件(1 个正常、2 个内圈故障、3 个外圈故障)的测试数据集。将一维振动信号转换为尺度图并保存图像以进行训练。 每个尺度图的大小为 227×227×3,与 SqueezeNet 网络所需的输入大小相同。
创建图像数据存储并将训练数据拆分为训练和验证数据集,使用“train_image”文件夹中 80% 的图像进行训练,使用 20% 进行验证。
创建图像数据存储以存储所有训练图像
path = fullfile('.', folderName);
imds = imageDatastore(path, ...
'IncludeSubfolders',true,'LabelSource','foldernames');
% 使用 20% 的训练数据作为验证集
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.8,'randomize');
使用迁移学习训练网络
接下来,微调预训练的 SqueezeNet 卷积神经网络以对尺度图进行分类。 SqueezeNet 已经在超过一百万张图像上进行了训练,学习了丰富的特征表示。 使用迁移学习微调网络通常比从头开始训练具有随机初始化权重的网络更快、更容易。 加载并查看 SqueezeNet 网络:
net = squeezenet
SqueezeNet 网络使用卷积层“conv10”提取图像特征,使用分类层“ClassificationLayer_predictions”对输入图像进行分类。 为了重新训练 SqueezeNet 对新图像进行分类,卷积层“conv10”和分类层“ClassificationLayer_predictions”需要替换为适应轴承时频谱图像的新层。
从训练好的网络中提取层图
lgraph = layerGraph(net);
在大多数网络中,具有可学习权重的最后一层是全连接层。 在某些网络中,例如 SqueezeNet,最后一个可学习层是 1×1 卷积层。 在这种情况下,使用一个新的卷积层,该卷积层的滤波器数量等于类别的数量。
numClasses = numel(categories(imdsTrain.Labels));
newConvLayer = convolution2dLayer([1, 1],numClasses,'WeightLearnRateFactor',10,'BiasLearnRateFactor',10,"Name",'new_conv');
lgraph = replaceLayer(lgraph,'conv10',newConvLayer);
分类层指定网络的输出类。 用没有类别标签的新分类层替换原来的分类层。 trainNetwork 在训练时自动设置层的输出类。
newClassificationLayer = classificationLayer('Name','new_classoutput');
lgraph = replaceLayer(lgraph,'ClassificationLayer_predictions',newClassificationLayer);
指定训练选项。 要减慢迁移层中的学习速度,将初始学习率设置为较小的值。
options = trainingOptions('sgdm', ...
'InitialLearnRate',0.0001, ...
'MaxEpochs',4, ...
'Shuffle','every-epoch', ...
'ValidationData',imdsValidation, ...
'ValidationFrequency',30, ...
'Verbose',false, ...
'MiniBatchSize',20, ...
'Plots','training-progress');
训练网络。 可以使用 trainingOptions 的 'ExecutionEnvironment' 名称-值参数来指定执行环境
net = trainNetwork(imdsTrain,lgraph,options);
使用测试数据集进行验证
将一维信号转换为二维尺度图。
reset(ensembleTest)
while hasdata(ensembleTest)
folderName = 'test_image';
convertSignalToScalogram(ensembleTest,folderName);
end
创建一个图像数据存储来存储测试图像。
path = fullfile('.','test_image');
imdsTest = imageDatastore(path, ...
'IncludeSubfolders',true,'LabelSource','foldernames');
使用经过训练的网络对测试图像数据存储进行分类
YPred = classify(net,imdsTest,'MiniBatchSize',20);
计算预测的准确率
YTest = imdsTest.Labels;
accuracy = sum(YPred == YTest)/numel(YTest)
绘制混淆矩阵
figure
confusionchart(YTest,YPred)