Обнаружение отказа химического процесса с помощью глубокого обучения

Этот пример показывает, как использовать данные моделирования для обучения нейронной сети, которая может обнаружить сбои в химическом процессе. Сеть обнаруживает отказы в моделируемом процессе с высокой точностью. Типичный рабочий процесс следующий:

  1. Предварительная обработка данных

  2. Проектируйте архитектуру слоев

  3. Обучите сеть

  4. Выполните валидацию

  5. Тестируйте сеть

Загрузка набора данных

Этот пример использует форматированные в MATLAB файлы, преобразованные MathWorks ® из данных моделирования процесса Eastman (TEP) Теннесси [1]. Эти файлы доступны на сайте файлов поддержки MathWorks. См. отказ от ответственности.

Набор данных состоит из четырех компонентов - безаварийное обучение, безаварийная проверка, дефектное обучение и дефектная проверка. Загрузите каждый файл отдельно.

url = 'https://www.mathworks.com/supportfiles/predmaint/chemical-process-fault-detection-data/faultytesting.mat';
websave('faultytesting.mat',url);
url = 'https://www.mathworks.com/supportfiles/predmaint/chemical-process-fault-detection-data/faultytraining.mat';
websave('faultytraining.mat',url);
url = 'https://www.mathworks.com/supportfiles/predmaint/chemical-process-fault-detection-data/faultfreetesting.mat';
websave('faultfreetesting.mat',url);
url = 'https://www.mathworks.com/supportfiles/predmaint/chemical-process-fault-detection-data/faultfreetraining.mat';
websave('faultfreetraining.mat',url);

Загрузите загруженные файлы в рабочую область MATLAB ®.

load('faultfreetesting.mat');
load('faultfreetraining.mat');
load('faultytesting.mat');
load('faultytraining.mat');

Каждый компонент содержит данные из симуляций, которые были запущены для каждого сочетания двух параметров:

  • Число отказа - для дефектных наборов данных целое значение от 1 до 20, которое представляет другой моделируемый отказ. Для свободных от отказа наборов данных значение 0.

  • Запуск симуляции - Для всех наборов данных целочисленные значения от 1 до 500, где каждое значение представляет уникальное состояние случайного генератора для симуляции.

Длина каждой симуляции зависела от набора данных. Все симуляции отбирались каждые три минуты.

  • Наборы обучающих данных содержат 500 временных выборок от 25 часов симуляции.

  • Наборы данных тестирования содержат 960 расчета времени от 48 часов симуляции.

Каждая система координат данных имеет следующие переменные в своих столбцах:

  • Столбец 1 (faultNumber) указывает тип отказа, который изменяется от 0 до 20. Номер отказа 0 означает отсутствие отказа, в то время как номера отказа с 1 по 20 представляют различные типы отказа в TEP.

  • Столбец 2 (simulationRun) указывает, сколько раз выполнялась симуляция TEP для получения полных данных. В наборах обучающих и тестовых данных количество запусков изменяется от 1 до 500 для всех номеров отказов. Каждый simulationRun значение представляет другое состояние случайного генератора для симуляции.

  • Столбец 3 (sample) указывает количество раз, когда были записаны переменные TEP на симуляцию. Это число варьируется от 1 до 500 для обучающих наборов обучающих данных и от 1 до 960 для тестовых наборов данных. Переменные TEP (столбцы с 4 по 55) отбирали каждые 3 минуты в течение 25 часов и 48 часов для наборов данных обучения и тестирования соответственно.

  • Столбцы 4-44 (xmeas_1 через xmeas_41) содержат измеренные переменные TEP.

  • Столбцы 45-55 (xmv_1 через xmv_11) содержат манипулируемые переменные TEP.

Исследуйте подразделы двух файлов.

