generateCode

Сгенерируйте код C/C + + с помощью конфигуратора кодера

Описание

После обучения модели машинного обучения создайте конфигуратор кодера для модели при помощи learnerCoderConfigurer. Измените свойства конфигуратора, чтобы задать опции генерации кода. Затем используйте generateCode чтобы сгенерировать код C/C + + для predict и update функции модели машинного обучения. Для генерации кода C/C + + требуется MATLAB® Coder™.

Этот график потока показывает рабочий процесс генерации кода с помощью конфигуратора кодера. Использовать generateCode для выделенного шага.

пример

generateCode(configurer) генерирует функцию MEX (MATLAB Executable) для predict и update функции модели машинного обучения при помощи configurer. Сгенерированная MEX-функция имеет имя outputFileName, которое является именем файла, хранящимся в OutputFileName свойство configurer.

Чтобы сгенерировать MEX-функцию, generateCode сначала генерирует следующие файлы MATLAB, необходимые для генерации кода и хранения их в текущей папке:

  • predict.m, update.m, и initialize.mpredict.m и update.m являются функциями точки входа для predict и update функций модели машинного обучения, соответственно, и эти две функции вызывают initialize.m.

  • MAT-файл, который включает информацию о модели машинного обучения - generateCode использует saveLearnerForCoder функция для сохранения информации модели машинного обучения в MAT-файле, имя файла которого хранится в OutputFileName свойство конфигуратора кодера. initialize.m загружает сохраненный MAT-файл при помощи loadLearnerForCoder функция.

После генерации необходимых файлов MATLAB, generateCode создает MEX-функцию и код для MEX-функции в codegen\mex\outputFileName и копирует MEX-функцию в текущую папку.

пример

generateCode(configurer,cfg) генерирует код C/C + + с использованием типа сборки, заданного cfg.

пример

generateCode(___,'OutputPath',outputPath) задает путь к папке для выходных файлов в дополнение к любому из входных параметров в предыдущих синтаксисах. generateCode генерирует файлы MATLAB в папке, заданной outputPath и генерирует код C/C + + в папке outputPath\ codegen\type\outputFileName где type - тип сборки, заданный как cfg.

Примеры

свернуть все

Обучите модель машинного обучения, а затем сгенерируйте код для predict и update функций модели при помощи конфигуратора кодера.

Загрузите carsmall набор данных и train регрессионной модели машины опорных векторов (SVM).

load carsmall
X = [Horsepower,Weight];
Y = MPG;
Mdl = fitrsvm(X,Y);

Mdl является RegressionSVM объект.

Создайте конфигуратор кодера для RegressionSVM моделировать при помощи learnerCoderConfigurer. Задайте данные предиктора X. The learnerCoderConfigurer функция использует входную X конфигурирование атрибутов кодера predict входной параметр функции.

configurer = learnerCoderConfigurer(Mdl,X)
configurer = 
  RegressionSVMCoderConfigurer with properties:

   Update Inputs:
             Alpha: [1x1 LearnerCoderInput]
    SupportVectors: [1x1 LearnerCoderInput]
             Scale: [1x1 LearnerCoderInput]
              Bias: [1x1 LearnerCoderInput]

   Predict Inputs:
                 X: [1x1 LearnerCoderInput]

   Code Generation Parameters:
        NumOutputs: 1
    OutputFileName: 'RegressionSVMModel'


  Properties, Methods

configurer является RegressionSVMCoderConfigurer объект, который является конфигуратором кодера RegressionSVM объект.

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

Сгенерируйте код для predict и update функции регрессионной модели SVM (Mdl) с настройками по умолчанию.

generateCode(configurer)
generateCode creates these files in output folder:
'initialize.m', 'predict.m', 'update.m', 'RegressionSVMModel.mat'
Code generation successful.

The generateCode функция завершает следующие действия:

  • Сгенерируйте файлы MATLAB, необходимые для генерации кода, включая две функции точки входа predict.m и update.m для predict и update функции Mdl, соответственно.

  • Создайте MEX-функцию с именем RegressionSVMModel для двух функций точки входа.

  • Создайте код для MEX-функции в codegen\mex\RegressionSVMModel папка.

  • Скопируйте MEX-функцию в текущую папку.

Отображение содержимого predict.m, update.m, и initialize.m файлы при помощи type функция.

