exponenta event banner

Создание кода для сети LSTM, использующей Intel MKL-DNN

В этом примере показано, как создать код для предварительно обученной сети LSTM, использующей библиотеку Intel Math Kernel Library for Deep Neural Networks (MKL-DNN). Этот пример создает функцию MEX, которая делает прогнозы для каждого шага входных временных серий. Пример демонстрирует два подхода. Первый подход использует стандартную сеть LSTM. Второй подход использует поведение с учетом состояния той же сети LSTM. В этом примере используются текстовые описания заводских событий, которые можно разделить на одну из следующих четырех категорий: «Электронный сбой», «Утечка», «Механический сбой» и «Сбой программного обеспечения». В примере используется предварительно обученная сеть LSTM. Дополнительные сведения об обучении сети см. в разделе Классификация текстовых данных с помощью глубокого обучения (панель инструментов для анализа текста).

Предварительные условия для сторонних производителей

Этот пример поддерживается платформами 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

Чтобы создать код, создайте объект конфигурации кода для цели 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

Выполнить сгенерированный MEX

Звонить lstm_predict_mex о первом наблюдении.

YPred1 = lstm_predict_mex(XNew{1});

YPred1 содержит вероятности для четырех классов. Найдите прогнозируемый класс, рассчитав индекс максимальной вероятности.

[~, maxIndex] = max(YPred1);

Свяжите индексы максимальной вероятности с соответствующей меткой. Просмотрите классификацию. Из результатов видно, что сеть предсказала первое событие как утечку.

predictedLabels1 = labels(maxIndex);
disp(predictedLabels1)
     Leak 

Создание MEX, принимающего несколько наблюдений

Если требуется выполнить прогнозирование сразу для многих наблюдений, можно сгруппировать наблюдения в массив ячеек и передать массив ячеек для прогнозирования. Массив ячеек должен быть массивом ячеек столбцов, и каждая ячейка должна содержать одно наблюдение. Длина последовательности входных данных может изменяться. В этом примере: 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 

Создание MEX с помощью LSTM с учетом состояния

Вместо передачи всех временных рядов 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 

См. также

| | | (панель инструментов для анализа текста)

Связанные темы