В этом примере показано, как использовать данные моделирования, чтобы обучить нейронную сеть, которая может обнаружить отказы в химическом процессе. Сеть обнаруживает отказы в симулированном процессе с высокой точностью. Типичный рабочий процесс следующие:
Предварительно обработайте данные
Спроектируйте архитектуру слоя
Обучите сеть
Выполните валидацию
Протестируйте сеть
Этот пример использует отформатированные MATLAB файлы, преобразованные MathWorks® от данных моделирования Процесса Теннесси Истмэна (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 процентов обучающих данных для валидации. Используя валидацию набор данных позволяет вам оценить подгонку модели на обучающем наборе данных, в то время как вы настраиваете гиперпараметры модели. Разделение данных обычно используется, чтобы препятствовать тому, чтобы сеть сверхсоответствовала и underfitting.
Получите общее количество строк и в дефектных и в безотказных обучающих наборах данных.
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 переменных, значения которых зарегистрированы по определенному количеству времени в симуляции. 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 безотказных симуляций, сопровождаемых 6 800 дефектными симуляциями. Визуализируйте безотказные и дефектные данные. Во-первых, создайте график безотказных данных. В целях этого примера, графика и метки только 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' as
'auto'
. С этой установкой программное обеспечение выбирает среду выполнения автоматически. Если графический процессор доступен (требует Parallel Computing Toolbox™, и CUDA® включил графический процессор с, вычисляют возможность 3.0 или выше), программное обеспечение использует графический процессор. В противном случае программное обеспечение использует центральный процессор. Поскольку этот пример использует большой объем данных, использование графического процессора значительно ускоряет учебное время.
Установка пары аргумента значения имени '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. Б. Д. Амсель, Р. Трэн., и Б. Майя. "Дополнительные данные моделирования процесса Теннесси Истмэна для оценки обнаружения аномалии". Гарвард 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
| trainNetwork
| trainingOptions