type predict.m
function varargout = predict(X,varargin) %#codegen
% Autogenerated by MATLAB, 23-Apr-2021 12:43:25
[varargout{1:nargout}] = initialize('predict',X,varargin{:});
end
type update.m
function update(varargin) %#codegen
% Autogenerated by MATLAB, 23-Apr-2021 12:43:25
initialize('update',varargin{:});
end
type initialize.m
function [varargout] = initialize(command,varargin) %#codegen
% Autogenerated by MATLAB, 23-Apr-2021 12:43:25
coder.inline('always')
persistent model
if isempty(model)
    model = loadLearnerForCoder('RegressionSVMModel.mat');
end
switch(command)
    case 'update'
        % Update struct fields: Alpha
        %                       SupportVectors
        %                       Scale
        %                       Bias
        model = update(model,varargin{:});
    case 'predict'
        % Predict Inputs: X
        X = varargin{1};
        if nargin == 2
            [varargout{1:nargout}] = predict(model,X);
        else
            PVPairs = cell(1,nargin-2);
            for i = 1:nargin-2
                PVPairs{1,i} = varargin{i+1};
            end
            [varargout{1:nargout}] = predict(model,X,PVPairs{:});
        end
end
end

Обучите модель машинного обучения и сгенерируйте код при помощи конфигуратора кодера обученной модели. При генерации кода задайте тип сборки и другие опции строения, используя объект строения генерации кода.

Загрузите ionosphere набор данных и train двоичную модель классификации машины опорных векторов (SVM).

load ionosphere
Mdl = fitcsvm(X,Y);

Mdl является ClassificationSVM объект.

Создайте конфигуратор кодера для ClassificationSVM моделировать при помощи learnerCoderConfigurer. Задайте данные предиктора X. The learnerCoderConfigurer функция использует входную X конфигурирование атрибутов кодера predict входной параметр функции.

configurer = learnerCoderConfigurer(Mdl,X);

configurer является ClassificationSVMCoderConfigurer объект, который является конфигуратором кодера ClassificationSVM объект.

Создайте объект строения генерации кода при помощи coder.config (MATLAB Coder). Задайте 'dll' чтобы сгенерировать динамическую библиотеку и задать GenerateReport свойство как true чтобы включить отчет генерации кода.

cfg = coder.config('dll');
cfg.GenerateReport = true;

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

Использование generateCode и объект строения cfg для генерации кода. Кроме того, укажите выход путь к папке.

generateCode(configurer,cfg,'OutputPath','testPath')
Specified folder does not exist. Folder has been created.
generateCode creates these files in output folder:
'initialize.m', 'predict.m', 'update.m', 'ClassificationSVMModel.mat'
Code generation successful: To view the report, open('codegen/dll/ClassificationSVMModel/html/report.mldatx').

generateCode создает указанную папку. Функция также генерирует файлы MATLAB, необходимые для генерации кода и хранения их в папке. Затем generateCode генерирует код С в testPath\codegen\dll\ClassificationSVMModel папка.

Обучите модель выходных кодов с исправлением ошибок (ECOC) с помощью двоичных учащихся SVM и создайте конфигуратор кодера для модели. Используйте свойства конфигуратора кодера, чтобы задать атрибуты кодера параметров модели ECOC. Используйте функцию объекта конфигуратора кодера, чтобы сгенерировать код С, который предсказывает метки для новых данных предиктора. Затем переобучите модель с помощью разных настроек, и обновите параметры в сгенерированном коде, не регенерируя код.

Обучите модель

Загрузите набор данных радужки Фишера.

load fisheriris
X = meas;
Y = species;

Создайте двоичный шаблон учащегося SVM, чтобы использовать функцию Гауссова ядра и стандартизировать данные предиктора.

t = templateSVM('KernelFunction','gaussian','Standardize',true);

Обучите многоклассовую модель ECOC с помощью шаблона t.

Mdl = fitcecoc(X,Y,'Learners',t);

Mdl является ClassificationECOC объект.

Создайте конфигуратор кодера

Создайте конфигуратор кодера для ClassificationECOC моделировать при помощи learnerCoderConfigurer. Задайте данные предиктора X. The learnerCoderConfigurer функция использует входную X конфигурирование атрибутов кодера predict входной параметр функции. Кроме того, установите количество выходов 2, чтобы сгенерированный код вернул первые два выхода predict функция, которые являются предсказанными метками и отрицательными средними двоичными потерями.

configurer = learnerCoderConfigurer(Mdl,X,'NumOutputs',2)
configurer = 
  ClassificationECOCCoderConfigurer with properties:

   Update Inputs:
    BinaryLearners: [1x1 ClassificationSVMCoderConfigurer]
             Prior: [1x1 LearnerCoderInput]
              Cost: [1x1 LearnerCoderInput]

   Predict Inputs:
                 X: [1x1 LearnerCoderInput]

   Code Generation Parameters:
        NumOutputs: 2
    OutputFileName: 'ClassificationECOCModel'


  Properties, Methods

