Сгенерируйте код C/C++ с помощью кодера configurer
После обучения модель машинного обучения создайте кодер configurer для модели при помощи learnerCoderConfigurer
. Измените свойства configurer задать опции генерации кода. Затем используйте generateCode
, чтобы сгенерировать код C/C++ для predict
и функций update
модели машинного обучения. Генерация кода C/C++ требует MATLAB® Coder™.
Эта блок-схема показывает рабочий процесс генерации кода с помощью кодера configurer. Используйте generateCode
для подсвеченного шага.
generateCode(configurer)
generateCode(configurer,cfg)
generateCode(___,'OutputPath',outputPath)
generateCode(
генерирует MEX (Исполняемый файл MATLAB) функция для configurer
)predict
и функции update
модели машинного обучения при помощи configurer
. Сгенерированную MEX-функцию называют outputFileName
, который является именем файла, сохраненным в свойстве OutputFileName
configurer
.
Чтобы сгенерировать MEX-функцию, generateCode
сначала генерирует следующие файлы MATLAB, требуемые сгенерировать код, и хранит их в текущей папке:
predict.m
, update.m
и initialize.m
— predict.m
и update.m
являются функциями точки входа для predict
и функциями update
модели машинного обучения, соответственно, и эти две функции вызывают initialize.m
.
MAT-файл, который включает информацию о модели машинного обучения — generateCode
, использует функцию saveCompactModel
, чтобы сохранить информацию модели машинного обучения в MAT-файле, имя файла которого хранится в свойстве OutputFileName
кодера configurer. initialize.m
загружает сохраненный MAT-файл при помощи функции loadCompactModel
.
После генерации необходимых файлов MATLAB generateCode
создает MEX-функцию и код для MEX-функции в папке codegen\mex\
outputFileName
и копирует MEX-функцию в текущую папку.
generateCode(
генерирует код C/C++ с помощью типа сборки, заданного configurer
,cfg
)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
, чтобы просмотреть и изменить компилятор по умолчанию. Для получения дополнительной информации см. Компилятор Значения по умолчанию Изменения (MATLAB).
Сгенерируйте код для predict
и функций update
модели регрессии SVM (Mdl
) с настройками по умолчанию.
generateCode(configurer)
generateCode creates these files in output folder: 'initialize.m', 'predict.m', 'update.m', 'RegressionSVMModel.mat'
Функция 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, 22-Feb-2019 03:27:43 [varargout{1:nargout}] = initialize('predict',X,varargin{:}); end
type update.m
function update(varargin) %#codegen % Autogenerated by MATLAB, 22-Feb-2019 03:27:43 initialize('update',varargin{:}); end
type initialize.m
function [varargout] = initialize(command,varargin) %#codegen % Autogenerated by MATLAB, 22-Feb-2019 03:27:43 coder.inline('always'); persistent model; if isempty(model) model = loadCompactModel('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
. Задайте 'dll'
, чтобы сгенерировать динамическую библиотеку и задать свойство GenerateReport
как true
, чтобы включить отчет генерации кода.
cfg = coder.config('dll');
cfg.GenerateReport = true;
Чтобы сгенерировать код C/C++, у вас должен быть доступ к компилятору C/C++, который сконфигурирован правильно. MATLAB Coder определяет местоположение и использует поддерживаемый, установленный компилятор. Можно использовать mex
-setup
, чтобы просмотреть и изменить компилятор по умолчанию. Для получения дополнительной информации см. Компилятор Значения по умолчанию Изменения (MATLAB).
Используйте 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, чтобы сгенерировать код С, который предсказывает метки для новых данных о предикторе. Затем переобучите модель с помощью различных настроек и обновите параметры в сгенерированном коде, не регенерируя код.
Модель train
Загрузите ирисовый набор данных Фишера.
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: [1×1 ClassificationSVMCoderConfigurer] Prior: [1×1 LearnerCoderInput] Cost: [1×1 LearnerCoderInput] Predict Inputs: X: [1×1 LearnerCoderInput] Code Generation Parameters: NumOutputs: 2 OutputFileName: 'ClassificationECOCModel' Properties, Methods
configurer
является объектом ClassificationECOCCoderConfigurer
, который является кодером configurer объекта ClassificationECOC
. Отображение показывает настраиваемые входные параметры predict
и update
: X
, BinaryLearners
, Prior
и Cost
.
Задайте атрибуты кодера параметров
Задайте атрибуты кодера аргументов predict
(данные о предикторе и аргументы пары "имя-значение" 'Decoding'
и 'BinaryLoss'
) и аргументов update
(векторы поддержки учеников SVM) так, чтобы можно было использовать эти аргументы в качестве входных параметров predict
и update
в сгенерированном коде.
Во-первых, задайте атрибуты кодера X
так, чтобы сгенерированный код принял любое количество наблюдений. Измените атрибуты VariableDimensions
и SizeVector
. Атрибут 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: {'hamming' 'linear' 'quadratic' 'exponential' 'binodeviance' 'hinge' 'logit'} IsConstant: 1 Tunability: 0
Чтобы использовать значение не по умолчанию в сгенерированном коде, необходимо задать значение прежде, чем сгенерировать код. Задайте атрибут Value
BinaryLoss
как 'exponential'
.
configurer.BinaryLoss.Value = 'exponential';
configurer.BinaryLoss
ans = EnumeratedInput with properties: Value: 'exponential' SelectedOption: 'Built-in' BuiltInOptions: {'hamming' 'linear' 'quadratic' 'exponential' 'binodeviance' 'hinge' 'logit'} 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: [1×1 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: [1×1 ClassificationSVMCoderConfigurer] Prior: [1×1 LearnerCoderInput] Cost: [1×1 LearnerCoderInput] Predict Inputs: X: [1×1 LearnerCoderInput] BinaryLoss: [1×1 EnumeratedInput] Decoding: [1×1 EnumeratedInput] Code Generation Parameters: NumOutputs: 2 OutputFileName: 'ClassificationECOCModel' Properties, Methods
Отображение теперь включает BinaryLoss
и Decoding
также.
Сгенерируйте код
Чтобы сгенерировать код C/C++, у вас должен быть доступ к компилятору C/C++, который сконфигурирован правильно. MATLAB Coder определяет местоположение и использует поддерживаемый, установленный компилятор. Можно использовать mex
-setup
, чтобы просмотреть и изменить компилятор по умолчанию. Для получения дополнительной информации см. Компилятор Значения по умолчанию Изменения (MATLAB).
Сгенерируйте код для predict
и функций update
модели классификации ECOC (Mdl
) с настройками по умолчанию.
generateCode(configurer)
generateCode creates these files in output folder: 'initialize.m', 'predict.m', 'update.m', 'ClassificationECOCModel.mat'
Функция 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 = 0×1 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 = 0×1 empty double column vector
Сравнение подтверждает, что labels
и labels_mex
равны, и NegLoss
и NegLoss_mex
равны в допуске.
configurer
— Кодер configurerКодер configurer модели машинного обучения, заданной как кодер configurer объект, создается при помощи learnerCoderConfigurer
.
Модель | Объект кодера Конфигурера |
---|---|
Регрессия машины вектора поддержки (SVM) | RegressionSVMCoderConfigurer |
SVM для и бинарной классификации одного класса | ClassificationSVMCoderConfigurer |
Модель Multiclass для SVMs | ClassificationECOCCoderConfigurer |
cfg
— Создайте тип'mex'
(значение по умолчанию) | 'dll'
| 'lib'
| объект настройки генерации кодаСоздайте тип, заданный как 'mex'
, 'dll'
, 'lib'
или объект настройки генерации кода, созданный coder.config
.
generateCode
генерирует код C/C++ с помощью одного из следующих типов сборки.
MEX
Генерирует MEX-функцию, которая имеет зависимое платформой расширение. MEX-функция является программой C/C++, которая является исполняемым файлом из Командного окна. Прежде, чем сгенерировать библиотеку C/C++ для развертывания, сгенерируйте MEX-функцию, чтобы проверить, что сгенерированный код обеспечивает правильную функциональность.
'dll'
— Сгенерируйте динамическую библиотеку C/C++.
'lib'
— Сгенерируйте статическую библиотеку C/C++.
Объект настройки генерации кода, созданный coder.config
— Генерирует код C/C++ с помощью объекта настройки генерации кода настроить опции генерации кода. Можно задать тип сборки и другие параметры конфигурации с помощью объекта. Например, измените параметр GenerateReport
, чтобы включить отчет генерации кода и изменить параметр TargetLang
, чтобы сгенерировать Код С++. Значением по умолчанию параметра TargetLang
является 'C'
, генерируя код С.
cfg = coder.config('mex'); cfg.GenerateReport = true; cfg.TargetLang = 'C++';
-config
codegen
, coder.config
, и Сконфигурируйте Настройки Сборки (MATLAB Coder).
generateCode
генерирует код C/C++ в папке outputPath\codegen\
type
\
outputFileName
, где type
является типом сборки, заданным аргументом cfg
, и outputFileName
является именем файла, сохраненным в свойстве OutputFileName
configurer
.
outputPath
— Путь к папке для выходных файловПуть к папке для выходных файлов 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
использует saveCompactModel
, loadCompactModel
и функции codegen
, таким образом, ограничения генерации кода этих функций также применяются к функции generateCode
. Для получения дополнительной информации смотрите страницы saveCompactModel
ссылки на функцию, loadCompactModel
и codegen
.
Для указаний и ограничений по применению генерации кода модели машинного обучения и ее объектных функций, смотрите разделы Генерации кода соответствующих страниц с описанием.
Модель | Объект модели | Функция predict |
---|---|---|
Регрессия SVM | CompactRegressionSVM | predict |
SVM для и бинарной классификации одного класса | CompactClassificationSVM | predict |
Модель Multiclass для SVMs | CompactClassificationECOC | predict |
Если вы хотите изменить файлы MATLAB (predict.m
, update.m
и initialize.m
) согласно вашему рабочему процессу генерации кода, то используйте generateFiles
, чтобы сгенерировать эти файлы и использовать codegen
, чтобы сгенерировать код.
generateFiles
| learnerCoderConfigurer
| update
| validatedUpdateInputs
Вы щелкнули по ссылке, которая соответствует команде MATLAB:
Выполните эту команду, введя её в командном окне MATLAB.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.