generateCode

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

Описание

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

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

Two code generation workflows: the first after training a model, and the second after retraining the same model. First workflow, Step 1: Create a coder configurer. Step 2 (highlighted): Generate code. Step 3: Verify the generated code. Second workflow, Step 1: Check if the update is valid. If yes, go to Step 2; if no, go to the first step of the first workflow. Step 2: Update the model parameters in the generated code.

пример

generateCode(configurer) генерирует MEX (Исполняемый файл MATLAB) функция для 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 свойство кодера configurer. 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 функции модели при помощи кодера configurer.

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

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

Mdl RegressionSVM объект.

Создайте кодер configurer для RegressionSVM модель при помощи learnerCoderConfigurer. Задайте данные о предикторе X. 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 объект, который является кодером configurer 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.

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, 25-Aug-2021 22:31:12
[varargout{1:nargout}] = initialize('predict',X,varargin{:});
end
type update.m
function update(varargin) %#codegen
% Autogenerated by MATLAB, 25-Aug-2021 22:31:12
initialize('update',varargin{:});
end
type initialize.m
function [varargout] = initialize(command,varargin) %#codegen
% Autogenerated by MATLAB, 25-Aug-2021 22:31:12
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

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

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

load ionosphere
Mdl = fitcsvm(X,Y);

Mdl ClassificationSVM объект.

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

configurer = learnerCoderConfigurer(Mdl,X);

configurer ClassificationSVMCoderConfigurer объект, который является кодером configurer 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, и создайте кодер configurer для модели. Используйте свойства кодера configurer, чтобы задать атрибуты кодера параметров модели ECOC. Используйте объектную функцию кодера configurer, чтобы сгенерировать код С, который предсказывает метки для новых данных о предикторе. Затем переобучите модель с помощью различных настроек и параметров обновления в сгенерированном коде, не регенерируя код.

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

Загрузите ирисовый набор данных Фишера.

load fisheriris
X = meas;
Y = species;

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

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

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

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

Mdl ClassificationECOC объект.

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

Создайте кодер configurer для ClassificationECOC модель при помощи learnerCoderConfigurer. Задайте данные о предикторе X. 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 объект, который является кодером configurer ClassificationECOC объект. Отображение показывает настраиваемые входные параметры predict и updateX, BinaryLearners, Prior, и Cost.

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

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

Во-первых, задайте атрибуты кодера X так, чтобы сгенерированный код принял любое количество наблюдений. Измените SizeVector и VariableDimensions атрибуты. 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

Чтобы использовать значение не по умолчанию в сгенерированном коде, необходимо задать значение прежде, чем сгенерировать код. Задайте 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 (логический ноль), программное обеспечение устанавливает Tunability к true (логическая единица).

Отобразите атрибуты кодера 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
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.

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 возвращает логическую единицу (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 равны в допуске.

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

свернуть все

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

МодельОбъект кодера Конфигурера
Дерево выбора из двух альтернатив для классификации мультиклассовClassificationTreeCoderConfigurer
SVM для и бинарной классификации одного классаClassificationSVMCoderConfigurer
Линейная модель для бинарной классификацииClassificationLinearCoderConfigurer
Модель Multiclass для SVMs и линейные модели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В виде вектора символов или массива строк.

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

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

  • Путь также не может содержать non-7-bit символы 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
    Модель Multiclass для SVMs и линейные моделиCompactClassificationECOCpredict
    Дерево выбора из двух альтернатив для регрессииCompactRegressionTreepredict
    Регрессия SVMCompactRegressionSVMpredict
    Линейная регрессияRegressionLinearpredict

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

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

Введенный в R2018b