Генерация кода для прогноза модели машинного обучения Используя приложение MATLAB Coder

В этом примере показано, как сгенерировать код C/C++ для прогноза классификации и объектов модели регрессии при помощи приложения MATLAB® Coder™. Можно также сгенерировать код в командной строке с помощью codegen. Смотрите Генерацию кода для Прогноза Модели Машинного обучения в Командной строке для деталей.

Определенная классификация и объекты модели регрессии имеют predict или random функция, которая поддерживает генерацию кода. Для списка объектов модели и объектных функций, которые поддерживают генерацию кода, смотрите Поддержку Генерации кода, Указания по применению и Ограничения. Прогноз с помощью этих объектных функций требует обученной классификации или объекта модели регрессии, но функция точки входа для генерации кода не может иметь этих объектов как входных переменных. Работа вокруг этого ограничения при помощи saveLearnerForCoder и loadLearnerForCoder как описано в этом примере.

Эта блок-схема показывает рабочий процесс генерации кода для объектных функций объектов модели регрессии и классификации.

В этом примере вы обучаете модель ансамбля классификации, использующую k-nearest-neighbor слабые ученики, и сохраняете обученную модель при помощи saveLearnerForCoder. Затем задайте функцию точки входа, которая загружает сохраненную модель при помощи loadLearnerForCoder и вызывает объектную функцию. Запишите скрипт, чтобы протестировать функцию точки входа. Наконец, сгенерируйте код при помощи приложения MATLAB Coder и проверьте сгенерированный код.

Обучите модель классификации

Загрузите ionosphere набор данных. Этот набор данных имеет 34 предиктора, и 351 бинарный ответ для радара возвращается, любой плохо ('b') или хороший ('g').

load ionosphere

Обучите модель ансамбля классификации с k-nearest-neighbor слабыми учениками при помощи случайного метода подпространства. Для получения дополнительной информации классификаций, которые используют случайный ансамбль подпространства, смотрите Случайную Классификацию Подпространств.

rng('default')  % For reproducibility
learner = templateKNN('NumNeighbors',2);
Mdl = fitcensemble(X,Y,'Method','Subspace','NPredToSample',5, ...
    'Learners',learner,'NumLearningCycles',13);

Сохраните модель Используя saveLearnerForCoder

Сохраните обученную модель ансамбля в файл с именем knnEnsemble.mat в вашей текущей папке.

saveLearnerForCoder(Mdl,'knnEnsemble')

saveLearnerForCoder делает полную модель Mdl классификации компактный, и затем сохраняет его в двоичный файл MATLAB knnEnsemble.mat как массив структур в текущей папке.

Задайте функцию точки входа

Функция точки входа, также известная как или первичную функцию верхнего уровня, является функцией, которую вы задаете для генерации кода. Необходимо задать функцию точки входа, которая вызывает включенные генерацией кода функции, и сгенерируйте код C/C++ от функции точки входа. Все функции в функции точки входа должны поддержать генерацию кода.

В новом файле в вашей текущей папке задайте функцию с именем точки входа myknnEnsemblePredict это делает следующее:

  • Примите входные данные (X), имя файла сохраненной модели (fileName), и допустимые аргументы пары "имя-значение" predict функция (varargin).

  • Загрузите обученную модель ансамбля при помощи loadLearnerForCoder.

  • Предскажите метки и соответствующие баллы из загруженной модели.

Можно допускать дополнительные аргументы значения имени путем определения varargin как входной параметр. Для получения дополнительной информации смотрите Генерацию кода для Списков аргументов Переменной длины (MATLAB Coder).

type myknnEnsemblePredict.m % Display the contents of myknnEnsemblePredict.m file. 
function [label,score] = myknnEnsemblePredict(X,fileName,varargin) %#codegen
CompactMdl = loadLearnerForCoder(fileName);
[label,score] = predict(CompactMdl,X,varargin{:});
end

Добавьте %#codegen директива компилятора (или прагма) к функции точки входа после функциональной подписи, чтобы указать, что вы намереваетесь сгенерировать код для алгоритма MATLAB. Добавление этой директивы дает Анализатору кода MATLAB команду помогать вам диагностировать и зафиксировать нарушения, которые привели бы к ошибкам во время генерации кода. Смотрите Контрольный код с Анализатором кода (MATLAB Coder).

Примечание: Если вы нажимаете кнопку, расположенную в верхнем правом разделе этой страницы, и открываете этот пример в MATLAB®, затем MATLAB® открывает папку в качестве примера. Эта папка включает файл функции точки входа (myknnEnsemblePredict.m) и тестовый файл (test_myknnEnsemblePredict.m, описанный позже).

