В этом примере показано, как предсказать остающийся срок полезного использования (RUL) механизмов при помощи глубокого обучения.
Чтобы обучить глубокую нейронную сеть предсказывать числовые значения от временных рядов или данных о последовательности, можно использовать сеть долгой краткосрочной памяти (LSTM).
Этот пример использует Турбовентиляторный Набор Данных моделирования Ухудшения Engine как описано в [1]. Пример обучает сеть LSTM, чтобы предсказать остающийся срок полезного использования механизма (прогнозирующее обслуживание), измеренный в циклах, учитывая данные временных рядов, представляющие различные датчики в механизме. Обучающие данные содержат симулированные данные временных рядов для 100 механизмов. Каждая последовательность варьируется по длине и соответствует полному экземпляру запуска к отказу (RTF). Тестовые данные содержат 100 частичных последовательностей и соответствующие значения остающегося срока полезного использования в конце каждой последовательности.
Набор данных содержит 100 учебных наблюдений и 100 тестовых наблюдений.
Загрузите и разархивируйте Турбовентиляторный Набор Данных моделирования Ухудшения Engine от https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/[2].
Каждые временные ряды Турбовентиляторного набора Данных моделирования Ухудшения Engine представляют различный механизм. Каждый механизм запускается с неизвестных степеней начального износа и производственного изменения. Механизм действует обычно в начале каждых временных рядов и разрабатывает отказ в какой-то момент во время ряда. В наборе обучающих данных отказ растет в величине до системного отказа.
Данные содержат сжатые до ZIP текстовые файлы с 26 столбцами чисел, разделенных пробелами. Каждая строка является снимком состояния данных, взятых во время одного рабочего цикла, и каждый столбец является различной переменной. Столбцы соответствуют следующему:
Столбец 1 – Модульный номер
Столбец 2 – Время в циклах
Настройки Columns 3-5 - Operational
Столбцы 6-26 – измерения Датчика 1–21
Создайте директорию, чтобы сохранить Турбовентиляторный набор Данных моделирования Ухудшения Engine.
dataFolder = fullfile(tempdir,"turbofan"); if ~exist(dataFolder,'dir') mkdir(dataFolder); end
Загрузите и извлеките Турбовентиляторный Набор Данных моделирования Ухудшения Engine из https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/.
Разархивируйте данные из файла CMAPSSData.zip
.
filename = "CMAPSSData.zip";
unzip(filename,dataFolder)
Загрузите данные с помощью функционального processTurboFanDataTrain
присоединенный к этому примеру. Функциональный processTurboFanDataTrain
извлекает данные из filenamePredictors
и возвращает массивы ячеек XTrain
и YTrain
, которые содержат учебный предиктор и последовательности ответа.
filenamePredictors = fullfile(dataFolder,"train_FD001.txt");
[XTrain,YTrain] = processTurboFanDataTrain(filenamePredictors);
Удалите функции с постоянными значениями
Функции, которые остаются постоянными навсегда, продвигаются, может негативно повлиять на обучение. Найдите строки данных, которые имеют те же минимальные и максимальные значения и удаляют строки.
m = min([XTrain{:}],[],2); M = max([XTrain{:}],[],2); idxConstant = M == m; for i = 1:numel(XTrain) XTrain{i}(idxConstant,:) = []; end
Просмотрите количество остающихся функций в последовательностях.
numFeatures = size(XTrain{1},1)
numFeatures = 17
Нормируйте учебные предикторы
Нормируйте учебные предикторы, чтобы иметь нулевое среднее значение и модульное отклонение. Чтобы вычислить среднее и стандартное отклонение по всем наблюдениям, конкатенируйте данные о последовательности горизонтально.
mu = mean([XTrain{:}],2); sig = std([XTrain{:}],0,2); for i = 1:numel(XTrain) XTrain{i} = (XTrain{i} - mu) ./ sig; end
Отсеките ответы
Чтобы узнать больше из данных о последовательности, когда механизмы будут близко к сбою, отсеките ответы в пороге 150. Это делает сетевые экземпляры обработки с выше значениями RUL как равные.
thr = 150; for i = 1:numel(YTrain) YTrain{i}(YTrain{i} > thr) = thr; end
Этот рисунок показывает первое наблюдение и соответствующий отсеченный ответ.
Подготовка данных для дополнения
Чтобы минимизировать объем дополнения добавленного к мини-пакетам, отсортируйте обучающие данные по длине последовательности. Затем выберите мини-пакетный размер, который делит обучающие данные равномерно и уменьшает объем дополнения в мини-пакетах.
Сортировка обучающих данных длиной последовательности.
for i=1:numel(XTrain) sequence = XTrain{i}; sequenceLengths(i) = size(sequence,2); end [sequenceLengths,idx] = sort(sequenceLengths,'descend'); XTrain = XTrain(idx); YTrain = YTrain(idx);
Просмотрите отсортированные длины последовательности в столбчатой диаграмме.
figure bar(sequenceLengths) xlabel("Sequence") ylabel("Length") title("Sorted Data")
Выберите мини-пакетный размер, который делит обучающие данные равномерно и уменьшает объем дополнения в мини-пакетах. Задайте мини-пакетный размер 20. Этот рисунок иллюстрирует дополнение, добавленное к неотсортированным и отсортированным последовательностям.
miniBatchSize = 20;
Определить сетевую архитектуру. Создайте сеть LSTM, которая состоит из слоя LSTM с 200 скрытыми модулями, сопровождаемыми полносвязным слоем размера 50 и слоя уволенного с вероятностью уволенного 0.5.
numResponses = size(YTrain{1},1); numHiddenUnits = 200; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','sequence') fullyConnectedLayer(50) dropoutLayer(0.5) fullyConnectedLayer(numResponses) regressionLayer];
Задайте опции обучения. Обучите в течение 60 эпох с мини-пакетами размера 20 использований решателя 'adam'
. Задайте скорость обучения 0.01. Чтобы препятствовать тому, чтобы градиенты взорвались, установите порог градиента к 1. Чтобы сохранить последовательности отсортированными по длине, установите 'Shuffle'
к 'never'
.
maxEpochs = 60; miniBatchSize = 20; options = trainingOptions('adam', ... 'MaxEpochs',maxEpochs, ... 'MiniBatchSize',miniBatchSize, ... 'InitialLearnRate',0.01, ... 'GradientThreshold',1, ... 'Shuffle','never', ... 'Plots','training-progress',... 'Verbose',0);
Обучите сеть с помощью trainNetwork
.
net = trainNetwork(XTrain,YTrain,layers,options);
Подготовьте тестовые данные с помощью функционального processTurboFanDataTest
присоединенный к этому примеру. Функциональный processTurboFanDataTest
извлекает данные из filenamePredictors
и filenameResponses
и возвращает массивы ячеек XTest
и YTest
, которые содержат тестовый предиктор и последовательности ответа, соответственно.
filenamePredictors = fullfile(dataFolder,"test_FD001.txt"); filenameResponses = fullfile(dataFolder,"RUL_FD001.txt"); [XTest,YTest] = processTurboFanDataTest(filenamePredictors,filenameResponses);
Удалите функции с постоянными значениями с помощью idxConstant
вычисленный от обучающих данных. Нормируйте тестовые предикторы с помощью тех же параметров в качестве в обучающих данных. Отсеките тестовые ответы в том же пороге, используемом для обучающих данных.
for i = 1:numel(XTest) XTest{i}(idxConstant,:) = []; XTest{i} = (XTest{i} - mu) ./ sig; YTest{i}(YTest{i} > thr) = thr; end
Сделайте предсказания на тестовых данных с помощью predict
. Чтобы препятствовать тому, чтобы функция добавила дополнение в данные, задайте мини-пакетный размер 1.
YPred = predict(net,XTest,'MiniBatchSize',1);
Сеть LSTM делает предсказания на частичной последовательности одним временным шагом за один раз. На каждом временном шаге сеть предсказывает использование значения на этом временном шаге и сетевого состояния, вычисленного от предыдущих временных шагов только. Сеть обновляет свое состояние между каждым предсказанием. predict
функция возвращает последовательность этих предсказаний. Последний элемент предсказания соответствует предсказанному RUL для частичной последовательности.
В качестве альтернативы можно сделать предсказания одним временным шагом за один раз при помощи predictAndUpdateState
. Это полезно, когда у вас есть значения временных шагов, прибывающих в поток. Обычно, это быстрее, чтобы сделать предсказания на полных последовательностях когда по сравнению с созданием предсказаний один временной шаг за один раз. Для примера, показывающего, как предсказать будущие временные шаги путем обновления сети между одним предсказаниями временного шага, смотрите, что Временные ряды Предсказывают Используя Глубокое обучение.
Визуализируйте некоторые предсказания в графике.
idx = randperm(numel(YPred),4); figure for i = 1:numel(idx) subplot(2,2,i) plot(YTest{idx(i)},'--') hold on plot(YPred{idx(i)},'.-') hold off ylim([0 thr + 25]) title("Test Observation " + idx(i)) xlabel("Time Step") ylabel("RUL") end legend(["Test Data" "Predicted"],'Location','southeast')
Для данной частичной последовательности предсказанный текущий RUL является последним элементом предсказанных последовательностей. Вычислите среднеквадратичную ошибку (RMSE) предсказаний и визуализируйте ошибку предсказания в гистограмме.
for i = 1:numel(YTest) YTestLast(i) = YTest{i}(end); YPredLast(i) = YPred{i}(end); end figure rmse = sqrt(mean((YPredLast - YTestLast).^2)) histogram(YPredLast - YTestLast) title("RMSE = " + rmse) ylabel("Frequency") xlabel("Error")
Saxena, Abhinav, Кай Гоебель, Дон Саймон и Нил Экланд. "Повредите моделирование распространения для симуляции запуска к отказу авиационного двигателя". В Предзнаменованиях и медицинском управлении, 2008. PHM 2008. Международная конференция по вопросам, стр 1-9. IEEE, 2008.
Saxena, Abhinav, Кай Гоебель. "Турбовентиляторный Набор Данных моделирования Ухудшения Engine". НАСА Репозиторий данных Предзнаменований Эймса https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/, Исследовательский центр Эймса, Поле Moffett, CA
trainNetwork
| trainingOptions
| lstmLayer
| sequenceInputLayer
| predictAndUpdateState