Этот пример показывает, как использовать данные моделирования для обучения нейронной сети, которая может обнаружить сбои в химическом процессе. Сеть обнаруживает отказы в моделируемом процессе с высокой точностью. Типичный рабочий процесс следующий:
Предварительная обработка данных
Проектируйте архитектуру слоев
Обучите сеть
Выполните валидацию
Тестируйте сеть
Этот пример использует форматированные в 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
lstmLayer
| sequenceInputLayer
| trainingOptions
| trainNetwork