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

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

Сторонние необходимые условия

Этот пример поддерживается на 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 функция.

Сгенерируйте MEX

Чтобы сгенерировать код, создайте объект настройки кода для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig функция, чтобы создать объект настройки глубокого обучения MKL-DNN. Присвойте его DeepLearningConfig свойство объекта настройки кода.

cfg = coder.config('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('mkldnn');

Используйте coder.typeof (MATLAB Coder) функция, чтобы задать тип и размер входного параметра к функции точки входа. В этом примере вход имеет двойной тип данных со значением размерности признаков 1 и переменная длина последовательности.

matrixInput = coder.typeof(double(0),[1 Inf],[false true]);

Сгенерируйте MEX-функцию путем выполнения codegen (MATLAB Coder) команда.

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. Эта функция принимает вход, производит выходное предсказание и обновляет внутреннее состояние сети так, чтобы будущие предсказания приняли этот начальный вход во внимание.

Функция точки входа 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 

Смотрите также

(MATLAB Coder) | (Text Analytics Toolbox) | (MATLAB Coder) | (MATLAB Coder)

Похожие темы