В этом примере показано, как сгенерировать код для предварительно обученной сети долгой краткосрочной памяти (LSTM), которая использует Math Kernel Library Intel для Глубоких нейронных сетей (MKL-DNN).This, пример генерирует MEX-функцию, которая делает предсказания для каждого шага входа timeseries. Пример демонстрирует два подхода. Первый подход использует стандартную сеть LSTM. Второй подход усиливает поведение с сохранением информации той же сети LSTM. Этот пример использует текстовые описания событий фабрики, которые могут быть классифицированы в одну из этих четырех категорий: Электронный Отказ, Утечка, Механическое повреждение и Программная ошибка. Пример использует предварительно обученную сеть LSTM. Для получения дополнительной информации об обучении сети смотрите, что Классифицировать текстовые Данные Используют Глубокое обучение (Text Analytics Toolbox).
Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN)
Для списка процессоров, которые поддерживают библиотеку MKL-DNN, см. Поддержку центрального процессора MKLDNN
Для получения дополнительной информации о поддерживаемых версиях компиляторов и библиотек, смотрите Необходимые условия для Глубокого обучения для MATLAB Coder
Этот пример поддерживается на Mac®, Linux® и платформах Windows® и не поддерживаемый для MATLAB Online.
Загрузите wordEncoding
Matfile. Этот MAT-файл хранит слова, закодированные как числовые индексы. Это кодирование выполнялось во время обучения сети. Для получения дополнительной информации смотрите, Классифицируют текстовые Данные Используя Глубокое обучение (Text Analytics 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
(Text Analytics Toolbox) функция, чтобы преобразовать документы последовательностям.
XNew = doc2sequence(enc,documentsNew); labels = categorical({'Electronic Failure', 'Leak', 'Mechanical Failure', 'Software Failure'});
lstm_predict
Функция точки входаСеть LSTM от последовательности к последовательности позволяет вам сделать различные предсказания для каждого отдельного временного шага последовательности данных. lstm_predict.m
функция точки входа берет входную последовательность и передает ее обученной сети LSTM для предсказания. А именно, функция использует сеть LSTM, которая обучена в примере, Классифицируют текстовые Данные Используя Глубокое обучение (Text Analytics 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
функция. 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
(Text Analytics Toolbox)