主要内容

基于小波散射和递归深度网络的故障检测

这个例子展示了如何使用小波散射网络与递归神经网络对空气压缩机的声学记录进行故障分类。该示例提供了使用GPU加速小波散射变换计算的机会。如果您希望使用GPU,您必须有并行计算工具箱™和支持的GPU。金宝app看到GPU支金宝app持情况(并行计算工具箱)获取详细信息。

数据集

数据集由单级往复式空压机收集的声音记录组成[1].数据以16 kHz的频率采样。空气压缩机的规格如下:

  • 气压范围:0- 500lb /m2, 0- 35kg /cm2

  • 感应电机:5HP, 415V, 5Am, 50hz, 1440rpm

  • 压力开关:PR-15型,量程100-213 PSI

每条记录表示8种状态中的一种,其中包括正常状态和7种故障状态。故障状态有:

  1. 进口阀(LIV)泄漏故障

  2. 漏出阀(LOV)故障

  3. 止回阀(NRV)故障

  4. 活塞环的错

  5. 飞轮故障

  6. 骑士带错

  7. 轴承故障

下载数据集并将数据文件解压缩到有写权限的文件夹中。这个示例假设您正在指定为的临时目录中下载数据tempdir在MATLAB®。如果您选择使用不同的文件夹,请替换该文件夹tempdir在下面。这些录音以.wav文件的形式存储在以其各自状态命名的文件夹中。

url =“//www.tatmou.com/金宝appsupportfiles/audio/AirCompressorDataset/AirCompressorDataset.zip”;downloadFolder = fullfile (tempdir,“空气压缩机数据集”);如果~ (fullfile (tempdir,存在“空气压缩机数据集”),“dir”) loc = websave(downloadFolder,url);解压缩(loc fullfile (tempdir“空气压缩机数据集”))结束

使用一个audioDatastore管理数据访问。每个子文件夹只包含指定类的记录。使用文件夹名称作为类标签。

datasetLocation = fullfile (tempdir,“空气压缩机数据集”,“空气压缩机数据集”); ads=音频数据存储(数据定位,“包含子文件夹”,真的,...“标签源”,“foldernames”);

检查每堂课上例子的数量。每堂课有225段录音。

countcats(广告标签)
ans =8×1225 225 225 225 225

将数据分解为训练集和测试集。使用80%的数据进行培训,保留剩下的20%进行测试。在分离之前洗牌一次数据。

rng默认的广告= shuffle(广告);[adsTrain, adsTest] = splitEachLabel(广告,0.8,0.2);

验证每个类中的示例数量是预期的数量。

