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

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

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

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

В этом примере вы обучаете модель ансамбля классификации, использующую k-nearest-neighbor слабые ученики, и сохраняете обученную модель при помощи saveCompactModel. Затем задайте функцию точки входа, которая загружает сохраненную модель при помощи loadCompactModel и вызывает объектную функцию. Запишите скрипт, чтобы протестировать функцию точки входа. Наконец, сгенерируйте код при помощи приложения 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);

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

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

saveCompactModel(Mdl,'knnEnsemble')

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

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

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

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

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

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

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

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

type myknnEnsemblePredict.m % Display the contents of myknnEnsemblePredict.m file. 
function [label,score] = myknnEnsemblePredict(X,fileName,varargin) %#codegen
CompactMdl = loadCompactModel(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 или Код С++ из кода MATLAB®. Основанный на рабочем процессе пользовательский интерфейс продвигается вы посредством процесса генерации кода. Следующие шаги описывают краткий рабочий процесс Приложения кода MATLAB. Для получения дополнительной информации смотрите MATLAB Coder и Сгенерируйте код С при помощи Приложения MATLAB Coder (MATLAB Coder).

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

На вкладке Apps, в разделе Apps, нажимают Show больше стрелки, чтобы открыть галерею приложений. Под Генерацией кода нажмите 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-функция возвращают те же результаты.

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

| | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте