这个例子说明了如何使用仿真数据来训练,可以在一个化学过程检测故障的神经网络。网络检测精度高的模拟过程中的故障。典型的工作流程如下:
预处理数据
设计层次结构
训练网络
执行验证
测试网络
本例使用MathWorks®从田纳西-伊斯曼过程(TEP)模拟数据转换的MATLAB格式文件[1].这些文件可在MathWorks的支持文件的网站。万博1manbetx查看免责声明.
数据集由四个部分组成:无故障训练、无故障测试、故障训练和故障测试。分别下载每个文件。
网址='//www.tianjin-qmedu.com/万博1manbetxsupportfiles/predmaint/chemical-process-fault-detection-data/faultytesting.mat';韦伯斯韦('faultytesting.mat',url);url='//www.tianjin-qmedu.com/万博1manbetxsupportfiles/predmaint/chemical-process-fault-detection-data/faultytraining.mat';韦伯斯韦('断层训练.mat',url);url='//www.tianjin-qmedu.com/万博1manbetxsupportfiles/predmaint/chemical-process-fault-detection-data/faultfreetesting.mat';韦伯斯韦('无故障测试.mat',url);url='//www.tianjin-qmedu.com/万博1manbetxsupportfiles/predmaint/chemical-process-fault-detection-data/faultfreetraining.mat';韦伯斯韦('无故障培训.mat'URL);
将下载的文件加载到MATLAB®工作区。
装载('无故障测试.mat');装载('无故障培训.mat');装载('faultytesting.mat');装载('断层训练.mat');
每个组件都包含对两个参数的每个排列运行的模拟数据:
故障编号-对于故障数据集,表示不同模拟故障的1到20之间的整数值。对于无故障数据集,值为0。
模拟运行-对于所有数据集,整数值从1到500,其中每个值表示模拟的唯一随机生成器状态。
每个模拟的长度取决于数据集。所有的模拟实验每三分钟取样一次。
训练数据集包含来自25小时模拟的500个时间样本。
测试数据集包含来自48小时模拟的960个时间样本。
每个数据帧的列中都有以下变量:
第1栏(故障数
)表示故障类型,从0到20不等。故障号0表示无故障,而故障号1到20表示TEP中的不同故障类型。
第2栏(simulationRun
)指示运行TEP模拟以获取完整数据的次数。在训练和测试数据集中,所有故障号的运行次数从1到500不等。每simulationRun
值表示模拟的不同随机生成器状态。
第3栏(样品
)指示每次模拟记录TEP变量的次数。训练数据集的数量从1到500不等,测试数据集的数量从1到960不等。训练和测试数据集的TEP变量(第4列至第55列)每3分钟采样一次,持续时间分别为25小时和48小时。
第4-44栏(圣诞节1
通过圣诞节41
)包含TEP的测量变量。
列45-55(圣诞老人1
通过圣诞节11
)包含TEP的操纵变量。
检查两个文件的小节。
头部(无故障训练,4)
答复=4×55桌圣诞25圣诞26圣诞27圣诞28圣诞29圣诞30圣诞31圣诞32圣诞33圣诞34圣诞35圣诞36乌库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库________42.402 2704.3 74.863 120.41 0.33818 80.044 51.435 2632.9 25.029 50.5280.25109 3659.4 4556.6 9.4264 26.721 42.576 2705 75 120.41 0.3362 80.078 50.15441.359 17.194 0 1 3 0.25038 3660.3 4477.8 9.4426 26.875 42.07 2706.2 74.771 120.4299 46.699 47.468 41.199 20.53 0 1 4 0.24977 3661.3 4512.1 9.4776 26.758 42.06359.856 22.277 40.257 38.072 47.541 47.658 41.643 18.089
头部(断层训练,4)
答复=4×55桌圣诞25圣诞26圣诞27圣诞28圣诞29圣诞30圣诞31圣诞32圣诞33圣诞34圣诞35圣诞36乌库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库库________42.402 2704.3 74.863 120.41 0.33818 80.044 51.435 2632.9 25.029 50.5280.25109 3659.4 4556.6 9.4264 26.721 42.576 2705 75 120.41 0.3362 80.078 50.15441.359 17.194 1 1 3 0.25038 3660.3 4477.8 9.4426 26.875 42.07 2706.2 74.771 120.4299 46.699 47.468 41.199 20.53 1 1 4 0.24977 3661.3 4512.1 9.4776 26.758 42.06359.856 22.277 40.257 38.072 47.541 47.658 41.643 18.089
删除训练和测试数据集中故障号为3、9和15的数据项。这些故障号码不可识别,相关的模拟结果是错误的。
断层作用(故障测试。故障编号==3,:)=[];故障测试(故障测试。故障编号==9,:)=[];故障测试(故障测试。故障编号==15,:)=[];故障培训(故障训练。故障编号==3,:)=[];故障培训(故障训练。故障编号==9,:)=[];故障培训(故障训练。故障编号==15,:)=[];
通过保留20%的培训数据进行验证,将培训数据分为培训和验证数据。使用验证数据集,可以在优化模型超参数时评估训练数据集上的模型拟合。数据分割是防止网络过度拟合和欠拟合的常用方法。
获取行的总数均出现故障,无故障的训练数据集。
H1=高度(无故障训练);H2=高度(无故障训练);
模拟运行是指在特定故障类型下重复TEP过程的次数。从训练数据集和测试数据集获得最大模拟运行。
msTrain=最大值(无故障训练.simulationRun);msTest=最大值(故障测试.模拟运行);
计算验证数据的最大模拟运行。
rTrain=0.80;msVal=ceil(msTrain*(1-rTrain));msTrain=msTrain*rTrain;
获取最大采样数或时间步数(即,在TEP模拟期间记录数据的最大次数)。
样本列=最大值(无故障培训.sample);样本测试=最大值(无故障测试.样品);
获取无故障和故障训练数据集中的分割点(行号),以便从训练数据集中创建验证数据集。
rowLim1=ceil(rTrain*H1);rowLim2=ceil(rTrain*H2);trainingData=[faultfreetraining{1:rowLim1,:};faultytraining{1:rowLim2,:}];validationData=[faultfreetraining{rowLim1+1:end,:};faultytraining{rowLim2+1:end,:}];testingData=[faultfreetraining{:,:};faultytesting{:,:}];
最终数据集(包括训练、验证和测试数据)包含52个信号,具有500个统一的时间步。因此,信号或序列需要被分类到正确的故障号,这使得它成为序列分类的问题。
正如在数据集部分先前所描述的,该数据包含52个变量,其值被记录超过一定量的时间在一个仿真。这个样品
变量表示的时候,这些变量52被记录在一个模拟运行的数目。的最大值样品
训练数据集中变量为500,测试数据集中变量为960。因此,对于每个模拟,存在一组长度为500或960的52个信号。每组信号属于TEP的特定模拟运行,并指向0-20范围内的特定故障类型。
训练和测试数据集都包含每个故障类型的500个模拟。百分之二十(来自培训)用于验证,这使得培训数据集每种故障类型有400个模拟,验证数据每种故障类型有100个模拟。使用helper函数helperPreprocess
创建信号集,其中每个信号集是表示单个TEP模拟的单元数组的单个元素中的双矩阵。因此,最终培训、验证和测试数据集的大小如下:
大小Xtrain公司
:(模拟的总数)×(故障类型的总数)= 400×18 = 7200
大小XVAL
:(模拟的总数)×(故障类型的总数)= 100×18 = 1800
大小XTEST
:(模拟总数)X(故障类型总数)=500 X 18=9000
在数据集中,前500个模拟是0个
故障类型(无故障)和随后的故障模拟的顺序是已知的。这方面的知识能够为培训,验证和测试数据集的真实反应的创作。
Xtrain = helperPreprocess(trainingData,sampleTrain);Ytrain =分类([零(msTrain,1); repmat([1,2,4:8,10:14,16:20],1,msTrain)']);XVAL = helperPreprocess(validationData,sampleTrain);利用yval =分类([零(msVal,1); repmat([1,2,4:8,10:14,16:20],1,msVal)']);XTEST = helperPreprocess(testingData,sampleTest);Ytest =分类([零(MSTEST,1); repmat([1,2,4:8,10:14,16:20],1,MSTEST)']);
规范化是一种将数据集中的数值缩放到公共比例而不扭曲数值范围差异的技术.这项技术确保了一个较大的变量不会在训练中控制其他变量。它还可以将较高范围内的数值转换为较小范围(通常为-1到1),而不会丢失培训所需的任何重要信息。
使用训练数据集中所有模拟的数据计算52个信号的平均值和标准差。
tMean=平均值(trainingData(:,4:end))';tSigma=标准值(trainingData(:,4:end))';
使用helper函数helperNormalize
根据训练数据的平均值和标准差,对三个数据集中的每个单元进行规范化。
Xtrain=helperNormalize(Xtrain,tMean,tSigma);XVal=helperNormalize(XVal,tMean,tSigma);Xtest=helperNormalize(Xtest,tMean,tSigma);
这个Xtrain公司
数据集包含400个无故障模拟和6800个故障模拟模拟。可视化无故障和故障数据。首先,创建一个无故障数据图。在本例中,仅在Xtrain公司
数据集以创建易于读取的图形。
图;splot=10;绘图(Xtrain{1}(1:10,:)');xlabel(“时间步长”);标题(“非错误数据的训练观察”);传说(“信号”+字符串(1:splot),'位置','东北外');
现在,400之后绘制的任何单元格数组元素的比较无故障打印到错误的情节。
数字;情节(Xtrain {1000}(1:10,:)');xlabel(“时间步长”);标题(“错误数据的训练观察”);传说(“信号”+字符串(1:splot),'位置','东北外');
LSTM层是序列分类的好选择,因为LSTM层往往只记住输入序列的重要方面。
指定输入层序列输入层
与输入信号的数目(52)相同的大小。
指定3个具有52、40和25个单位的LSTM隐藏层。本规范的灵感来自于[二]. 有关使用LSTM网络进行序列分类的详细信息,请参见基于深度学习的序列分类.
在LSTM层之间添加3个辍学层,以防止过度拟合。退出层以给定的概率随机地将下一层的输入元素设置为零,这样网络就不会对层中的一小组神经元敏感
最后,为了分类,包括与输出类的数量(18)相同大小的完全连接层。在完全连接层之后,包括一个softmax层,该softmax层将十进制概率(预测可能性)分配给多类问题中的每个类,以及一个分类层,以根据softmax层的输出输出输出最终的故障类型。
numSignals=52;numHiddenUnits2=52;numHiddenUnits3=40;numHiddenUnits4=25;numClass=18;层=[...序列输入层(numSignals)lstmLayer(numHiddenUnits2,'输出模式','序列')dropoutLayer(0.2)第1层(numHiddenUnits3,'输出模式','序列')dropoutLayer(0.2)第1层(numHiddenUnits4,'输出模式','最后')dropoutLayer(0.2)完整连接层(numClass)softmaxLayer分类层];
设置训练选项列车网络
使用。
保持名称 - 值对的默认值“执行环境”为
'自动'
. 使用此设置,软件将自动选择执行环境。如果GPU可用(需要并行计算工具箱™ 以及具有计算能力3.0或更高版本的支持CUDA®的GPU),软件使用GPU。否则,软件使用CPU。因为这个例子使用了大量的数据,使用GPU大大加快了训练时间。
设置名称值参数对'洗牌'
到“每个历元”
避免丢弃每一个时代相同的数据。
有关深入学习培训选项的更多信息,请参见trainingOptions
.
maxEpochs=30;miniBatchSize=50;options=trainingOptions(“亚当”,...'执行环境','自动',...'渐变阈值',1,...'最大时期',最大时期,...'小批量大小',小批量大小,...'洗牌',“每个历元”,...'冗长',0,...'绘图','培训进度',...'ValidationData',{XVal,YVal});
使用列车网络
.
net=列车网络(Xtrain、Ytrain、layers、options);
训练进度图显示网络精度图。在图的右侧,查看有关培训时间和设置的信息。
在测试集上运行经过训练的网络,并预测信号中的故障类型。
Ypred=分类(net,Xtest,...'小批量大小',小批量大小,...'执行环境','自动');
计算精度。精度是从匹配分类的是,在测试数据真实的标签数分类
除以测试数据中的图像数。
ACC =总和(Ypred == Ytest)./ numel(Ypred)
加速度=0.9992
高精度表明,神经网络能够以最小的误差成功地识别出未知信号的故障类型。因此,精度越高,网络就越好。
使用测试信号的真实类标签绘制混淆矩阵,以确定网络识别每个故障的能力。
confusionchart(Ytest,Ypred);
使用混淆矩阵,您可以评估分类网络的有效性。混淆矩阵的主对角线上有数值,其他地方有零。本例中的训练网络是有效的,对99%以上的信号进行了正确的分类。
[1] Rieth,C.A.,B.D.Amsel,R.Tran.和B.Maia额外田纳西-伊斯曼过程模拟数据,用于异常检测评估。”哈佛数据仓库,第1版,2017年。https://doi.org/10.7910/DVN/6C3JR1.
[2] Heo,S.和J.H.Lee。”使用人工神经网络的故障检测和分类〉,韩国科学技术高级研究所化学和生物分子工程系。
helperPreprocess
helper函数helperPreprocess
使用最大样本数预处理数据。样本号表示信号长度,该长度在整个数据集中是一致的。for循环通过带信号长度滤波器的数据集形成52个信号集。每个集合都是一个单元数组的元素。每个单元数组代表一个模拟。
功能加工= helperPreprocess(MYDATA,限制)H =尺寸(MYDATA);加工= {};对于ind=1:极限:H x=mydata(ind:(ind+(limit-1)),4:结束;已处理=[已处理;x'];结束结束
helperNormalize
helper函数helperNormalize
使用数据,均值和标准差数据标准化的。
功能data=helperNormalize(数据,m,s)对于ind=1:size(data)data{ind}=(data{ind}-m)。/s;结束结束
第一层
|序列输入层
|列车网络
|trainingOptions