Генерация кода для пошагового обучения

В этом примере показано, как сгенерировать код, который реализует пошаговое обучение для бинарной линейной классификации. Чтобы мотивировать его цель, считайте обучение носимым устройством определенный задачу, чтобы определить, неактивен ли владелец или перемещение, на основе сенсорных функций чтения устройства.

Сгенерированный код выполняет следующие задачи, как задано в функциях точки входа:

  1. Загрузите сконфигурированный шаблон модели пошагового обучения, созданный в командной строке.

  2. Отследите показатели производительности на входящем пакете данных из потока данных. Этот пример отслеживает misclassification уровень и потерю стержня.

  3. Обновите модель, подбирая инкрементную модель к пакету данных.

  4. Предсказывает метки для пакета данных.

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

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

Различия между возвращенными количествами незначительны.