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

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

Необходимые условия для третьих лиц

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

The 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

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

Вместо того, чтобы передавать все 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 

См. также

| | | (Symbolic Math Toolbox)

Похожие темы