configurer является ClassificationECOCCoderConfigurer объект, который является конфигуратором кодера ClassificationECOC объект. На отображении показаны настраиваемые входные параметры predict и update: X, BinaryLearners, Prior, и Cost.

Задайте атрибуты параметров кодера

Задайте атрибуты кодера predict аргументы (данные предиктора и аргументы пары "имя-значение" 'Decoding' и 'BinaryLoss') и update аргументы (поддерживающие векторы учащихся SVM), чтобы можно было использовать эти аргументы в качестве входных параметров predict и update в сгенерированном коде.

Во-первых, задайте атрибуты кодера X чтобы сгенерированный код принял любое количество наблюдений. Измените SizeVector и VariableDimensions атрибуты. The SizeVector атрибут задает верхнюю границу размера данных предиктора и VariableDimensions атрибут определяет, имеет ли каждую размерность данных предиктора переменный размер или фиксированный размер.

configurer.X.SizeVector = [Inf 4];
configurer.X.VariableDimensions = [true false];

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

Размер второго измерения является количеством переменных. Это значение должно быть фиксировано для модели машинного обучения. X содержит 4 предиктора, поэтому второе значение SizeVector атрибут должен быть 4, и второе значение VariableDimensions атрибут должен быть false.

Затем измените атрибуты кодера BinaryLoss и Decoding использовать 'BinaryLoss' и 'Decoding' Аргументы пары "имя-значение" в сгенерированном коде. Отображение атрибутов кодера BinaryLoss.

configurer.BinaryLoss
ans = 
  EnumeratedInput with properties:

             Value: 'hinge'
    SelectedOption: 'Built-in'
    BuiltInOptions: {1x7 cell}
        IsConstant: 1
        Tunability: 0

Чтобы использовать значение nondefault в сгенерированном коде, необходимо задать значение перед генерацией кода. Задайте Value атрибут BinaryLoss как 'exponential'.

configurer.BinaryLoss.Value = 'exponential';
configurer.BinaryLoss
ans = 
  EnumeratedInput with properties:

             Value: 'exponential'
    SelectedOption: 'Built-in'
    BuiltInOptions: {1x7 cell}
        IsConstant: 1
        Tunability: 1

Если вы изменяете значения атрибутов при Tunability является false (логический 0), программное обеспечение устанавливает Tunability на true (логический 1).

Отображение атрибутов кодера Decoding.

configurer.Decoding
ans = 
  EnumeratedInput with properties:

             Value: 'lossweighted'
    SelectedOption: 'Built-in'
    BuiltInOptions: {'lossweighted'  'lossbased'}
        IsConstant: 1
        Tunability: 0

Задайте IsConstant атрибут Decoding как false чтобы можно было использовать все доступные значения в BuiltInOptions в сгенерированном коде.

configurer.Decoding.IsConstant = false;
configurer.Decoding
ans = 
  EnumeratedInput with properties:

             Value: [1x1 LearnerCoderInput]
    SelectedOption: 'NonConstant'
    BuiltInOptions: {'lossweighted'  'lossbased'}
        IsConstant: 0
        Tunability: 1

Программное обеспечение изменяет Value атрибут Decoding в LearnerCoderInput объект так, что можно использовать оба 'lossweighted' и 'lossbased'как значение 'Decoding'. Кроме того, программное обеспечение устанавливает SelectedOption на 'NonConstant' и Tunability на true.

Наконец, измените атрибуты кодера SupportVectors в BinaryLearners. Отображение атрибутов кодера SupportVectors.

configurer.BinaryLearners.SupportVectors
ans = 
  LearnerCoderInput with properties:

            SizeVector: [54 4]
    VariableDimensions: [1 0]
              DataType: 'double'
            Tunability: 1

Значение по умолчанию VariableDimensions является [true false] потому что каждый учащийся имеет разное количество векторов поддержки. Если переобучить модель ECOC с помощью новых данных или других настроек, количество поддержки векторов в учениках SVM может варьироваться. Поэтому увеличьте верхнюю границу количества поддержки векторов.

configurer.BinaryLearners.SupportVectors.SizeVector = [150 4];
SizeVector attribute for Alpha has been modified to satisfy configuration constraints.
SizeVector attribute for SupportVectorLabels has been modified to satisfy configuration constraints.

Если вы изменяете атрибуты кодера SupportVectors, затем программное обеспечение изменяет атрибуты кодера Alpha и SupportVectorLabels для удовлетворения ограничениям строения. Если изменение атрибутов кодера одного параметра требует последующих изменений других зависимых параметров, чтобы удовлетворить ограничениям строения, то программное обеспечение изменяет атрибуты кодера зависимых параметров.