head(faultfreetraining,4)    
ans=4×55 table
    faultNumber    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_14    xmeas_15    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_5     xmv_6     xmv_7     xmv_8     xmv_9     xmv_10    xmv_11
    ___________    _____________    ______    _______    _______    _______    _______    _______    _______    _______    _______    _______    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ______    ______    ______    ______    ______    ______    ______    ______    ______    ______    ______

         0               1            1       0.25038      3674       4529      9.232     26.889     42.402     2704.3     74.863     120.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.823      23.978      1.2565      18.579      2.2633      4.8436      2.2986     0.017866     0.8357     0.098577     53.724      43.828     62.881    53.744    24.657    62.544    22.137    39.935    42.323    47.757     47.51    41.258    18.447
         0               1            2       0.25109    3659.4     4556.6     9.4264     26.721     42.576       2705         75     120.41      0.3362      80.078      50.154      2633.8      24.419      48.772        3102      23.333      65.716      230.54       341.3      94.595      77.434      32.188      8.8933      26.383       6.882      18.776      1.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    53.414    24.588    59.259    22.084    40.176    38.554    43.692    47.427    41.359    17.194
         0               1            3       0.25038    3660.3     4477.8     9.4426     26.875      42.07     2706.2     74.771     120.42     0.33563       80.22      50.302      2635.5      25.244      50.071      3103.5      21.924      65.732      230.08      341.38      94.605      77.466      31.767      8.7694      26.095      6.8259      18.961      1.6292      32.985      13.742      23.897      1.3001      18.765      2.2602      4.8543        2.39     0.017866     0.8357     0.098577     53.724      43.828     63.117    54.357    24.666    61.275     22.38    40.244     38.99    46.699    47.468    41.199     20.53
         0               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      227.91      341.71      94.473      77.443      31.767      8.7694      26.095      6.8259      18.961      1.6292      32.985      13.742      23.897      1.3001      18.765      2.2602      4.8543        2.39     0.017866     0.8357     0.098577     53.724      43.828       63.1    53.946    24.725    59.856    22.277    40.257    38.072    47.541    47.658    41.643    18.089

