exponenta event banner

Укажите аргументы переменного размера для создания кода

В этом примере показано, как задать входные аргументы переменного размера при создании кода для объектных функций объектов модели классификации и регрессии. Данные переменного размера - это данные, размер которых может измениться во время выполнения. Задание входных аргументов переменного размера удобно при наличии данных неизвестного размера во время компиляции. В этом примере также описывается, как включить аргументы пары имя-значение в функцию точки входа и как указать их при создании кода.

Более подробные примеры создания кода см. в разделах Создание кода для прогнозирования модели машинного обучения в командной строке и Создание кода для прогнозирования модели машинного обучения с помощью приложения MATLAB Coder App.

Модель классификации поездов

Загрузите набор данных радужки Фишера. Преобразование меток в символьную матрицу.

load fisheriris
species = char(species);

Обучение дерева классификации с использованием всего набора данных.

Mdl = fitctree(meas,species);

Mdl является ClassificationTree модель.

Сохранить модель с помощью saveLearnerForCoder

Сохранение обученного дерева классификации в файл с именем ClassTreeIris.mat в текущей папке с помощью saveLearnerForCoder.

MdlName = 'ClassTreeIris';
saveLearnerForCoder(Mdl,MdlName);

Определение функции точки входа

В текущей папке определите функцию точки входа с именем mypredictTree.m это делает следующее:

  • Принять измерения со столбцами, соответствующими meas и принять допустимые аргументы пары имя-значение.

  • Загрузка обученного дерева классификации с помощью loadLearnerForCoder.

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

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

type mypredictTree.m  % Display contents of mypredictTree.m file
function [label,score,node,cnum] = mypredictTree(x,savedmdl,varargin) %#codegen
%MYPREDICTTREE Predict iris species using classification tree
%   MYPREDICTTREE predicts iris species for the n observations in the
%   n-by-4 matrix x using the classification tree stored in the MAT-file
%   whose name is in savedmdl, and then returns the predictions in the
%   array label. Each row of x contains the lengths and widths of the petal
%   and sepal of an iris (see the fisheriris data set). For other output
%   argument descriptions, see the predict reference page.
CompactMdl = loadLearnerForCoder(savedmdl);
[label,score,node,cnum] = predict(CompactMdl,x,varargin{:});
end

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

Создать код

Укажите аргументы переменного размера

Поскольку C и C++ являются статически типизированными языками, необходимо определить свойства всех переменных в функции точки входа во время компиляции с помощью -args вариант codegen.

Использовать coder.Constant (Кодер MATLAB) для задания ввода константы времени компиляции.

coder.Constant(v)

coder.Constant(v) создает coder.Constant переменная типа, значения которой являются постоянными, такая же, как v, при формировании кода.

Использовать coder.typeof (Кодер MATLAB) для задания входного значения переменного размера.

coder.typeof(example_value, size_vector, variable_dims)

Значения example_value, size_vector, и variable_dims укажите свойства входного массива, которые может принять созданный код.

  • Входной массив имеет тот же тип данных, что и значения примера в example_value.

  • size_vector - размер массива входного массива, если соответствующий variable_dims значение равно false.

  • size_vector - верхняя граница размера массива, если соответствующий variable_dims значение равно true.

  • variable_dims указывает, имеет ли каждое измерение массива переменный размер или фиксированный размер. Значение true (логический 1) означает, что соответствующее измерение имеет переменный размер; значение false (логический 0) означает, что соответствующее измерение имеет фиксированный размер.

Функция точки входа mypredictTree принимает данные предиктора, имя MAT-файла, содержащего обучаемый объект модели, и необязательные аргументы пары имя-значение. Предположим, что вы хотите создать код, который принимает массив переменного размера для данных предиктора и 'Subtrees' аргумент пары имя-значение с вектором переменного размера для его значения. Тогда у вас есть четыре входных аргумента: данные предиктора, имя MAT-файла, а также имя и значение 'Subtrees' аргумент пары имя-значение.

Определите массив ячеек 4 на 1 и назначьте каждой ячейке каждый тип входного аргумента функции точки входа.

ARGS = cell(4,1);

Для первого ввода используйте coder.typeof указать, что переменная данных предиктора имеет двойную точность с тем же количеством столбцов, что и данные предиктора, используемые при обучении модели, но что количество наблюдений (строк) является произвольным.

p = numel(Mdl.PredictorNames);
ARGS{1} = coder.typeof(0,[Inf,p],[1,0]);