Отобразите конфигуратор кодера.

configurer
configurer = 
  ClassificationECOCCoderConfigurer with properties:

   Update Inputs:
    BinaryLearners: [1x1 ClassificationSVMCoderConfigurer]
             Prior: [1x1 LearnerCoderInput]
              Cost: [1x1 LearnerCoderInput]

   Predict Inputs:
                 X: [1x1 LearnerCoderInput]
        BinaryLoss: [1x1 EnumeratedInput]
          Decoding: [1x1 EnumeratedInput]

   Code Generation Parameters:
        NumOutputs: 2
    OutputFileName: 'ClassificationECOCModel'


  Properties, Methods

Теперь отображение включает BinaryLoss и Decoding также.

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

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

Сгенерируйте код для predict и update функции классификационной модели ECOC (Mdl).

generateCode(configurer)
generateCode creates these files in output folder:
'initialize.m', 'predict.m', 'update.m', 'ClassificationECOCModel.mat'
Code generation successful.

The generateCode функция завершает следующие действия:

  • Сгенерируйте файлы MATLAB, необходимые для генерации кода, включая две функции точки входа predict.m и update.m для predict и update функции Mdl, соответственно.

  • Создайте MEX-функцию с именем ClassificationECOCModel для двух функций точки входа.

  • Создайте код для MEX-функции в codegen\mex\ClassificationECOCModel папка.

  • Скопируйте MEX-функцию в текущую папку.

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

Передайте некоторые данные предиктора, чтобы проверить, predict ли функция Mdl и predict функция в MEX-функция возвращает те же метки. Чтобы вызвать функцию точки входа в MEX-функция, которая имеет более одной точки входа, укажите имя функции в качестве первого входного параметра. Потому что вы указали 'Decoding' как настраиваемый входной параметр путем изменения IsConstant атрибут перед генерацией кода, вы также должны задать его в вызове MEX-функции, хотя 'lossweighted' - значение по умолчанию 'Decoding'.

[label,NegLoss] = predict(Mdl,X,'BinaryLoss','exponential');
[label_mex,NegLoss_mex] = ClassificationECOCModel('predict',X,'BinaryLoss','exponential','Decoding','lossweighted');

Сравнение label на label_mex при помощи isequal.

isequal(label,label_mex)
ans = logical
   1

isequal возвращает логический 1 (true), если все входы равны. Сравнение подтверждает, что predict функция Mdl и predict функция в MEX-функция возвращает те же метки.

NegLoss_mex могут включать круглые различия по сравнению с NegLoss. В этом случае сравните NegLoss_mex на NegLoss, допускающий небольшой допуск.

find(abs(NegLoss-NegLoss_mex) > 1e-8)
ans =

  0x1 empty double column vector

Сравнение подтверждает, что NegLoss и NegLoss_mex равны в пределах допуска 1e–8.

Переобучите модель и параметры обновления в сгенерированном коде

Переобучите модель с помощью другой настройки. Задайте 'KernelScale' как 'auto' чтобы программа выбирала соответствующий масштабный коэффициент с помощью эвристической процедуры.

t_new = templateSVM('KernelFunction','gaussian','Standardize',true,'KernelScale','auto');
retrainedMdl = fitcecoc(X,Y,'Learners',t_new);

Извлечение параметров для обновления при помощи validatedUpdateInputs. Эта функция обнаруживает измененные параметры модели в retrainedMdl и подтверждает, удовлетворяют ли измененные значения параметров атрибутам кодера параметров.

params = validatedUpdateInputs(configurer,retrainedMdl);

Обновляйте параметры в сгенерированном коде.

ClassificationECOCModel('update',params)

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

Сравните выходы predict функция retrainedMdl к выходам из predict функция в обновленной MEX-функции.

[label,NegLoss] = predict(retrainedMdl,X,'BinaryLoss','exponential','Decoding','lossbased');
[label_mex,NegLoss_mex] = ClassificationECOCModel('predict',X,'BinaryLoss','exponential','Decoding','lossbased');
isequal(label,label_mex)
ans = logical
   1

find(abs(NegLoss-NegLoss_mex) > 1e-8)
ans =

  0x1 empty double column vector

Сравнение подтверждает, что label и label_mex равны, и NegLoss и NegLoss_mex равны в пределах допуска.

Входные параметры

свернуть все

Конфигуратор кодера модели машинного обучения, заданный как объект конфигуратора кодера, созданный при помощи learnerCoderConfigurer.

