主要内容

基于深度学习的化工过程故障检测

这个例子展示了如何使用模拟数据来训练一个可以检测化学过程中的故障的神经网络。网络对模拟过程中的故障进行了高精度的检测。典型工作流程如下:

  1. 预处理数据

  2. 设计层结构

  3. 培训网络

  4. 执行验证

  5. 测试网络

下载数据集

本示例使用MathWorks®从田纳西伊士曼过程(TEP)模拟数据转换的matlab格式文件[1].这些文件可以在MathWorks支持文件站点上获得。金宝app看到免责声明

该数据集由四部分组成:无故障训练、无故障测试、故障训练和故障测试。分别下载每个文件。

url =“//www.tatmou.com/金宝appsupportfiles/predmaint/chemical-process-fault-detection-data/faultytesting.mat”;websave (“faultytesting.mat”url);url =“//www.tatmou.com/金宝appsupportfiles/predmaint/chemical-process-fault-detection-data/faultytraining.mat”;websave (“faultytraining.mat”url);url =“//www.tatmou.com/金宝appsupportfiles/predmaint/chemical-process-fault-detection-data/faultfreetesting.mat”;websave (“faultfreetesting.mat”url);url =“//www.tatmou.com/金宝appsupportfiles/predmaint/chemical-process-fault-detection-data/faultfreetraining.mat”;websave (“faultfreetraining.mat”url);

将下载的文件加载到MATLAB®工作区中。

负载(“faultfreetesting.mat”);负载(“faultfreetraining.mat”);负载(“faultytesting.mat”);负载(“faultytraining.mat”);

每个组件都包含两个参数的每一次排列所运行的模拟数据:

  • 故障编号——对于故障数据集,1到20之间的整数值,表示不同的模拟故障。对于无故障数据集,值为0。

  • 模拟运行——对于所有数据集,从1到500的整数值,其中每个值代表模拟的唯一随机生成器状态。

每个模拟的长度取决于数据集。所有模拟每三分钟采样一次。

  • 训练数据集包含来自25小时模拟的500个时间样本。

  • 测试数据集包含来自48小时模拟的960个时间样本。