uniqueLabels =独特(adsTrain.Labels);tblTrain = countEachLabel (adsTrain);tblTest = countEachLabel (adsTest);H =酒吧(uniqueLabels, [tblTrain。计数,tblTest。数),“堆叠”);传奇(H, [“训练集”,“测试集”],“位置”,“NorthEastOutside”

从训练集中随机选择一些示例进行绘图。

idx=randperm(numel(adsTrain.Files),8);Fs=16e3;n = 1:numel(idx) x = audioread(adsTrain.Files{idx(n)});t =(0:大小(x, 1) 1) / Fs;次要情节(4 2 n);情节(t, x);如果n==7 | | n==8 xlabel(“秒”);结束标题(字符串(adsTrain.Labels(idx(n)));结束

小波散射网络

每条记录有5万个采样在16千赫。根据数据特征构造小波散射网络。设置不变性比例为0.5秒。

N = 5 e4;Fs = 16 e3;= 0.5;sn = waveletScattering (“信号长度”N“SamplingFrequency”Fs,...“InvarianceScale”, 0.5);

通过这些网络设置,每个示例有330个散射路径和25个时间窗口。

[~,npath]=路径(sn);Ncfs=numCoefficients(sn);总数(NPATH)
ans = 330
Ncfs
Ncfs=25

注意,这已经表示每条记录的数据大小减少了6倍。我们将数据大小从50,000个样本减少到总共8250个。最重要的是,我们将时间维度上的数据从50,000个样本减少到25个样本。这对于我们使用循环网络是至关重要的。尝试在50,000个样本的原始数据上使用递归网络会立即导致内存问题。

获得训练集和测试集的小波散射特征。如果你有一个合适的GPU和并行计算工具箱,你可以设置useGPU符合事实的加速散射变换。这个函数HelperBachScatFeatures获得每个示例的散射变换。

batchsize = 64;useGPU = false;scTrain = [];虽然hasdata(adsTrain) sc = helperBatchScatFeatures(adsTrain,sn,N,batchsize,useGPU);scTrain =猫(3 scTrain sc);结束

对持出的测试集重复上述过程。

sct = [];虽然hasdata(adsTest)sc=helperbachscatfactures(adsTest,sn,N,batchsize,useGPU);scTest=cat(3,scTest,sc);结束

去除0阶散射系数。对于训练集和测试集,将每个330 × 25散射变换放入单元阵列的一个元素中,用于训练和测试递归网络。

TrainFeatures = scTrain (2:,:,);TrainFeatures = squeeze(num2cell(TrainFeatures,[1 2]));YTrain = adsTrain.Labels;TestFeatures = sct (2:,:,);TestFeatures = squeeze(num2cell(TestFeatures,[1 2]));欧美= adsTest.Labels;

定义网络

回想一下,这里有1440个训练例子和360个测试集例子。相应的TrainFeaturesTestFeatures单元格数组分别有1440和360个元素。

使用散射路径的数量作为特征的数量。创建一个循环网络,其中一个LSTM层包含512个隐藏单元。遵循LSTM层与完全连接层和最后softmax层。使用'zscore'标准化的所有散射路径在网络的输入。

[inputSize, ~] = size(TrainFeatures{1});numHiddenUnits = 512;numClasses =元素个数(独特(YTrain));层= [...sequenceInputLayer (inputSize“归一化”,“zscore”) lstmLayer (numHiddenUnits“OutputMode”,“最后一次”) fulllyconnectedlayer (numClasses) softmaxLayer classificationLayer;

列车网络的

对网络进行50个历元的训练,最小批量为128。使用初始学习率为1e-4的Adam优化器。对每个历元的数据进行洗牌。

maxEpochs = 50;miniBatchSize = 128;选择= trainingOptions (“亚当”,...“InitialLearnRate”1的军医,...“MaxEpochs”maxEpochs,...“MiniBatchSize”miniBatchSize,...“SequenceLength”,“最短的”,...“洗牌”,“每个时代”,...“阴谋”,“训练进步”,...“详细”,真正的);网= trainNetwork (TrainFeatures、YTrain层,选择);
在单CPU上进行培训。初始化输入数据规范化。|=================================================================================================================================================================================历元|迭代|时间经过|小批量|基础学习|第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第0536 | 1.0000e-04 | 10 | 100 | 00:01:51 | 100.00%| 0.0072 | 1.0000e-04 | 14 | 150 | 00:02:40 | 100.00%| 0.0064 | 1.0000e-04 | 19 | 200|00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 00:00 00:00 00 00 00:00 00:00 00 00 00 00 00:00 0 0.0 0 0 0 0124?| 23124四四四四\124四四四四四0 0:00:00:00 00:00:00:00:00:00:00:00 00:00当天当天当天当天当天当天当天当天当天,100.00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00当天当天当天当天当天当天当天当天当天当天当天当天当天当天当天,10-0-0 0-0 0 0 0-0 0-0 0 0 0 0 0 0 0 0 0-0-0 0-0 0 0 0 0 0-0 0 0 0 0 0 0 06:29 | 100.00%| 0.0006 | 1.0000e-04 | 41 | 450 | 00:07:12 | 100.00%| 0.0005 | 1.0000e-04 | 46 | 500 | 00:07:55 | 100.00%| 0.0005 | 1.0000e-04 | | 50 | 550 | 00:08:41 | 100.00%| 0.0004 | 1.0000e-04 | | |===============================================================================================================================================================================================================================================================================================================================================================================================================。

在训练中,网络达到了近乎完美的性能。为了确保我们没有对训练数据进行过拟合,使用保留测试集来确定我们的网络对未见数据的泛化程度。

YPred =分类(净,TestFeatures);精度= 100*sum(YPred == YTest) / numel(YTest)
精度= 100

在这种情况下,我们看到在保留测试集上的性能也很好。

图2:混淆图(YTest,YPred)

总结

在该实例中,利用小波散射变换结合简单递归网络对空压机故障进行分类。散射变换允许我们为我们的学习问题提取鲁棒特征。此外,利用小波散射变换沿着数据的时间维度进行数据缩减是至关重要的,以便为我们的递归网络创建一个计算上可行的问题。

工具书类

Verma, Nishchal K., Rahul Kumar Sevakula, Sonal Dixit和Al Salour。空气压缩机声信号智能状态监测IEEE可靠性汇刊65年,没有。1(2016年3月):291-309。https://doi.org/10.1109/TR.2015.2459684

helperbatchscatfeatures-该函数返回给定输入信号的小波时间散射特征矩阵。如果useGPU设置为符合事实的,在GPU上计算散射变换。

作用sc = helperBatchScatFeatures (ds、锡、N, batchsize useGPU)%此函数仅用于支持小波中的示例金宝app%的工具箱。它可能会在未来的版本中被更改或删除。%从音频数据存储读取批数据批= helperReadBatch (ds, N, batchsize);如果useGPU batch = gpuArray(batch);结束%获取散射特征S=序列号特征矩阵(批次,“转换”,“日志”);收集(批处理);S =收集(年代);%子样本的特点% sc = S (: 1:6:,:);sc = S;结束

helperReadBatch-该函数从数据存储中读取指定大小的批量数据,并以单精度返回输出。输出的每一列都是来自数据存储的一个单独的信号。如果数据存储没有足够的记录,输出的列可能少于批处理大小。

作用batchout = helperReadBatch (N, ds batchsize)%此函数仅支持小波工具箱示例。它可能金宝app%更改或在未来的版本中删除。% batchout = readReadBatch(ds,N,batchsize),其中ds是数据存储%ds是数据存储% batchsize为batchsizekk = 1;虽然(hasdata(ds)) && kk <= batchsize tmpRead = read(ds);batchout (:, kk) =投(tmpRead (1: N),“单一”);% #好< AGROW >kk = kk + 1;结束结束

版权所有2021年,MathWorks公司。

另请参阅

相关的例子

更多关于