0 для example_value значение подразумевает, что тип данных double потому что double - числовой тип данных MATLAB по умолчанию. [Inf,p] для size_vector значение и [1,0] для variable_dims значение подразумевает, что размер первого измерения является переменным и неограниченным, а размер второго измерения фиксирован p.

Вторым вводом является имя MAT-файла, которое должно быть константой времени компиляции. Использовать coder.Constant для указания типа второго ввода.

ARGS{2} = coder.Constant(MdlName);

Последние два входа являются именем и значением 'Subtrees' аргумент пары имя-значение. Имена аргументов пары имя-значение должны быть константами времени компиляции.

ARGS{3} = coder.Constant('Subtrees');

Использовать coder.typeof чтобы указать, что значение 'Subtrees' является вектором строки с двойной точностью и что верхняя граница размера вектора строки равна max(Mdl.PrunedList).

m = max(Mdl.PruneList);
ARGS{4} = coder.typeof(0,[1,m],[0,1]);

Опять же, 0 для example_value значение подразумевает, что тип данных double потому что double - числовой тип данных MATLAB по умолчанию. [1,m] для size_vector значение и [0,1] для variable_dims значение подразумевает, что размер первого размера является фиксированным 1и размер второго размера является переменным, а его верхняя граница - m.

Создать код с помощью codegen

Создание функции MEX из функции точки входа mypredictTree использование массива ячеек ARGS, который включает входные типы аргументов для mypredictTree. Укажите типы входных аргументов с помощью -args вариант. Укажите количество выходных аргументов в созданной функции точки входа с помощью -nargout вариант. Генерируемый код включает указанное количество выходных аргументов в порядке их появления в определении функции точки входа.

codegen mypredictTree -args ARGS -nargout 2
Code generation successful.

codegen генерирует функцию MEX mypredictTree_mex с зависящим от платформы расширением в текущей папке.

predict функция принимает значения одинарной точности, значения двойной точности и 'all' для 'SubTrees' аргумент пары имя-значение. Однако при использовании функции MEX для прогнозирования можно указать только значения двойной точности, поскольку тип данных указан в ARGS{4} является двойным.

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

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

rng('default'); % For reproducibility
Xnew = datasample(meas,15);
[labelMEX,scoreMEX] = mypredictTree_mex(Xnew,MdlName,'Subtrees',1);
[labelPREDICT,scorePREDICT] = predict(Mdl,Xnew,'Subtrees',1);
labelPREDICT
labelPREDICT = 15x10 char array
    'virginica '
    'virginica '
    'setosa    '
    'virginica '
    'versicolor'
    'setosa    '
    'setosa    '
    'versicolor'
    'virginica '
    'virginica '
    'setosa    '
    'virginica '
    'virginica '
    'versicolor'
    'virginica '

labelMEX
labelMEX = 15x1 cell
    {'virginica' }
    {'virginica' }
    {'setosa'    }
    {'virginica' }
    {'versicolor'}
    {'setosa'    }
    {'setosa'    }
    {'versicolor'}
    {'virginica' }
    {'virginica' }
    {'setosa'    }
    {'virginica' }
    {'virginica' }
    {'versicolor'}
    {'virginica' }

Прогнозируемые метки совпадают с метками функции MEX, за исключением типа данных. Если тип данных ответа - char и codegen не может определить, что значение Subtrees является скаляром, то выход из сгенерированного кода является массивом ячеек символьных векторов.

Для сравнения можно преобразовать labelsPREDICT к массиву ячеек и использовать isequal.

cell_labelPREDICT = cellstr(labelPREDICT);
verifyLabel = isequal(labelMEX,cell_labelPREDICT)
verifyLabel = logical
   1

isequal возвращает логический 1 (true), что означает, что все входы равны.

Сравните и вторые выходы. scoreMex может включать разницы округления по сравнению с scorePREDICT. В этом случае сравните scoreMEX и scorePREDICT, допуская небольшой допуск.

find(abs(scorePREDICT-scoreMEX) > 1e-8)
ans =

  0x1 empty double column vector

find возвращает пустой вектор, если абсолютная разница между элементами scorePREDICT и scoreMEX не превышает указанного допуска 1e-8. Сравнение подтверждает, что scorePREDICT и scoreMEX равны в пределах допуска 1e–8.

См. также

| | | (Кодер MATLAB) | (Кодер MATLAB) | (Кодер MATLAB)

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