В этом примере показано, как использовать данные моделирования для обучения нейронной сети, которая может обнаруживать неисправности в химическом процессе. Сеть обнаруживает неисправности в моделируемом процессе с высокой точностью. Типичный рабочий процесс выглядит следующим образом:
Предварительная обработка данных
Разработка архитектуры слоев
Обучение сети
Выполнить проверку
Тестирование сети
В этом примере используются файлы в формате MATLAB, преобразованные MathWorks ® из данных моделирования Tennessee Eastman Process (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');
Каждый компонент содержит данные моделирования, выполненного для каждой перестановки двух параметров:
Номер отказа (Fault Number) - для неисправных наборов данных целочисленное значение от 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 хороши для данных временных рядов, поскольку они, как правило, запоминают уникальность прошлых сигналов, чтобы классифицировать новые сигналы
Сеть LSTM позволяет вводить данные последовательности в сеть и делать прогнозы на основе отдельных временных шагов данных последовательности. Дополнительные сведения о сетях LSTM см. в разделе Сети долговременной памяти.
Обучение сети классификации последовательностей с помощью trainNetwork сначала необходимо выполнить предварительную обработку данных. Данные должны быть в массивах ячеек, где каждый элемент массива ячеек является матрицей, представляющей набор из 52 сигналов в одном моделировании. Каждая матрица в матрице ячеек является набором сигналов для конкретного моделирования TEP и может быть либо неисправной, либо безотказной. Каждый набор сигналов указывает на определенный класс отказов в диапазоне от 0 до 20.
Как было описано ранее в разделе Набор данных, данные содержат 52 переменные, значения которых записываются в течение определенного периода времени при моделировании. sample переменная представляет количество записей этих 52 переменных в одном прогоне моделирования. Максимальное значение параметра sample переменная составляет 500 в наборе данных обучения и 960 в наборе данных тестирования. Таким образом, для каждого моделирования имеется набор из 52 сигналов длиной 500 или 960. Каждый набор сигналов относится к определенному прогону моделирования TEP и указывает на определенный тип отказа в диапазоне 0 - 20.
Обучающие и тестовые наборы данных содержат 500 имитаций для каждого типа отказа. Двадцать процентов (от обучения) сохраняются для проверки, что оставляет набор данных обучения с 400 моделированием для каждого типа неисправности и данные проверки с 100 моделированием для каждого типа неисправности. Использовать функцию помощника 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))';
Использовать функцию помощника helperNormalize применять нормализацию к каждой ячейке в трех наборах данных на основе среднего и стандартного отклонения обучающих данных.
Xtrain = helperNormalize(Xtrain, tMean, tSigma); XVal = helperNormalize(XVal, tMean, tSigma); Xtest = helperNormalize(Xtest, tMean, tSigma);
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 использует графический процессор, если он доступен, в противном случае использует центральный процессор. Для обучения графическому процессору требуются параллельные вычислительные Toolbox™ и поддерживаемое устройство графического процессора. Сведения о поддерживаемых устройствах см. в разделе Поддержка графического процессора по выпуску (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] Риет, К. А., Б. Д. Амсель, Р. Трэн и Б. Майя. «Дополнительные данные моделирования процессов Tennessee Eastman для оценки обнаружения аномалий». Harvard Dataverse, версия 1, 2017. https://doi.org/10.7910/DVN/6C3JR1.
[2] Heo, S. и Дж. Х. Ли. «Обнаружение и классификация неисправностей с использованием искусственных нейронных сетей». Кафедра химической и биомолекулярной инженерии, Корейский передовой институт науки и техники.
helperPreprocessВспомогательная функция helperPreprocess использует максимальный номер образца для предварительной обработки данных. Номер выборки указывает длину сигнала, которая соответствует набору данных. Цикл for проходит через набор данных с фильтром длины сигнала для формирования наборов из 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
lstmLayer | sequenceInputLayer | trainingOptions | trainNetwork