每个数据帧的列中有以下变量:

  • 第一栏(faultNumber表示故障类型,取值范围为0 ~ 20。故障编号为0表示无故障,故障编号为1 ~ 20表示TEP中不同的故障类型。

  • 第二栏(simulationRun)表示为获取完整数据而运行TEP模拟的次数。在训练和测试数据集中,对于所有故障编号,运行次数从1到500不等。每一个simulationRun值表示模拟的不同随机生成器状态。

  • 第三栏(样本)表示每次模拟记录TEP变量的次数。对于训练数据集,这个数字从1到500,对于测试数据集,这个数字从1到960。对于训练数据集和测试数据集,分别在25小时和48小时内每3分钟对TEP变量(列4至55)进行采样。

  • 第4-44栏(xmeas_1通过xmeas_41)中包含TEP的测量变量。

  • 第45-55栏(xmv_1通过xmv_11)中包含TEP的操作变量。

检查其中两个文件的子部分。

头(faultfreetraining, 4)
ans =表4×55faultNumber simulationRun sample xmeas_1 xmeas_2 xmeas_3 xmeas_4 xmeas_5 xmeas_6 xmeas_7 xmeas_8 xmeas_9 xmeas_10 xmeas_11 xmeas_12 xmeas_13 xmeas_16 xmeas_17 xmeas_18 xmeas_19 xmeas_20 xmeas_21 xmeas_22 xmeas_23 xmeas_24 xmeas_25 xmeas_26 xmeas_27 xmeas_28 xmeas_29 xmeas_30 xmeas_31 xmeas_32 xmeas_33 xmeas_34 xmeas_35 xmeas_36 xmeas_37 xmeas_38 xmeas_39 xmeas_40 xmeas_41 xmv_1 xmv_2 xmv_3 xmv_4 xmv_7 xmv_8 xmv_10 xmv_11 ___________ _____________ _____________ _______ _______ _______ _______ _______ _______ _______ _______ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ 0 1 1 0.25038 3674 4529 9.232 26.889 42.402 2704.3 74.863120.41 0.33818 80.044 51.435 2632.9 25.029 50.528 3101.1 22.819 65.732 229.61 341.22 94.64 77.047 32.188 8.8933 26.383 6.882 18.776 1.6567 32.958 13.878 2.2633 4.8436 2.2986 0.017866 0.957 0.098577 53.724 43.828 62.881 53.744 24.657 47.544 22.137 39.935 42.323 47.757 47.51 41.258 18.447 01 2 0.25109 3659.4 4556.6 9.4264 26.721 42.576 2705 75 120.41 0.3362 50.154 2633.8 24.419 48.772 3102 23.333 65.716 94.534 32.188 8.8933 26.383 6.882 18.7761.6567 32.958 13.823 23.978 1.2565 18.579 2.2633 4.8436 2.2986 0.017866 0.8357 0.098577 53.724 43.828 63.132 0.354 43.682 47.47.8 9.4426 26.875 42.07 2706.2 74.771 120.42 0.33563 80.22 50.302 2635.5 25.244 3103.5 21.924 65.732 230.08 341.38 94.605 77.466 31.767 8.7694 26.095 6.8259 18.961 2.2602 4.8543 2.39 0.017866 0.83.117 54.357 24.66661.275 22.38 40.244 38.99 46.699 47.468 41.199 20.53 01 4 0.24977 3661.3 4512.1 9.4776 26.758 42.063 2707.2 75.224 120.39 0.33553 80.305 49.99 2635.6 23.268 50.435 3102.8 22.948 65.781 341.71 94.473 77.443 31.767 8.7694 26.095 6.8259 18.961 1.6292 32.985 13.897 1.3001 18.765 2.2602 4.8543 2.39 0.017866 0.8357 0.098577 53.257 38.072 47.541 47.658 41.643 18.089
头(faultytraining, 4)
ans =表4×55faultNumber simulationRun sample xmeas_1 xmeas_2 xmeas_3 xmeas_4 xmeas_5 xmeas_6 xmeas_7 xmeas_8 xmeas_9 xmeas_10 xmeas_11 xmeas_12 xmeas_13 xmeas_16 xmeas_17 xmeas_18 xmeas_19 xmeas_20 xmeas_21 xmeas_22 xmeas_23 xmeas_24 xmeas_25 xmeas_26 xmeas_27 xmeas_28 xmeas_29 xmeas_30 xmeas_31 xmeas_32 xmeas_33 xmeas_34 xmeas_35 xmeas_36 xmeas_37 xmeas_38 xmeas_39 xmeas_40 xmeas_41 xmv_1 xmv_2 xmv_3 xmv_4 xmv_7 xmv_8 xmv_10 xmv_11 ___________ _____________ _____________ _______ _______ _______ _______ _______ _______ _______ _______ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ 1 1 1 0.25038 3674 4529 9.232 26.889 42.402 2704.3 74.863120.41 0.33818 80.044 51.435 2632.9 25.029 50.528 3101.1 22.819 65.732 229.61 341.22 94.64 77.047 32.188 8.8933 26.383 6.882 18.776 1.6567 32.958 13.878 2.2633 4.8436 2.2986 0.017866 0.957 0.098577 53.724 43.828 62.881 53.744 24.657 47.544 22.137 39.935 42.323 47.757 47.51 41.258 18.447 1 12 0.25109 3659.4 4556.6 9.4264 26.721 42.576 2705 75 120.41 0.3362 50.154 2633.8 24.419 48.772 3102 23.333 65.716 94.534 32.188 8.8933 26.383 6.882 18.7761.6567 32.958 13.823 23.978 1.2565 18.579 2.2633 4.8436 2.2986 0.017866 0.8357 0.098577 53.724 43.828 63.132 0.354 43.682 47.47.8 9.4426 26.875 42.07 2706.2 74.771 120.42 0.33563 80.22 50.302 2635.5 25.244 3103.5 21.924 65.732 230.08 341.38 94.605 77.466 31.767 8.7694 26.095 6.8259 18.961 2.2602 4.8543 2.39 0.017866 0.83.117 54.357 24.66661.275 22.38 40.244 38.99 46.699 47.468 41.199 20.53 1 1 4 0.24977 3661.3 4512.1 9.4776 26.758 42.063 2707.2 75.224 120.39 0.33553 80.305 49.99 2635.6 23.268 50.435 3102.8 22.948 65.781 341.71 94.473 77.443 31.767 8.7694 26.095 6.8259 18.961 1.6292 32.985 13.897 1.3001 18.765 2.2602 4.8543 2.39 0.017866 0.8357 0.098577 53.257 38.072 47.541 47.658 41.643 18.089

干净的数据

删除训练数据集和测试数据集中故障编号为3、9和15的数据项。这些故障编号无法识别,并且相关的模拟结果是错误的。

faultytesting (faultytesting。faultNumber == 3,:) = [];faultytesting (faultytesting。faultNumber == 9,:) = [];faultytesting (faultytesting。faultNumber == 15,:) = [];faultytraining (faultytraining。faultNumber == 3,:) = [];faultytraining (faultytraining。faultNumber == 9,:) = [];faultytraining (faultytraining。faultNumber == 15,:) = [];

把数据

将训练数据分为训练数据和验证数据,保留20%的训练数据用于验证。使用验证数据集使您能够在调优模型超参数时评估训练数据集上的模型拟合。数据分割通常用于防止网络过拟合和欠拟合。

获得故障和无故障训练数据集中的总行数。

H1 =高度(faultfreetraining);H2 = height(faultytraining);

模拟运行次数是针对特定故障类型重复TEP进程的次数。从训练数据集和测试数据集获得最大的模拟运行。

msTrain = max(faultfreetraining.simulationRun);msTest = max(faultytesting.simulationRun);

计算验证数据的最大模拟运行时间。

rTrain = 0.80;msVal = ceil(msTrain*(1 - rTrain));msTrain = msTrain*rTrain;

获取样本或时间步长的最大数量(即,在TEP模拟期间记录数据的最大次数)。

sampleTrain = max(faultfreetraining.sample);sampleTest = max(faultfreetesting.sample);

获取无故障和故障训练数据集中的划分点(行号),以从训练数据集中创建验证数据集。

rowLim1 = cell (rTrain*H1);rowLim2 = cell (rTrain*H2);trainingData = [faultfreetraining{1:rowLim1,:};faultytraining {1: rowLim2,:}];validationData = [faultfreetraining{rowLim1 + 1:end,:};faultytraining{rowLim2 + 1:end,:}];testingData = [faultfreetesting{:,:};faultytesting {,,}):;

网络设计与预处理

最终的数据集(包括训练、验证和测试数据)包含52个信号,具有500个统一的时间步长。因此,需要将信号或序列分类到其正确的故障号,这就成为了序列分类的问题。

  • 长短期记忆(LSTM)网络适用于序列数据的分类。

  • LSTM网络适用于时间序列数据,因为它们倾向于记住过去信号的唯一性,以便对新信号进行分类

  • LSTM网络使您能够将序列数据输入到网络中,并基于序列数据的单个时间步长进行预测。有关LSTM网络的更多信息,请参见长短期记忆网络

  • 训练网络对序列进行分类trainNetwork函数时,必须首先预处理数据。数据必须在单元数组中,其中单元数组的每个元素都是表示单个模拟中52个信号的集合的矩阵。单元阵列中的每个矩阵都是用于特定TEP模拟的信号集,可以是故障的,也可以是无故障的。每组信号指向一个特定的故障类别,范围从0到20。

正如前面在数据集部分中所描述的,数据包含52个变量,这些变量的值在模拟中记录了一段时间。的样本变量表示在一次模拟运行中记录这52个变量的次数。的最大值样本在训练数据集中变量为500,在测试数据集中变量为960。因此,对于每个模拟,有一组长度为500或960的52个信号。每组信号都属于TEP的特定模拟运行,并指向0 - 20范围内的特定故障类型。

训练和测试数据集都包含每种故障类型的500个模拟。20%(来自训练)用于验证,这使得训练数据集每个故障类型有400个模拟,验证数据每个故障类型有100个模拟。使用helper函数helperPreprocess以创建信号集,其中每个集合是表示单个TEP模拟的单元数组的单个元素中的双矩阵。因此,最终的训练、验证和测试数据集的大小如下:

  • 的大小Xtrain:(模拟总次数)X(故障类型总数)= 400 X 18 = 7200

  • 的大小XVal:(模拟总数)X(故障类型总数)= 100 X 18 = 1800

  • 的大小Xtest:(模拟总次数)X(故障类型总数)= 500 × 18 = 9000

在数据集中,前500个模拟是0故障类型(无故障)和后续故障模拟的顺序是已知的。这些知识可以为训练、验证和测试数据集创建真实的响应。

Xtrain = helppreprocess (trainingData,sampleTrain);Ytrain = categorical([0 (msTrain,1);repmat([1,2,4:8,10:14,16:20],1,msTrain)']);XVal = helppreprocess (validationData,sampleTrain);YVal =分类([0 (msVal 1); repmat([1、2、4:8,14,十六20],1,msVal) ');Xtest = helppreprocess (testingData,sampleTest);欧美=分类([0 (msTest 1); repmat([1、2、4:8,14,十六20],1,msTest) ');

规范化数据集

归一化是一种技术,它将数据集中的数值按公共比例缩放,而不会扭曲值范围中的差异这种技术确保了具有较大值的变量不会在训练中支配其他变量。它还将较大范围内的数值转换为较小范围(通常为-1到1),而不会丢失训练所需的任何重要信息。

使用来自训练数据集中所有模拟的数据计算52个信号的平均值和标准偏差。

tMean = mean(trainingData(:,4:end))';tSigma = std(trainingData(:,4:end))';

使用helper函数helperNormalize基于训练数据的均值和标准差对三个数据集中的每个单元进行归一化。

Xtrain = helperNormalize(Xtrain, tMean, tSigma);XVal = helpnormalize (XVal, tMean, tSigma);Xtest = helpnormalize (Xtest, tMean, tSigma);

可视化数据

Xtrain数据集包含400个无故障模拟和6800个故障模拟。将正常数据和故障数据可视化。首先,创建一个无故障数据图。中仅绘制和标记10个信号Xtrain数据集创建一个易于阅读的图形。

图;Splot = 10;情节(Xtrain {1} (1:10:) ');包含(“时间步”);标题(“无故障数据的训练观察”);传奇(“信号”+字符串(1:splot),“位置”“northeastoutside”);

现在,通过绘制400之后的任何单元格数组元素,将无故障图与故障图进行比较。

图;情节(Xtrain {1000} (1:10:) ');包含(“时间步”);标题(《错误数据的训练观察》);传奇(“信号”+字符串(1:splot),“位置”“northeastoutside”);

层结构和训练选项

LSTM层是序列分类的一个很好的选择,因为LSTM层倾向于只记住输入序列的重要方面。

  • 指定输入层sequenceInputLayer与输入信号数(52)的大小相同。

  • 指定3个LSTM隐藏层,单位分别为52、40和25。本规范的灵感来自于[2].有关使用LSTM网络进行序列分类的更多信息,请参见使用深度学习的序列分类

  • 在LSTM层之间添加3个dropout层以防止过拟合。dropout层以给定的概率随机地将下一层的输入元素设置为零,这样网络就不会对该层中的一小组神经元变得敏感

  • 最后,为了分类,包括一个与输出类数量(18)相同大小的全连接层。在全连接层之后,包括一个softmax层,它为多类问题中的每个类分配十进制概率(预测可能性),以及一个分类层,根据softmax层的输出输出最终的故障类型。

numSignals = 52;numhiddenunit2 = 52;numhiddenunit3 = 40;numhiddenunit4 = 25;numClasses = 18;层= [...sequenceInputLayer numSignals lstmLayer (numHiddenUnits2,“OutputMode”“序列”lstmLayer(numhiddenunit3)“OutputMode”“序列”lstmLayer(numhiddenunit4)“OutputMode”“最后一次”) dropoutLayer(0.2) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];

设置培训选项trainNetwork用途。

名称-值对保持默认值“ExecutionEnvironment”作为“汽车”.通过此设置,软件将自动选择执行环境。默认情况下,trainNetwork如果有GPU,则使用GPU,否则使用CPU。在GPU上进行训练需要并行计算工具箱™和受支持的GPU设备。金宝app有关受支持设备的信息,请参见金宝appGPU支金宝app持版本(并行计算工具箱).因为这个例子使用了大量的数据,使用GPU大大加快了训练时间。

设置名称-值参数对“洗牌”“every-epoch”避免在每个纪元丢弃相同的数据。

有关深度学习训练选项的更多信息,请参见trainingOptions

maxEpochs = 30;miniBatchSize = 50;选项= trainingOptions(“亚当”...“ExecutionEnvironment”“汽车”...“GradientThreshold”, 1...“MaxEpochs”maxEpochs,...“MiniBatchSize”miniBatchSize,...“洗牌”“every-epoch”...“详细”0,...“阴谋”“训练进步”...“ValidationData”, {XVal, YVal});

列车网络的

训练LSTM网络使用trainNetwork

net = trainNetwork(Xtrain,Ytrain,图层,选项);

训练进度图显示了网络精度的曲线图。在图的右侧,可以查看到培训时间和设置信息。

测试网络

在测试集上运行训练好的网络,并预测信号中的故障类型。

Ypred =分类(net,Xtest,...“MiniBatchSize”miniBatchSize,...“ExecutionEnvironment”“汽车”);

计算精度。准确度是测试数据中与分类相匹配的真实标签的数量分类除以测试数据中的图像数量。

acc = sum(Ypred == Ytest)./ nummel (Ypred)
Acc = 0.9992

较高的精度表明该神经网络能够以最小的误差成功地识别不可见信号的故障类型。因此,准确率越高,网络越好。

使用测试信号的真实类别标签绘制混淆矩阵,以确定网络识别每个故障的能力。

confusionchart(欧美,Ypred);

使用混淆矩阵,您可以评估分类网络的有效性。混淆矩阵在主对角线上有数值,在其他地方有零。本例中经过训练的网络是有效的,可以正确分类99%以上的信号。

参考文献

[1]里斯,C. A., B. D.阿姆塞尔,R. Tran。和B. Maia。附加田纳西伊士曼过程模拟数据异常检测评估。哈佛数据厌恶,版本1,2017。https://doi.org/10.7910/DVN/6C3JR1

[2]许世勋和李俊赫。基于人工神经网络的故障检测与分类韩国科学技术院化学与生物分子工程系。

辅助函数

helperPreprocess

辅助函数helperPreprocess使用最大样本数对数据进行预处理。采样数表示信号长度,它在整个数据集上是一致的。for循环用信号长度滤波器遍历数据集,形成52个信号的集合。每个集合是单元格数组的一个元素。每个单元格数组表示一个模拟。

函数H = size(mydata,limit);Processed = {};(1:限制:H x = mydata(ind:(ind+(limit-1)),4:结束);加工过=[加工过的;x ');结束结束

helperNormalize

辅助函数helperNormalize使用数据、平均值和标准偏差来规范化数据。

函数data = helperNormalize(data,m,s)印第安纳州= 1:尺寸数据(数据){印第安纳}={印第安纳}- m(数据)/ s;结束结束

另请参阅

|||

相关的话题