МодельОбъект конфигуратора кодера
Двоичное дерево принятия решений для многоклассовой классификацииClassificationTreeCoderConfigurer
SVM для одноклассовой и двоичной классификацииClassificationSVMCoderConfigurer
Линейная модель для двоичной классификацииClassificationLinearCoderConfigurer
Многоклассовая модель для SVM и линейных моделейClassificationECOCCoderConfigurer
Двоичное дерево решений для регрессииRegressionTreeCoderConfigurer
Машина опорных векторов (SVM)RegressionSVMCoderConfigurer
Линейная регрессияRegressionLinearCoderConfigurer

Тип сборки, заданный как 'mex', 'dll', 'lib', или объект строения генерации кода, созданный coder.config (MATLAB Coder).

generateCode генерирует код C/C + + с использованием одного из следующих типов сборки.

  • 'mex' - Генерирует MEX-функцию, которая имеет зависящее от платформы расширение. Функция MEX является программой на C/C + +, которая исполняется из Командного окна. Перед генерацией библиотеки C/C + + для развертывания сгенерируйте MEX-функцию, чтобы убедиться, что сгенерированный код предоставляет правильные функциональные возможности.

  • 'dll' - Сгенерируйте динамическую библиотеку C/C + +.

  • 'lib' - Сгенерируйте статическую библиотеку C/C + +.

  • Объект строения генерации кода, созданный coder.config (MATLAB Coder) - Сгенерируйте код C/C + + с помощью объекта строения генерации кода, чтобы настроить опции генерации кода. Можно задать тип сборки и другие опции строения с помощью объекта. Для примера измените GenerateReport параметр, чтобы включить отчет генерации кода и изменить TargetLang параметр для генерации кода С++. Значение по умолчанию для TargetLang параметр 'C', генерирующий код С.

    cfg = coder.config('mex');
    cfg.GenerateReport = true;
    cfg.TargetLang = 'C++';
    Для получения дополнительной информации смотрите -config опция codegen (MATLAB Coder), coder.config (MATLAB Coder) и настройте параметры сборки (MATLAB Coder).

generateCode генерирует код C/C + + в папке outputPath\ codegen\type\outputFileName, где type - тип сборки, заданный в cfg аргумент и outputFileName - имя файла, хранящееся в OutputFileName свойство configurer.

Путь к папке для выходных файлов generateCode, заданный как вектор символов или строковые массивы.

Заданный путь к папке может быть абсолютным или относительным путем к текущей папке пути.

  • Путь не должен содержать пространства, поскольку они могут привести к отказам генерации кода в определенных строениях операционной системы.

  • Путь также не может содержать не 7-битные символы ASCII, такие как японские символы.

Если заданная папка не существует, то generateCode создает папку.

generateCode ищет в указанной папке четыре файла MATLAB: predict.m, update.m, initialize.mи MAT-файл, который включает информацию о модели машинного обучения. Если четыре файла не существуют в папке, то generateCode генерирует файлы. В противном случае, generateCode не генерирует никаких файлов MATLAB.

generateCode генерирует код C/C + + в папке outputPath\ codegen\type\outputFileName, где type - тип сборки, заданный в cfg аргумент и outputFileName - имя файла, хранящееся в OutputFileName свойство configurer.

Пример: 'C:\myfiles'

Типы данных: char | string

Ограничения

  • generateCode функция использует saveLearnerForCoder, loadLearnerForCoder, и codegen функций, поэтому ограничения генерации кода этих функций также применяются к generateCode функция. Для получения дополнительной информации см. страницы с описанием функций saveLearnerForCoder, loadLearnerForCoder, и codegen (MATLAB Coder).

  • Для указаний по применению генерации кода и ограничений модели машинного обучения и ее функций объекта, смотрите разделы Генерации кода соответствующих страниц с описанием.

    МодельОбъект моделиpredict Функция
    Двоичное дерево принятия решений для многоклассовой классификацииCompactClassificationTreepredict
    SVM для одноклассовой и двоичной классификацииCompactClassificationSVMpredict
    Линейная модель для двоичной классификацииClassificationLinearpredict
    Многоклассовая модель для SVM и линейных моделейCompactClassificationECOCpredict
    Двоичное дерево решений для регрессииCompactRegressionTreepredict
    Регрессия SVMCompactRegressionSVMpredict
    Линейная регрессияRegressionLinearpredict

Альтернативная функциональность

  • Если вы хотите изменить файлы MATLAB (predict.m, update.m, и initialize.m) согласно вашему рабочему процессу генерации кода, затем используйте generateFiles чтобы сгенерировать эти файлы и использовать codegen (MATLAB Coder) для генерации кода.

Введенный в R2018b