В этом примере показано, как сгенерировать код C/C++ для предсказания классификации и объектов модели регрессии при помощи приложения MATLAB® Coder™. Можно также сгенерировать код в командной строке с помощью codegen
(MATLAB Coder). Смотрите Генерацию кода для Предсказания Модели Машинного обучения в Командной строке для деталей.
Определенная классификация и объекты модели регрессии имеют 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
просмотреть и изменить компилятор по умолчанию. Для получения дополнительной информации см. Компилятор Значения по умолчанию Изменения.
Запишите тестовый скрипт, который вызывает 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 генерирует код C or C++ из кода MATLAB. Основанный на рабочем процессе пользовательский интерфейс продвигается вы посредством процесса генерации кода. Следующие шаги описывают краткий рабочий процесс Приложения MATLAB Coder. Для получения дополнительной информации смотрите MATLAB Coder (MATLAB Coder) и Сгенерируйте код С при помощи Приложения MATLAB Coder (MATLAB Coder).
1. Откройте приложение MATLAB Coder и выберите 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
(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
возвращает логическую единицу (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-функция возвращает те же результаты.
learnerCoderConfigurer
| loadLearnerForCoder
| saveLearnerForCoder
| codegen
(MATLAB Coder)