В этом примере показано, как сгенерировать код для предварительно обученной сети долгой краткосрочной памяти (LSTM), которая использует библиотеку Intel Math Kernel Library for Глубокие Нейронные Сети (MKL-DNN). Этот пример генерирует MEX-функцию, которая делает предсказания для каждого шага входного timeseries. Пример демонстрирует два подхода. Первый подход использует стандартную сеть LSTM. Второй подход использует поведение той же сети LSTM с учетом состояний. Этот пример использует текстовые описания заводских событий, которые можно классифицировать в одну из следующих четырех категорий: Электронный отказ, Утечка, Механический отказ и Программный отказ. В примере используется предварительно обученная сеть LSTM. Для получения дополнительной информации о обучении сети смотрите раздел «Классификация текстовых данных с помощью глубокого обучения» (Symbolic Math Toolbox).
Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN)
Список процессоров, поддерживающих библиотеку MKL-DNN, см. в разделе Поддержка Центральном Процессоре MKLDNN
Для получения дополнительной информации о поддерживаемых версиях компиляторов и библиотек смотрите Необходимые условия для глубокого обучения с MATLAB Coder
Этот пример поддерживается на платформах Mac ®, Linux ® и Windows ® и не поддерживается для MATLAB Online.
Загрузите wordEncoding
MAT-файл. Этот MAT-файл хранит слова, закодированные как числовые индексы. Эта кодировка была выполнена во время обучения сети. Для получения дополнительной информации смотрите Классификация текстовых данных с использованием глубокого обучения (Symbolic Math Toolbox).
load("wordEncoding.mat");
Создайте строковые массивы, содержащий новые отчеты, для классификации типа события.
reportsNew = [ ... "Coolant is pooling underneath sorter." "Sorter blows fuses at start up." "There are some very loud rattling sounds coming from the assembler." "At times mechanical arrangement software freezes." "Mixer output is stuck."];
Токенизируйте вход строку при помощи preprocessText
функция.
documentsNew = preprocessText(reportsNew);
Используйте doc2sequence
(Symbolic Math Toolbox) для преобразования документов в последовательности.
XNew = doc2sequence(enc,documentsNew); labels = categorical({'Electronic Failure', 'Leak', 'Mechanical Failure', 'Software Failure'});
lstm_predict
Функция точки входаСеть LSTM от последовательности к последовательности позволяет вам делать различные предсказания для каждого отдельного временного шага последовательности данных. The lstm_predict.m
функция точки входа принимает входную последовательность и передает ее в обученную сеть LSTM для предсказания. В частности, функция использует сеть LSTM, которая обучена в примере Classify Text Data Using Deep Learning (Symbolic Math Toolbox). Функция загружает сетевой объект из textClassifierNetwork.mat
файл в постоянную переменную и затем выполняет предсказание. При последующих вызовах функция повторно использует постоянный объект.
type('lstm_predict.m')
function out = lstm_predict(in) %#codegen % Copyright 2020 The MathWorks, Inc. persistent mynet; if isempty(mynet) mynet = coder.loadDeepLearningNetwork('textClassifierNetwork.mat'); end out = predict(mynet, in); end
Чтобы отобразить интерактивную визуализацию сетевой архитектуры и информацию о слоях сети, используйте analyzeNetwork
(Deep Learning Toolbox) функция.
Чтобы сгенерировать код, создайте объект строения кода для цели MEX и установите целевой язык на C++. Используйте coder.DeepLearningConfig
функция для создания объекта строения глубокого обучения MKL-DNN. Присвойте его DeepLearningConfig
свойство объекта строения кода.
cfg = coder.config('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('mkldnn');
Используйте coder.typeof
функция для определения типа и размера входного параметра для функции точки входа. В этом примере вход имеет двойной тип данных со значением размерности признаков 1 и длину переменной последовательности.
matrixInput = coder.typeof(double(0),[1 Inf],[false true]);
Сгенерируйте MEX-функцию путем запуска codegen
команда.
codegen -config cfg lstm_predict -args {matrixInput} -report
Code generation successful: View report
Функции lstm_predict_mex
по первому наблюдению.
YPred1 = lstm_predict_mex(XNew{1});
YPred1
содержит вероятности для четырех классов. Найдите предсказанный класс путем вычисления индекса максимальной вероятности.
[~, maxIndex] = max(YPred1);
Связать индексы максимальной вероятности с соответствующей меткой. Отобразите классификацию. Из результатов видно, что в сети предсказали первым событием Утечку.
predictedLabels1 = labels(maxIndex); disp(predictedLabels1)
Leak
Если вы хотите выполнить предсказание сразу для многих наблюдений, можно сгруппировать наблюдения вместе в массиве ячеек и передать массив ячеек для предсказания. Массив ячеек должен быть столбцом массивом ячеек, и каждая камера должен содержать одно наблюдение. Длины последовательности входов могут варьироваться. В этом примере XNew
содержит пять наблюдений. Чтобы сгенерировать MEX-функцию, которая может принимать XNew
в качестве входных параметров задайте входной тип массива ячеек 5 на 1. Задайте, чтобы каждая камера была того же типа, что и matrixInput
.
matrixInput = coder.typeof(double(0),[1 Inf],[false true]); cellInput = coder.typeof({matrixInput}, [5 1]); codegen -config cfg lstm_predict -args {cellInput} -report
Code generation successful: View report
Запустите сгенерированную MEX-функцию с XNew
как вход.
YPred2 = lstm_predict_mex(XNew);
YPred2
- массив ячеек 5 на 4. Найдите индексы, которые имеют максимальную вероятность для каждого из пяти входов, и классифицируйте их.
[~, maxIndex] = max(YPred2, [], 2); predictedLabels2 = labels(maxIndex); disp(predictedLabels2)
Leak Mechanical Failure Mechanical Failure Software Failure Electronic Failure
Вместо того, чтобы передавать все timeseries в predict
за один шаг можно запустить предсказание на входе путем потоковой передачи в один временной интервал за раз и с помощью функции predictAndUpdateState
(Deep Learning Toolbox). Эта функция принимает вход, создает выход предсказание и обновляет внутреннее состояние сети, так что будущие предсказания учитывают этот начальный вход.
Функция точки входа lstm_predict_and_update.m
принимает однократный вход и обрабатывает вход с помощью predictAndUpdateState
функция. The predictAndUpdateState
функция возвращает предсказание для входного временного интервала и обновляет сеть так, чтобы последующие входы рассматривались как последующие временные интервалы той же выборки. После прохождения во всех временных шагах, по одному, результат выхода идентичен случаю, когда все временные интервалы были переданы как один вход.
type('lstm_predict_and_update.m')
function out = lstm_predict_and_update(in) %#codegen % Copyright 2020 The MathWorks, Inc. persistent mynet; if isempty(mynet) mynet = coder.loadDeepLearningNetwork('textClassifierNetwork.mat'); end [mynet, out] = predictAndUpdateState(mynet,in); end
Сгенерируйте код для lstm_predict_and_update
. Поскольку эта функция принимает один временной интервал при каждом вызове, задайте matrixInput
иметь фиксированную размерность последовательности 1 вместо переменной длины последовательности.
matrixInput = coder.typeof(double(0),[1 1]); codegen -config cfg lstm_predict_and_update -args {matrixInput} -report
Code generation successful: View report
Запустите сгенерированный MEX при первом наблюдении.
sequenceLength = size(XNew{1},2); for i=1:sequenceLength inTimeStep = XNew{1}(:,i); YPred3 = lstm_predict_and_update_mex(inTimeStep); end clear mex;
Найдите индекс, который имеет самую высокую вероятность и сопоставьте его с метками.
[~, maxIndex] = max(YPred3); predictedLabels3 = labels(maxIndex); disp(predictedLabels3)
Leak
codegen
| coder.DeepLearningConfig
| coder.typeof
| doc2sequence
(Symbolic Math Toolbox)