В этом примере показано, как создать код для предварительно обученной сети LSTM, использующей библиотеку Intel Math Kernel Library for Deep Neural Networks (MKL-DNN). Этот пример создает функцию MEX, которая делает прогнозы для каждого шага входных временных серий. Пример демонстрирует два подхода. Первый подход использует стандартную сеть LSTM. Второй подход использует поведение с учетом состояния той же сети LSTM. В этом примере используются текстовые описания заводских событий, которые можно разделить на одну из следующих четырех категорий: «Электронный сбой», «Утечка», «Механический сбой» и «Сбой программного обеспечения». В примере используется предварительно обученная сеть LSTM. Дополнительные сведения об обучении сети см. в разделе Классификация текстовых данных с помощью глубокого обучения (панель инструментов для анализа текста).
Библиотека Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN)
Список процессоров, поддерживающих библиотеку MKL-DNN, см. в разделе Поддержка ЦП MKLDNN
Дополнительные сведения о поддерживаемых версиях компиляторов и библиотек см. в разделе Предварительные условия для глубокого обучения с помощью кодера MATLAB
Этот пример поддерживается платформами Mac ®, Linux ® и Windows ® и не поддерживается MATLAB Online.
Загрузить wordEncoding MAT-файл. Этот MAT-файл хранит слова, закодированные как числовые индексы. Это кодирование выполнялось во время обучения сети. Дополнительные сведения см. в разделе Классификация текстовых данных с помощью глубокого обучения (панель инструментов для анализа текста).
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Функция (Панель инструментов анализа текста) для преобразования документов в последовательности.
XNew = doc2sequence(enc,documentsNew);
labels = categorical({'Electronic Failure', 'Leak', 'Mechanical Failure', 'Software Failure'});lstm_predict Функция точки входаСеть LSTM «последовательность-последовательность» позволяет делать различные прогнозы для каждого отдельного временного шага последовательности данных. lstm_predict.m функция начальной точки принимает входную последовательность и передает ее в обученную сеть LSTM для прогнозирования. В частности, функция использует сеть LSTM, обученную в примере Классификация текстовых данных с использованием глубокого обучения (панель инструментов для анализа текста). Функция загружает сетевой объект из 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} -reportCode 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
Вместо передачи всех временных рядов predict за один шаг можно выполнить прогнозирование на входе путем потоковой передачи в один временной интервал за один раз и с помощью функции predictAndUpdateState (инструментарий глубокого обучения). Эта функция принимает входные данные, производит прогнозирование выходных данных и обновляет внутреннее состояние сети так, чтобы будущие прогнозы учитывали эти исходные данные.
Функция точки входа 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 (панель инструментов для анализа текста)