В этом примере показано, как сгенерировать код, который реализует пошаговое обучение для бинарной линейной классификации. Чтобы мотивировать его цель, считайте обучение носимым устройством определенный задачу, чтобы определить, неактивен ли владелец или перемещение, на основе сенсорных функций чтения устройства.
Сгенерированный код выполняет следующие задачи, как задано в функциях точки входа:
Загрузите сконфигурированный шаблон модели пошагового обучения, созданный в командной строке.
Отследите показатели производительности на входящем пакете данных из потока данных. Этот пример отслеживает misclassification уровень и потерю стержня.
Обновите модель, подбирая инкрементную модель к пакету данных.
Предсказывает метки для пакета данных.
Этот пример генерирует код из командной строки MATLAB®, но можно сгенерировать код с помощью приложения MATLAB® Coder™ вместо этого. Для получения дополнительной информации смотрите Генерацию кода для Предсказания Модели Машинного обучения Используя Приложение MATLAB Coder.
Весь объект пошагового обучения функционирует для бинарной линейной классификации (и также линейная регрессия) генерация кода поддержки. Чтобы подготовить код, чтобы сгенерировать для пошагового обучения, объектные функции требуют соответственно сконфигурированного объекта модели пошагового обучения, но -args
опция codegen
(MATLAB Coder) не принимает эти объекты. Чтобы работать вокруг этого ограничения, используйте saveLearnerForCoder
и loadLearnerForCoder
функции.
Эта блок-схема показывает рабочие процессы генерации кода для функций объекта пошагового обучения для линейных моделей.
Блок-схема предлагает два отличных, но объединяющих рабочих процесса.
Начало рабочего процесса Обучается, Модель> Преобразуют Модель, требует данных, в этом случае можно опционально выполнить выбор признаков или оптимизировать модель путем выполнения перекрестной проверки прежде, чем сгенерировать код для пошагового обучения.
Начало рабочего процесса Конфигурирует Модель, не требует данных. Вместо этого необходимо вручную сконфигурировать объект модели пошагового обучения.
Для получения дополнительной информации на различиях между рабочими процессами, и для справки, решающей, который использовать, видят, Конфигурируют Модель Пошагового обучения.
Независимо от рабочего процесса вы выбираете, получившаяся модель пошагового обучения должна иметь все следующие качества:
NumPredictors
свойство отражает количество предикторов в данных о предикторе во время пошагового обучения.
Для классификации, ClassNames
свойство должно содержать все имена классов, ожидаемые во время пошагового обучения.
Если вы выбираете Train Model> рабочий процесс Convert Model, и вы подбираете модель к данным, содержащим все известные классы, модель сконфигурирована для генерации кода.
После того, как вы готовите модель пошагового обучения, сохраняете объект модели при помощи saveLearnerForCoder
. Затем задайте функцию точки входа, которая загружает сохраненную модель при помощи loadLearnerForCoder
, и это выполняет пошаговое обучение путем вызывания объектных функций. В качестве альтернативы можно задать несколько функций точки входа, которые выполняют этапы пошагового обучения отдельно (этот пример использует этот рабочий процесс). Однако этот рабочий процесс требует специального режима, когда обновленный объект модели является входом к другой функции точки входа. Например, вы пишете следующие три функции точки входа:
Функция, которая принимает текущую модель и пакет данных, вызывает updateMetrics
, и возвращает модель с обновленными показателями производительности.
Функция, которая принимает обновленную модель и пакет данных, вызывает fit
, и возвращает модель с обновленными коэффициентами.
Функция, которая принимает далее обновленную модель и пакет данных о предикторе, вызывает predict
, и возвращает предсказанные метки.
Наконец, сгенерируйте код для функций точки входа при помощи codegen
, и проверьте сгенерированный код.
Загрузите набор данных деятельности человека. Случайным образом переставьте данные.
load humanactivity rng(1); % For reproducibility n = numel(actid); p = size(feat,2); idx = randsample(n,n); X = feat(idx,:); actid = actid(idx);
Для получения дополнительной информации на наборе данных, введите Description
в командной строке.
Ответы могут быть одним из пяти классов: Нахождение, Положение, Обход, Выполнение или Танец. Разделите пополам ответ путем идентификации, неактивен ли предмет (actid
<= 2). Сохраните уникальные имена классов. Создание категориальных массивов.
classnames = categorical(["Idle" "NotIdle"]); Y = repmat(classnames(1),n,1); Y(actid > 2) = classnames(2);
Чтобы сгенерировать код для инкрементной классификации, необходимо соответственно сконфигурировать бинарную классификацию линейная модель для пошагового обучения incrementalClassificationLinear
.
Создайте бинарную модель (SVM) классификации для пошагового обучения. Полностью сконфигурируйте модель для генерации кода, задают все ожидаемые имена классов и количество переменных предикторов. Кроме того, задайте отслеживание misclassification уровня и потери стержня. Для воспроизводимости этот пример выключает перестановку наблюдения для инвариантного к масштабу решателя.
metrics = ["classiferror" "hinge"]; IncrementalMdl = incrementalClassificationLinear('ClassNames',classnames,'NumPredictors',p,... 'Shuffle',false,'Metrics',metrics)
IncrementalMdl = incrementalClassificationLinear IsWarm: 0 Metrics: [2x2 table] ClassNames: [Idle NotIdle] ScoreTransform: 'none' Beta: [60x1 double] Bias: 0 Learner: 'svm' Properties, Methods
Mdl
incremenalClassificationLinear
объект модели сконфигурирован для генерации кода. Mdl
является холодным (Mdl.IsWarm
0
) потому что это не обработало данные — коэффициентами является 0
.
В качестве альтернативы, потому что данные доступны, можно подбирать модель SVM к данным при помощи любого fitcsvm
или fitclinear
, и затем преобразуйте получившуюся модель в модель пошагового обучения путем передачи модели incrementalLearner
. Получившаяся модель является теплой, потому что она обработала данные — его коэффициенты являются, вероятно, ненулевыми.
saveLearnerForCoder
Сохраните модель пошагового обучения в файл InitialMdl.mat
при помощи saveLearnerForCoder
.
saveLearnerForCoder(IncrementalMdl,'InitialMdl');
saveLearnerForCoder
сохраняет модель пошагового обучения в двоичный файл MATLAB SVMClassIncrLearner.mat
как массивы структур в текущей папке.
Функция точки входа, также известная как или первичную функцию верхнего уровня, является функцией, которую вы задаете для генерации кода. Поскольку вы не можете вызвать функцию в верхнем уровне с помощью codegen
, необходимо задать функцию точки входа, которая вызывает включенные генерацией кода функции, и сгенерируйте код C/C++ для функции точки входа при помощи codegen
. Все функции в функции точки входа должны поддержать генерацию кода.
Задайте четыре отдельных функции точки входа в своей текущей папке, которые выполняют следующие действия:
myInitialModelIncrLearn.m
— Загрузите сохраненную модель при помощи loadLearnerForCoder
, и возвратите модель той же формы для генерации кода. Эта функция точки входа упрощает использование модели, возвращенной функцией точки входа, как вход к другой функции точки входа.
myUpdateMetricsIncrLearn.m
— Измерьте уровень текущей модели на входящем пакете данных и сохраните показатели производительности в модели. Функция принимает текущую модель, и предиктор и данные об ответе, и возвращает обновленную модель.
myFitIncrLearn.m
— Подбирайте текущую модель к входящему пакету данных и сохраните обновленные коэффициенты в модели. Функция принимает текущую модель, и предиктор и данные об ответе, и возвращает обновленную модель.
myPredictIncrLearn.m
— Предсказанные метки для входящего пакета данных с помощью текущей модели. Функция принимает текущую модель и данные о предикторе, и возвращает баллы класса и метки.
Для получения дополнительной информации о генерации кода для нескольких функций точки входа смотрите, Генерируют Код для Нескольких Функций Точки входа (MATLAB Coder).
Добавьте %#codegen
директива компилятора (или прагма) к функции точки входа после функциональной подписи, чтобы указать, что вы намереваетесь сгенерировать код для алгоритма MATLAB. Добавление этой директивы дает Анализатору кода MATLAB команду помогать вам диагностировать и зафиксировать нарушения, которые привели бы к ошибкам во время генерации кода. Смотрите Проверку кода с Анализатором кода (MATLAB Coder).
В качестве альтернативы можно получить доступ к функциям в mlr/examples/stats/main
, где mlr
значение matlabroot
.
Отобразите тело каждой функции.
type myInitialModelIncrLearn.m
function incrementalModel = myInitialModelIncrLearn() %#codegen % MYINITIALMODELINCRLEARN Load and return configured linear model for % binary classification InitialMdl incrementalModel = loadLearnerForCoder('InitialMdl'); end
type myUpdateMetricsIncrLearn.m
function incrementalModel = myUpdateMetricsIncrLearn(incrementalModel,X,Y) %#codegen % MYUPDATEMETRICSINCRLEARN Measure model performance metrics on new data incrementalModel = updateMetrics(incrementalModel,X,Y); end
type myFitIncrLearn.m
function incrementalModel = myFitIncrLearn(incrementalModel,X,Y) %#codegen % MYFITINCRLEARN Fit model to new data incrementalModel = fit(incrementalModel,X,Y); end
type myPredictIncrLearn.m
function [labels,scores] = myPredictIncrLearn(incrementalModel,X) %#codegen % MYPREDICTINCRLEARN Predict labels and classification scores on new data [labels,scores] = predict(incrementalModel,X); end
Настройте компилятор
Чтобы сгенерировать код C/C++, у вас должен быть доступ к компилятору C/C++, который сконфигурирован правильно. MATLAB Coder определяет местоположение и использует поддерживаемый, установленный компилятор. Можно использовать mex
-setup
просмотреть и изменить компилятор по умолчанию. Для получения дополнительной информации см. Компилятор Значения по умолчанию Изменения.
Создайте тип
MATLAB Coder может сгенерировать код для следующих типов сборки:
MEX (Исполняемый файл MATLAB) функция
Автономный код C/C++
Автономный код C/C++ скомпилирован к статической библиотеке
Автономный код C/C++ скомпилирован к динамически подключаемой библиотеке
Автономный код C/C++ скомпилирован к исполняемому файлу
Можно задать тип сборки с помощью -config
опция codegen
(MATLAB Coder). Для получения дополнительной информации об установке опций генерации кода смотрите -config
опция codegen
(MATLAB Coder) и конфигурирует настройки сборки (MATLAB Coder).
По умолчанию, codegen
генерирует MEX-функцию. MEX-функция является программой C/C++, которая является исполняемым файлом из MATLAB. Можно использовать MEX-функцию, чтобы ускорить алгоритмы MATLAB и протестировать сгенерированный код на функциональность и проблемы во время выполнения. Для получения дополнительной информации смотрите Ускорение алгоритма MATLAB (MATLAB Coder) и Зачем тестировать MEX-функции в MATLAB? (MATLAB Coder).
Сгенерируйте код Используя codegen
Поскольку C и C++ являются статически типизированными языками, необходимо задать свойства всех переменных в функции точки входа во время компиляции. Задайте все следующее:
Типы данных вводов данных точки входа функционируют при помощи coder.typeof
(MATLAB Coder). Кроме того, потому что количество наблюдений может варьироваться от пакета до пакета, указать, что количество наблюдений (первая размерность) имеет переменный размер. Для получения дополнительной информации смотрите, Задают Аргументы Переменного Размера для Code Generation and Specify Properties Входных параметров функции Точки входа (MATLAB Coder).
Поскольку несколько функций точки входа принимают инкрементный объект модели как вход, и работают с ним, создают представление объекта модели для генерации кода при помощи coder.OutputType
(MATLAB Coder). Для получения дополнительной информации смотрите Передачу Функция Точки входа Выход как Вход (MATLAB Coder).
predictorData = coder.typeof(X,[],[true false]);
responseData = coder.typeof(Y,[],true);
IncrMdlOutputType = coder.OutputType('myInitialModelIncrLearn');
Сгенерируйте код для функций точки входа с помощью codegen
(MATLAB Coder). Для каждого аргумента функции точки входа используйте -args
флаги, чтобы задать представления кодера переменных. Укажите, что выходная MEX-функция называет myIncrLearn_mex
.
codegen -o myIncrLearn_mex ... myInitialModelIncrLearn ... myUpdateMetricsIncrLearn -args {IncrMdlOutputType,predictorData,responseData} ... myFitIncrLearn -args {IncrMdlOutputType,predictorData,responseData} ... myPredictIncrLearn –args {IncrMdlOutputType,predictorData} -report
Code generation successful: To view the report, open('codegen/mex/myIncrLearn_mex/html/report.mldatx')
Для проблем генерации кода отладки справки просмотрите сгенерированный код C/C++ путем нажатия на View report
(см. отчеты генерации кода (MATLAB Coder)).
Протестируйте MEX-функцию, чтобы проверить, что сгенерированный код обеспечивает ту же функциональность как оригинальный код MATLAB. Чтобы выполнить этот тест, запустите MEX-функцию с помощью тех же входных параметров, что вы раньше запускали оригинальный код MATLAB, и затем сравнивали результаты. Выполнение MEX-функции в MATLAB прежде, чем сгенерировать автономный код также позволяет вам обнаружить и зафиксировать ошибки времени выполнения, которые намного более трудно диагностировать в сгенерированном автономном коде. Для получения дополнительной информации смотрите Зачем тестировать MEX-функции в MATLAB? (MATLAB Coder).
Выполните пошаговое обучение при помощи сгенерированных MEX-функций и непосредственно при помощи объектных функций. Задайте пакет
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]); hinge = ce; ceCG = ce; hingeCG = ce; IncrementalMdlCG = myIncrLearn_mex('myInitialModelIncrLearn'); scores = zeros(n,2); scoresCG = zeros(n,2); % Incremental fitting for j = 1:nchunk ibegin = min(n,numObsPerChunk*(j-1) + 1); iend = min(n,numObsPerChunk*j); idx = ibegin:iend; IncrementalMdl = updateMetrics(IncrementalMdl,X(idx,:),Y(idx)); ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:}; hinge{j,:} = IncrementalMdl.Metrics{"HingeLoss",:}; IncrementalMdlCG = myIncrLearn_mex('myUpdateMetricsIncrLearn',IncrementalMdlCG,... X(idx,:),Y(idx)); ceCG{j,:} = IncrementalMdlCG.Metrics{"ClassificationError",:}; hingeCG{j,:} = IncrementalMdlCG.Metrics{"HingeLoss",:}; IncrementalMdl = fit(IncrementalMdl,X(idx,:),Y(idx)); IncrementalMdlCG = myIncrLearn_mex('myFitIncrLearn',IncrementalMdlCG,X(idx,:),Y(idx)); [~,scores(idx,:)] = predict(IncrementalMdl,X(idx,:)); [~,scoresCG(idx,:)] = myIncrLearn_mex('myPredictIncrLearn',IncrementalMdlCG,X(idx,:)); end
Сравните совокупные метрики и музыку к классификации Idle
возвращенный объектными функциями и MEX-функциями.
idx = all(~isnan(ce.Variables),2); areCEsEqual = norm(ce.Cumulative(idx) - ceCG.Cumulative(idx))
areCEsEqual = 8.9904e-18
idx = all(~isnan(hinge.Variables),2); areHingeLossesEqual = norm(hinge.Cumulative(idx) - hingeCG.Cumulative(idx))
areHingeLossesEqual = 9.5220e-17
areScoresEqual = norm(scores(:,1) - scoresCG(:,1))
areScoresEqual = 8.7996e-13
Различия между возвращенными количествами незначительны.