head(faultytraining,4)       
ans=4×55 table
    faultNumber    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_14    xmeas_15    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_5     xmv_6     xmv_7     xmv_8     xmv_9     xmv_10    xmv_11
    ___________    _____________    ______    _______    _______    _______    _______    _______    _______    _______    _______    _______    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ________    ______    ______    ______    ______    ______    ______    ______    ______    ______    ______    ______

         1               1            1       0.25038      3674       4529      9.232     26.889     42.402     2704.3     74.863     120.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.823      23.978      1.2565      18.579      2.2633      4.8436      2.2986     0.017866     0.8357     0.098577     53.724      43.828     62.881    53.744    24.657    62.544    22.137    39.935    42.323    47.757     47.51    41.258    18.447
         1               1            2       0.25109    3659.4     4556.6     9.4264     26.721     42.576       2705         75     120.41      0.3362      80.078      50.154      2633.8      24.419      48.772        3102      23.333      65.716      230.54       341.3      94.595      77.434      32.188      8.8933      26.383       6.882      18.776      1.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    53.414    24.588    59.259    22.084    40.176    38.554    43.692    47.427    41.359    17.194
         1               1            3       0.25038    3660.3     4477.8     9.4426     26.875      42.07     2706.2     74.771     120.42     0.33563       80.22      50.302      2635.5      25.244      50.071      3103.5      21.924      65.732      230.08      341.38      94.605      77.466      31.767      8.7694      26.095      6.8259      18.961      1.6292      32.985      13.742      23.897      1.3001      18.765      2.2602      4.8543        2.39     0.017866     0.8357     0.098577     53.724      43.828     63.117    54.357    24.666    61.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      227.91      341.71      94.473      77.443      31.767      8.7694      26.095      6.8259      18.961      1.6292      32.985      13.742      23.897      1.3001      18.765      2.2602      4.8543        2.39     0.017866     0.8357     0.098577     53.724      43.828       63.1    53.946    24.725    59.856    22.277    40.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 = height(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 = ceil(rTrain*H1);
rowLim2 = ceil(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 хороши для timeseries данных, поскольку они, как правило, помнят уникальность прошлых сигналов в порядок классификации новых сигналов

  • Сеть LSTM позволяет вводить данные последовательности в сеть и делать предсказания на основе отдельных временных шагов данных последовательности. Для получения дополнительной информации о сетях LSTM, смотрите Длинные Краткосрочные Сети Памяти.

  • Чтобы обучить сеть классифицировать последовательности с помощью trainNetwork функция, вы должны сначала обработать данные. Данные должны быть в массивах ячеек, где каждый элемент массива ячеек является матрицей, представляющей набор из 52 сигналов в одной симуляции. Каждая матрица в массиве ячеек является набором сигналов для конкретной симуляции TEP и может быть либо неисправной, либо свободной от отказа. Каждый набор сигналов указывает на определенный класс отказа в диапазоне от 0 до 20.

Как было описано ранее в разделе Data Set, данные содержат 52 переменные, значения которых записываются в течение определенного времени в симуляции. The sample переменная представляет количество раз, когда эти 52 переменные записываются в один запуск симуляции. Максимальное значение sample переменная - 500 в наборе обучающих данных и 960 в наборе тестовых данных. Таким образом, для каждой симуляции существует набор 52 сигналов длины 500 или 960. Каждый набор сигналов принадлежит конкретному запуску симуляции TEP и указывает на конкретный тип отказа в области значений 0 - 20.

Оба набора обучающих и тестовых наборов данных содержат 500 симуляций для каждого типа отказа. Двадцать процентов (от обучения) хранятся для валидации, которая оставляет набор обучающих данных с 400 симуляциями на тип отказа и данными валидации с 100 симуляциями на тип отказа. Используйте функцию helper helperPreprocess создать наборы сигналов, где каждый набор является двойной матрицей в одном элементе массива ячеек, который представляет одну симуляцию TEP. Следовательно, размеры окончательных наборов данных для обучения, валидации и проверки следующие:

  • Размер Xtrain: (Общее количество симуляций) X (Общее количество типов отказов) = 400 X 18 = 7200

  • Размер XVal: (Общее количество симуляций) X (Общее количество типов отказов) = 100 X 18 = 1800

  • Размер Xtest: (Общее количество симуляций) X (Общее количество типов отказов) = 500 X 18 = 9000

В наборе данных первые 500 симуляций 0 известен тип отказа (без отказа) и порядок последующих дефектных симуляций. Это знание позволяет создавать истинные ответы для наборов данных для обучения, валидации и проверки.

Xtrain = helperPreprocess(trainingData,sampleTrain);
Ytrain = categorical([zeros(msTrain,1);repmat([1,2,4:8,10:14,16:20],1,msTrain)']);
 
XVal = helperPreprocess(validationData,sampleTrain);
YVal = categorical([zeros(msVal,1);repmat([1,2,4:8,10:14,16:20],1,msVal)']);
 
Xtest = helperPreprocess(testingData,sampleTest);
Ytest = categorical([zeros(msTest,1);repmat([1,2,4:8,10:14,16:20],1,msTest)']);

Нормализация наборов данных

Нормализация является методом, который масштабирует числовые значения в наборе данных до общей шкалы, не искажая различия в области значений значений. Этот метод гарантирует, что переменная с большим значением не доминирует над другими переменными в обучении. Он также преобразует числовые значения в более высокой области значений в меньшую область значений (обычно от -1 до 1), не теряя никакой важной информации, необходимой для обучения.

Вычислите среднее и стандартное отклонение для 52 сигналов, используя данные всех симуляций в наборе обучающих данных.

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

Используйте функцию helper helperNormalize применить нормализацию к каждой камере в трех наборах данных на основе среднего и стандартного отклонения обучающих данных.

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

Визуализация данных

The Xtrain набор данных содержит 400 безаварийных симуляций с последующим 6800 дефектными симуляциями. Визуализация безаварийных и неисправных данных. Во-первых, создайте график данных без отказа. В целях этого примера постройте график и пометьте только 10 сигналов в Xtrain набор данных для создания легко читаемого рисунка.

figure;
splot = 10;    
plot(Xtrain{1}(1:10,:)');   
xlabel("Time Step");
title("Training Observation for Non-Faulty Data");
legend("Signal " + string(1:splot),'Location','northeastoutside');

Теперь сравните безаварийный график с дефектным графиком путем построения графика любого из элементов массива ячеек после 400.

figure;
plot(Xtrain{1000}(1:10,:)');   
xlabel("Time Step");
title("Training Observation for Faulty Data");
legend("Signal " + string(1:splot),'Location','northeastoutside');

Архитектура слоев и опции обучения

Слои LSTM являются хорошим выбором для классификации последовательностей, поскольку слои LSTM, как правило, запоминают только важные аспекты входа последовательности.

  • Задайте слой входа sequenceInputLayer иметь тот же размер, что и число входных сигналов (52).

  • Задайте 3 скрытых слоя LSTM с 52, 40 и 25 модулями. Эта спецификация вдохновлена экспериментом, проведенным в [2]. Для получения дополнительной информации об использовании сетей LSTM для классификации последовательностей, смотрите Классификация последовательностей с использованием глубокого обучения.

  • Добавьте 3 слоя выпадения между слоями LSTM, чтобы предотвратить сверхподбор кривой. Выпадающий слой случайным входам устанавливает элементы следующего слоя, чтобы нуль с заданной вероятностью, чтобы сеть не стала чувствительной к небольшому набору нейронов в слое

  • Наконец, для классификации включите полносвязный слой того же размера, что и количество выходных классов (18). После полносвязного слоя включите слой softmax, который присваивает десятичные вероятности (возможность предсказания) каждому классу в задаче мультиклассов, и слой классификации, чтобы вывести конечный тип отказа на основе выхода от слоя softmax.

numSignals = 52;
numHiddenUnits2 = 52;
numHiddenUnits3 = 40;
numHiddenUnits4 = 25;
numClasses = 18;
     
layers = [ ...
    sequenceInputLayer(numSignals)
    lstmLayer(numHiddenUnits2,'OutputMode','sequence')
    dropoutLayer(0.2)
    lstmLayer(numHiddenUnits3,'OutputMode','sequence')
    dropoutLayer(0.2)
    lstmLayer(numHiddenUnits4,'OutputMode','last')
    dropoutLayer(0.2)
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

Установите опции обучения, которые trainNetwork использует.

Сохраните значение по умолчанию для пары "имя-значение" 'ExecutionEnvironment' как 'auto'. С помощью этой настройки программное обеспечение автоматически выбирает окружение выполнения. По умолчанию trainNetwork использует графический процессор, если он доступен, в противном случае используется центральный процессор. Для обучения на графическом процессоре требуется Parallel Computing Toolbox™ и поддерживаемое устройство GPU. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox). Поскольку этот пример использует большой объем данных, использование графический процессор значительно ускоряет время обучения.

Установка пары аргумент имя-значение 'Shuffle' на 'every-epoch' избегает отбрасывания тех же данных каждую эпоху.

Для получения дополнительной информации о опциях обучения для глубокого обучения смотрите trainingOptions.

maxEpochs = 30;
miniBatchSize = 50;  
 
options = trainingOptions('adam', ...
    'ExecutionEnvironment','auto', ...
    'GradientThreshold',1, ...
    'MaxEpochs',maxEpochs, ...
    'MiniBatchSize', miniBatchSize,...
    'Shuffle','every-epoch', ...
    'Verbose',0, ...
    'Plots','training-progress',...
    'ValidationData',{XVal,YVal});

Обучите сеть

Обучите сеть LSTM с помощью trainNetwork.

net = trainNetwork(Xtrain,Ytrain,layers,options);

Рисунок процесса обучения отображает график точности сети. Справа от рисунка просмотрите информацию о времени и настройках обучения.

Проверка сети

Запустите обученную сеть на тестовом наборе и спрогнозируйте тип отказа в сигналах.

Ypred = classify(net,Xtest,...
    'MiniBatchSize', miniBatchSize,...
    'ExecutionEnvironment','auto');

Вычислите точность. Точность является количеством истинных меток в тестовых данных, которые совпадают с классификациями из classify разделенный на количество изображений в тестовых данных.

acc = sum(Ypred == Ytest)./numel(Ypred)
acc = 0.9992

Высокая точность указывает, что нейронная сеть успешно способна идентифицировать тип отказа невидимых сигналов с минимальными ошибками. Следовательно, чем выше точность, тем лучше сеть.

Постройте матрицу неточностей с помощью истинных меток классов тестовых сигналов, чтобы определить, насколько хорошо сеть идентифицирует каждый отказ.

confusionchart(Ytest,Ypred);

Используя матрицу неточностей, можно оценить эффективность классификационной сети. матрица неточностей имеет числовые значения в основной диагонали и нули в другом месте. Обученная сеть в этом примере эффективна и правильно классифицирует более 99% сигналов.

Ссылки

[1] Rieth, C. A., B. D. Amsel, R. Tran., and B. Maia. Дополнительные данные моделирования процесса Eastman в Теннесси для оценки обнаружения аномалий. Гарвардская Dataverse, версия 1, 2017. https://doi.org/10.7910/DVN/6C3JR1.

[2] Хео, С. и Дж. Х. Ли. «Обнаружение и классификация отказов с использованием искусственных нейронных сетей». Кафедра химической и биомолекулярной инженерии, Корейский передовой институт науки и технологий.

Вспомогательные функции

helperPreprocess

Функция помощника helperPreprocess использует максимальное число выборок для предварительной обработки данных. Номер выборки указывает длину сигнала, которая согласована между набором данных. Цикл for-loop переходит по набору данных с фильтром длины сигнала, чтобы сформировать наборы из 52 сигналов. Каждый набор является элементом массива ячеек. Каждый массив ячеек представляет одну симуляцию.

function processed = helperPreprocess(mydata,limit)
    H = size(mydata);
    processed = {};
    for ind = 1:limit:H
        x = mydata(ind:(ind+(limit-1)),4:end);
        processed = [processed; x'];
    end
end

helperNormalize

Функция помощника helperNormalize использует данные, среднее и стандартное отклонение для нормализации данных.

function data = helperNormalize(data,m,s)
    for ind = 1:size(data)
        data{ind} = (data{ind} - m)./s;
    end
end

См. также

| | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте