В этом примере показано, как создать код, реализующий инкрементное обучение для двоичной линейной классификации. Чтобы мотивировать свою цель, рассмотрите возможность обучения носимого устройства, которому поручено определить, простаивает или движется пользователь, на основе сенсорных признаков, которые считывает устройство.
Созданный код выполняет следующие задачи, как определено в функциях точки входа:
Загрузите настроенный шаблон модели инкрементного обучения, созданный в командной строке.
Отслеживание показателей производительности для входящего пакета данных из потока данных. В этом примере отслеживается скорость неправильной классификации и потери шарнира.
Обновление модели путем подгонки инкрементной модели к пакету данных.
Предсказывает метки для пакета данных.
В этом примере создается код из командной строки MATLAB ®, но вместо этого можно создать код с помощью приложения MATLAB ® Coder™. Дополнительные сведения см. в разделе Создание кода для прогнозирования модели машинного обучения с помощью приложения MATLAB Coder App.
Все инкрементные функции объекта обучения для двоичной линейной классификации (а также линейной регрессии) поддерживают генерацию кода. Чтобы подготовить код для создания для инкрементного обучения, функции объекта требуют соответствующего настроенного объекта модели инкрементного обучения, но -args вариант codegen (Кодер MATLAB) не принимает эти объекты. Чтобы обойти это ограничение, используйте saveLearnerForCoder и loadLearnerForCoder функции.
На этой блок-схеме показаны рабочие процессы создания кода для инкрементных функций объекта обучения для линейных моделей.

Блок-схема предполагает два различных, но объединяющих потока операций.
Рабочий процесс, начинающийся с команды Модель поезда (Train Model) > Преобразовать модель (Convert Model), требует данных. В этом случае можно дополнительно выбрать элемент или оптимизировать модель, выполнив перекрестную проверку перед созданием кода для инкрементного обучения.
Рабочий процесс, начинающийся с настройки модели, не требует данных. Вместо этого необходимо вручную настроить объект модели инкрементного обучения.
Дополнительные сведения о различиях между рабочими процессами и о том, как решить, какой из них использовать, см. в разделе Настройка модели инкрементного обучения.
Независимо от выбранного рабочего процесса результирующая модель инкрементного обучения должна обладать следующими качествами:
NumPredictors свойство отражает количество предикторов в данных предиктора во время инкрементного обучения.
Для классификации, ClassNames свойство должно содержать все имена классов, ожидаемые во время инкрементного обучения.
Если выбран рабочий процесс Модель поезда > Преобразовать модель и модель соответствует данным, содержащим все известные классы, модель настраивается для создания кода.
После подготовки модели инкрементного обучения сохраните объект модели с помощью 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) для инкрементного обучения. Полностью сконфигурируйте модель для генерации кода, указав все ожидаемые имена классов и количество переменных предиктора. Кроме того, укажите отслеживание коэффициента неправильной классификации и потери шарнира. Для воспроизводимости этот пример отключает тасование наблюдений для инвариантного по масштабу решателя.
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).
Добавить %#codegen директива компилятора (или прагматика) для функции начального уровня после сигнатуры функции, указывающая, что предполагается создать код для алгоритма MATLAB. Добавление этой директивы дает команду анализатору кода MATLAB помочь в диагностике и устранении нарушений, которые могут привести к ошибкам при создании кода. См. раздел Проверка кода с помощью анализатора кода (кодер MATLAB).
Кроме того, можно получить доступ к функциям в mlr/examples/stats/main, где mlr - значение matlabroot.
Отображение тела каждой функции.
type myInitialModelIncrLearn.mfunction incrementalModel = myInitialModelIncrLearn() %#codegen
% MYINITIALMODELINCRLEARN Load and return configured linear model for
% binary classification InitialMdl
incrementalModel = loadLearnerForCoder('InitialMdl');
end
type myUpdateMetricsIncrLearn.mfunction incrementalModel = myUpdateMetricsIncrLearn(incrementalModel,X,Y) %#codegen
% MYUPDATEMETRICSINCRLEARN Measure model performance metrics on new data
incrementalModel = updateMetrics(incrementalModel,X,Y);
end
type myFitIncrLearn.mfunction incrementalModel = myFitIncrLearn(incrementalModel,X,Y) %#codegen
% MYFITINCRLEARN Fit model to new data
incrementalModel = fit(incrementalModel,X,Y);
end
type myPredictIncrLearn.mfunction [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 может генерировать код для следующих типов сборки:
Функция MEX (MATLAB Executable)
Автономный код C/C + +
Автономный код C/C + +, скомпилированный в статическую библиотеку
Автономный код C/C + +, скомпилированный в динамически связанную библиотеку
Автономный код C/C + +, скомпилированный в исполняемый файл
Тип сборки можно указать с помощью -config вариант codegen (Кодер MATLAB). Дополнительные сведения о настройке параметров генерации кода см. в разделе -config вариант codegen (Кодер MATLAB) и Настройка параметров построения (Кодер MATLAB).
По умолчанию codegen генерирует функцию MEX. Функция MEX - это программа C/C + +, выполняемая из MATLAB. Функцию MEX можно использовать для ускорения алгоритмов MATLAB и тестирования сгенерированного кода на наличие проблем функциональности и времени выполнения. Дополнительные сведения см. в разделах Ускорение алгоритма MATLAB (кодер MATLAB) и Зачем тестировать функции MEX в MATLAB? (Кодер MATLAB).
Создать код с помощью codegen
Поскольку C и C++ являются статически типизированными языками, необходимо указать свойства всех переменных в функции точки входа во время компиляции. Укажите все следующие параметры:
Типы данных входных данных функций точки входа с помощью coder.typeof (Кодер MATLAB). Кроме того, поскольку количество наблюдений может варьироваться от партии к партии, укажите, что количество наблюдений (первое измерение) имеет переменный размер. Дополнительные сведения см. в разделах Определение аргументов переменного размера для генерации кода и Определение свойств входов функции точки входа (кодер MATLAB).
Поскольку несколько функций точки входа принимают инкрементный объект модели в качестве входных данных и работают с ним, создайте представление объекта модели для создания кода с помощью coder.OutputType (Кодер MATLAB). Дополнительные сведения см. в разделе Передача вывода функции точки входа в качестве ввода (кодер MATLAB).
predictorData = coder.typeof(X,[],[true false]);
responseData = coder.typeof(Y,[],true);
IncrMdlOutputType = coder.OutputType('myInitialModelIncrLearn');Создание кода для функций точки входа с помощью codegen (Кодер MATLAB). Для каждого аргумента функции точки входа используйте -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)).
Протестируйте функцию MEX для проверки того, что сгенерированный код обеспечивает те же функциональные возможности, что и исходный код MATLAB. Для выполнения этого теста запустите функцию MEX, используя те же входные данные, которые использовались для запуска исходного кода MATLAB, а затем сравните результаты. Запуск функции MEX в MATLAB перед созданием автономного кода также позволяет обнаруживать и исправлять ошибки времени выполнения, которые гораздо сложнее диагностировать в сгенерированном автономном коде. Дополнительные сведения см. в разделе Зачем тестировать функции MEX в MATLAB? (Кодер MATLAB).
Выполнение инкрементного обучения с использованием сгенерированных функций 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 = 8.4704e-17
areScoresEqual = norm(scores(:,1) - scoresCG(:,1))
areScoresEqual = 8.8356e-13
Различия между возвращенными количествами незначительны.