exponenta event banner

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

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

Некоторые объекты модели классификации и регрессии имеют 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.

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

Можно разрешить необязательные аргументы «имя-значение», указав varargin в качестве входного аргумента. Дополнительные сведения см. в разделе Создание кода для списков аргументов переменной длины (кодер MATLAB).

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).

Примечание.Если нажать кнопку, расположенную в правом верхнем разделе этой страницы, и открыть этот пример в 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).

Создание кода с помощью приложения кодера MATLAB

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

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

На вкладке Приложения в разделе Приложения щелкните стрелку Показать дополнительные, чтобы открыть галерею приложений. В разделе Создание кода (Code Generation) щелкните Кодер MATLAB (MATLAB Coder). Приложение открывает страницу Выбор исходных файлов. Введите или выберите имя функции точки входа, myknnEnsemblePredict.

Щелкните Далее (Next), чтобы перейти на страницу Определение типов ввода (Define Input Types).

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

Поскольку C использует статическую типизацию, кодер MATLAB должен определять свойства всех переменных в файлах 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выберите «Определить константу» и введите имя файла с одиночными кавычками. 'knnEnsemble'.

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

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

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

3. Создать код C

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

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

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

4. Просмотр страницы «Завершение рабочего процесса»

Страница «Завершение рабочего процесса» показывает, что создание кода выполнено успешно. На этой странице также представлены сводка проекта и ссылки на сгенерированные выходные данные.

Создать код с помощью сценария

Проект кодера MATLAB можно преобразовать в эквивалентный сценарий команд MATLAB после определения типов ввода. Затем выполняется сценарий для создания кода. Дополнительные сведения см. в разделе Преобразование проекта кодера MATLAB в сценарий MATLAB (MATLAB Coder).

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

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

Отображение содержимого файла 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).

Передайте некоторые данные предиктора, чтобы проверить, что 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), что означает, что все входы равны.

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)

Связанные темы