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

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

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

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

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

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

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

load ionosphere

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

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.

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

Можно разрешить использование необязательных аргументов имя-значение путем определения вараргина в качестве входного параметра. Для получения дополнительной информации смотрите Генерацию кода для списков аргументов переменной длины (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 помочь вам диагностировать и исправить нарушения, которые могут привести к ошибкам во время генерации кода. Смотрите проверку кода with the Анализатор Кода (MATLAB Coder).

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

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

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

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

Написание тестового скрипта, который вызывает myknnEnsemblePredict функция. В тестовом скрипте задайте входные параметры и аргументы пары "имя-значение", которые вы используете в сгенерированном коде. Этот тестовый скрипт используется для автоматического определения входных типов при генерации кода с помощью приложения 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);

Для получения дополнительной информации смотрите Автоматическое определение входных типов при помощи приложения (MATLAB Coder).

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

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

1. Откройте приложение MATLAB Coder и Выберите файл функции точки входа.

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

Нажмите кнопку Далее, чтобы перейти на страницу Задать входные типы.

2. Определите входные типы

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

Введите или выберите тестовый скрипт test_myknnEnsemblePredict и нажмите «Автоопределить входные типы».

Приложение 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).

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

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

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

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

Нажмите кнопку Далее, чтобы перейти на страницу Готово рабочего процесса.

4. Проверьте страницу рабочего процесса конец

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

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

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

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

Выберите «Преобразовать в скрипт» и нажмите кнопку «Сохранить». Приложение создает файл myknnEnsemblePredict_script.m, который воспроизводит проект в объекте строения и запускает codegen (MATLAB Coder) функция.

Отобразите содержимое файла 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 возвращает логический 1 (true), что означает, что все входы равны.

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

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

  0x1 empty double column vector

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

См. также

| | | (MATLAB CODER)

Похожие темы

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