Настройте компилятор

Чтобы сгенерировать код C/C++, у вас должен быть доступ к компилятору C/C++, который сконфигурирован правильно. MATLAB Coder определяет местоположение и использует поддерживаемый, установленный компилятор. Можно использовать mex -setup просмотреть и изменить компилятор по умолчанию. Для получения дополнительной информации см. Компилятор Значения по умолчанию Изменения (MATLAB).

Создайте тестовый файл

Запишите тестовый скрипт, который вызывает myknnEnsemblePredict функция. В тестовом скрипте задайте входные параметры и аргументы пары "имя-значение", что вы используете в сгенерированном коде. Вы используете этот тестовый скрипт для входных define типов автоматически при генерации кода с помощью приложения MATLAB Coder.

В этом примере создайте test_myknnEnsemblePredict.m файл в вашей текущей папке, как показано.

type test_myknnEnsemblePredict.m % Display the contents of test_myknnEnsemblePredict.m file. 
%% Load Sample data
load ionosphere

%% Test myknnEnsemblePredict
[label,score] = myknnEnsemblePredict(X,'knnEnsemble','Learners',1:13);

Для получения дополнительной информации смотрите Входные Automatically Define Типы при помощи Приложения (MATLAB Coder).

Сгенерируйте код Используя приложение MATLAB Coder

Приложение MATLAB Coder генерирует код C or C++ из кода MATLAB®. Основанный на рабочем процессе пользовательский интерфейс продвигается вы посредством процесса генерации кода. Следующие шаги описывают краткий рабочий процесс Приложения кода MATLAB. Для получения дополнительной информации смотрите MATLAB Coder и Сгенерируйте код С при помощи Приложения MATLAB Coder (MATLAB Coder).

1. Откройте приложение кода MATLAB и выберите Entry-Point Function File.

На вкладке Apps, в разделе Apps, нажимают Show больше стрелы, чтобы открыть галерею Apps. Под Генерацией кода нажмите MATLAB Coder. Приложение открывает страницу Select Source Files. Введите или выберите имя функции точки входа, myknnEnsemblePredict.

Нажмите Далее, чтобы перейти к странице Define Input Types.

2. Входные Define типы

Поскольку C использует статический контроль типов, MATLAB Coder должен определить свойства всех переменных в файлах MATLAB во время компиляции. Поэтому необходимо задать свойства входных параметров функции точки входа.

Введите или выберите тестовый скрипт test_myknnEnsemblePredict и нажмите Autodefine Input Types.

Приложение MATLAB Coder распознает входные типы myknnEnsemblePredict функция на основе тестового скрипта.

Измените входные типы:

  • X — Приложение выводит тот вход X double(351x34). Количество предикторов должно быть зафиксировано, чтобы совпасть с количеством предикторов в обученной модели. Однако у вас может быть различное количество наблюдений для прогноза. Если количество наблюдений неизвестно, изменение double(351x34) к double(:351x34) или double(:infx34). Установка double(:351x34) позволяет количество наблюдений до 351 и установка double(:infx34) позволяет неограниченное количество наблюдений. В этом примере задайте double(:infx34) путем нажатия на 351 и выбор :inf.

  • fileName — Нажмите char, выберите Define Constant и введите имя файла с одинарными кавычками, 'knnEnsemble'.

  • varargin{1} — Имена в аргументах пары "имя-значение" должны быть константами времени компиляции. Нажмите char, выберите Define Constant и введите 'Learners'.

  • varargin{2} — Чтобы разрешить пользовательским индексам до 13 слабых учеников в сгенерированном коде, измените double(1x13) к double(1x:13).

Нажмите Далее, чтобы перейти к странице Check for Run-Time Issues. Этот дополнительный шаг генерирует файл MEX, запускает MEX-функцию и сообщает о проблемах. Нажмите Далее, чтобы перейти к Сгенерировать Кодовой странице.

3. Сгенерируйте код С

Установите тип Сборки на MEX и нажмите Generate. Приложение генерирует MEX-функцию, myknnEnsemblePredict_mex. MEX-функция является программой C/C++, которая является исполняемым файлом из MATLAB. Можно использовать MEX-функцию, чтобы ускорить алгоритмы MATLAB и протестировать сгенерированный код на функциональность и проблемы во время выполнения. Для получения дополнительной информации смотрите Ускорение алгоритма MATLAB (MATLAB Coder) и Почему Тестовые MEX-функции в MATLAB? (MATLAB Coder).

В зависимости от заданного типа сборки MATLAB Coder генерирует MEX-функцию или автономный код C/C++, скомпилированный к статической библиотеке, динамически подключаемой библиотеке или исполняемому файлу. Для получения дополнительной информации при установке типа сборки, смотрите, Конфигурируют Настройки Сборки (MATLAB Coder).

Нажмите Далее, чтобы перейти к странице Finish Workflow.

4. Рассмотрите страницу рабочего процесса конца

Страница Finish Workflow указывает на ту генерацию кода, за которой следуют. Эта страница также предоставляет сводные данные проекта и ссылки на сгенерированный выход.

Сгенерируйте код Используя скрипт

Можно преобразовать проект MATLAB Coder в эквивалентный скрипт команд MATLAB после вас входные define типы. Затем вы запускаете скрипт, чтобы сгенерировать код. Для получения дополнительной информации смотрите, Преобразуют Проект MATLAB Coder в СКРИПТ MATLAB (MATLAB Coder).

На инструментальной панели приложений MATLAB Coder кликните по Открытой кнопке меню действия:

Выберите Convert к скрипту, и затем нажмите Save. Приложение создает файл myknnEnsemblePredict_script.m, который воспроизводит проект в объекте настройки и запускает codegen функция.

Отобразите содержимое файла myknnEnsemblePredict_script.m.

type myknnEnsemblePredict_script.m
% MYKNNENSEMBLEPREDICT_SCRIPT   Generate MEX-function myknnEnsemblePredict_mex
%  from myknnEnsemblePredict.
% 
% Script generated from project 'myknnEnsemblePredict.prj' on 17-Nov-2017.
% 
% See also CODER, CODER.CONFIG, CODER.TYPEOF, CODEGEN.

%% Create configuration object of class 'coder.MexCodeConfig'.
cfg = coder.config('mex');
cfg.GenerateReport = true;
cfg.ReportPotentialDifferences = false;

%% Define argument types for entry-point 'myknnEnsemblePredict'.
ARGS = cell(1,1);
ARGS{1} = cell(4,1);
ARGS{1}{1} = coder.typeof(0,[Inf  34],[1 0]);
ARGS{1}{2} = coder.Constant('knnEnsemble');
ARGS{1}{3} = coder.Constant('Learners');
ARGS{1}{4} = coder.typeof(0,[1 13],[0 1]);

%% Invoke MATLAB Coder.
codegen -config cfg myknnEnsemblePredict -args ARGS{1} -nargout 2

Запустите скрипт.

myknnEnsemblePredict_script
Code generation successful: To view the report, open('codegen/mex/myknnEnsemblePredict/html/report.mldatx').

Проверьте сгенерированный код

Протестируйте MEX-функцию, чтобы проверить, что сгенерированный код обеспечивает ту же функциональность как оригинальный код MATLAB. Чтобы выполнить этот тест, запустите MEX-функцию с помощью тех же входных параметров, что вы раньше запускали оригинальный код MATLAB, и затем сравнивали результаты. Выполнение MEX-функции в MATLAB прежде, чем сгенерировать автономный код также позволяет вам обнаружить и зафиксировать ошибки времени выполнения, которые намного более трудно диагностировать в сгенерированном автономном коде. Для получения дополнительной информации смотрите Почему Тестовые MEX-функции в MATLAB? (MATLAB Coder).

Передайте некоторые данные о предикторе, чтобы проверить тот myknnEnsemblePredict и MEX-функция возвращает те же результаты.

[label1,score1] = predict(Mdl,X,'Learners',1:10);
[label2,score2] = myknnEnsemblePredict(X,'knnEnsemble','Learners',1:10);
[label3,score3] = myknnEnsemblePredict_mex(X,'knnEnsemble','Learners',1:10);

Сравните label1, label2, и label3 при помощи isequal.

isequal(label1,label2,label3)
ans = logical
   1

isequal возвращает логическую единицу (true), что означает, что все входные параметры равны.

score3 выход от MEX-функции может включать различия в округлении по сравнению с выходом от predict функция. В этом случае сравните score1 и score3, разрешение маленького допуска.

find(abs(score1-score3) > 1e-12)
ans =

  0x1 empty double column vector

find возвращает пустой вектор если поэлементная абсолютная разность между score1 и score3 не больше, чем заданный допуск 1e-12. Сравнения подтверждают тот myknnEnsemblePredict и MEX-функция возвращает те же результаты.

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

| | |

Похожие темы