exponenta event banner

generateCode

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

Описание

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

На этой блок-схеме показан рабочий процесс создания кода с использованием конфигуратора кодера. Использовать 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 набор данных и тренировка регрессионной модели машины опорных векторов (SVM).

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

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

Создание конфигуратора кодера для 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 объект, который является конфигуратором кодера 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, 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 набор данных и обучение модели классификации двоичного вектора поддержки (SVM).

load ionosphere
Mdl = fitcsvm(X,Y);

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

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

configurer = learnerCoderConfigurer(Mdl,X);

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

Создание объекта конфигурации создания кода с помощью coder.config (Кодер MATLAB). Определить '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 генерирует код C в testPath\codegen\dll\ClassificationSVMModel папка.

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

Модель поезда

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

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. 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 атрибуты. 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 (логический 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.

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

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

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

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

  • 'lib' - Создание статической библиотеки C/C + +.

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

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

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

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

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

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

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

Представлен в R2018b