generateLearnerDataTypeFcn

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

Описание

Сгенерировать фиксированную точку код C/C++ для predict функция модели машинного обучения, используйте generateLearnerDataTypeFcn, saveLearnerForCoder, loadLearnerForCoder, и codegen.

  • После обучения модель машинного обучения сохраните модель с помощью saveLearnerForCoder.

  • Создайте структуру, которая задает типы данных с фиксированной точкой при помощи функции, сгенерированной от generateLearnerDataTypeFcn.

  • Задайте функцию точки входа, которая загружает модель при помощи обоих loadLearnerForCoder и структура, и затем вызывает predict функция.

  • Сгенерируйте код с помощью codegen, и затем проверьте сгенерированный код.

generateLearnerDataTypeFcn функция требует Fixed-Point Designer™, и генерирующий фиксированную точку, код C/C++ требует MATLAB® Coder™ и Fixed-Point Designer.

Эта блок-схема показывает рабочий процесс генерации фиксированной точки для predict функция модели машинного обучения. Используйте generateLearnerDataTypeFcn для подсвеченного шага.

пример

generateLearnerDataTypeFcn(filename,X) генерирует функцию типа данных, которая задает типы данных с фиксированной точкой для переменных, требуемых сгенерировать фиксированную точку код C/C++ для прогноза модели машинного обучения. filename хранит модель машинного обучения и X содержит данные о предикторе для predict функция модели. Необходимо создать filename при помощи saveLearnerForCoder, и модель в filename должна быть модель классификации SVM или модель регрессии SVM.

Используйте сгенерированную функцию, чтобы создать структуру, которая задает типы данных с фиксированной точкой. Затем используйте структуру в качестве входного параметра T из loadLearnerForCoder.

generateLearnerDataTypeFcn(filename,X,Name,Value) задает дополнительные опции при помощи одного или нескольких аргументов пары "имя-значение". Например, можно задать 'WordLength',32 использовать 32-битный размер слова в типах данных с фиксированной точкой.

Примеры

свернуть все

После обучения модель машинного обучения сохраните модель с помощью saveLearnerForCoder. Для генерации фиксированной точки задайте типы данных с фиксированной точкой переменных, требуемых для прогноза при помощи функции типа данных, сгенерированной generateLearnerDataTypeFcn. Затем задайте функцию точки входа, которая загружает модель при помощи обоих loadLearnerForCoder и заданные типы данных с фиксированной точкой и вызовы predict функция модели. Используйте codegen сгенерировать фиксированную точку код C/C++ для функции точки входа, и затем проверить сгенерированный код.

Прежде, чем сгенерировать код с помощью codegen, можно использовать buildInstrumentedMex и showInstrumentationResults оптимизировать типы данных с фиксированной точкой, чтобы улучшать производительность фиксированной точки. Запишите минимальные и максимальные значения именованных и внутренних переменных для прогноза при помощи buildInstrumentedMex. Просмотрите результаты инструментирования с помощью showInstrumentationResults; затем, на основе результатов, настройте свойства типа данных с фиксированной точкой переменных. Для получения дополнительной информации относительно этого дополнительного шага, смотрите Генерацию Фиксированной точки для Прогноза SVM.

Обучите модель

Загрузите ionosphere набор данных и обучает бинарную модель классификации SVM.

load ionosphere
Mdl = fitcsvm(X,Y,'KernelFunction','gaussian');

Mdl ClassificationSVM модель.

Сохраните модель

Сохраните модель классификации SVM в файл myMdl.mat при помощи saveLearnerForCoder.

saveLearnerForCoder(Mdl,'myMdl');

Задайте типы данных с фиксированной точкой

Используйте generateLearnerDataTypeFcn сгенерировать функцию, которая задает типы данных с фиксированной точкой переменных, требуемых для прогноза модели SVM.

generateLearnerDataTypeFcn('myMdl',X)

generateLearnerDataTypeFcn генерирует myMdl_datatype функция.

Создайте структуру T это задает типы данных с фиксированной точкой при помощи myMdl_datatype.

T = myMdl_datatype('Fixed')
T = struct with fields:
               XDataType: [0x0 embedded.fi]
           ScoreDataType: [0x0 embedded.fi]
    InnerProductDataType: [0x0 embedded.fi]

Структура T включает поля для именованных и внутренних переменных, требуемых запускать predict функция. Каждое поле содержит объект фиксированной точки, возвращенный fi. Объект фиксированной точки задает свойства типа данных с фиксированной точкой, такие как размер слова и дробная длина. Например, отобразите свойства типа данных с фиксированной точкой данных о предикторе.

T.XDataType
ans = 

[]

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 14

        RoundingMethod: Floor
        OverflowAction: Wrap
           ProductMode: FullPrecision
  MaxProductWordLength: 128
               SumMode: FullPrecision
      MaxSumWordLength: 128

Задайте функцию точки входа

Задайте функцию с именем точки входа myFixedPointPredict это делает следующее:

  • Примите данные о предикторе X и структура типа данных с фиксированной точкой T.

  • Загрузите версию фиксированной точки обученной модели классификации SVM при помощи обоих loadLearnerForCoder и структура T.

  • Предскажите метки и баллы с помощью загруженной модели.

type myFixedPointPredict.m % Display contents of myFixedPointPredict.m file
function [label,score] = myFixedPointPredict(X,T) %#codegen
Mdl = loadLearnerForCoder('myMdl','DataType',T);
[label,score] = predict(Mdl,X);
end

Примечание: Если вы нажимаете кнопку, расположенную в верхнем правом разделе этого примера, и открываете пример в MATLAB®, затем MATLAB открывает папку в качестве примера. Эта папка включает файл функции точки входа.

Сгенерируйте код

XDataType поле структуры T задает тип данных с фиксированной точкой данных о предикторе. Преобразуйте X к типу, заданному в T.XDataType при помощи cast функция.

X_fx = cast(X,'like',T.XDataType);

Сгенерируйте код для функции точки входа использование codegen. Задайте X_fx и постоянный свернутый T как входные параметры функции точки входа.

codegen myFixedPointPredict -args {X_fx,coder.Constant(T)}

codegen генерирует MEX-функцию myFixedPointPredict_mex с зависимым платформой расширением.

Проверьте сгенерированный код

Передайте данные о предикторе predict и myFixedPointPredict_mex сравнить выходные параметры.

[labels,scores] = predict(Mdl,X);
[labels_fx,scores_fx] = myFixedPointPredict_mex(X_fx,T);

Сравните выходные параметры от predict и myFixedPointPredict_mex.

verify_labels = isequal(labels,labels_fx)
verify_labels = logical
   1

isequal возвращает (TRUE) логическую единицу, что означает labels и labels_fx равны. Если метки не равны, можно вычислить процент неправильно классифицированных меток можно следующим образом.

sum(strcmp(labels_fx,labels)==0)/numel(labels_fx)*100
ans = 0

Найдите максимум относительных различий между счетом выходными параметрами.

relDiff_scores = max(abs((scores_fx.double(:,1)-scores(:,1))./scores(:,1)))
relDiff_scores = 0.0055

Если вы не удовлетворены результатами сравнения и хотите улучшить точность сгенерированного кода, можно настроить типы данных с фиксированной точкой и регенерировать код. Для получения дополнительной информации смотрите Советы в generateLearnerDataTypeFcn, Функция типа данных и генерация фиксированной точки для прогноза SVM.

Входные параметры

свернуть все

Имя MATLAB отформатировало двоичный файл (MAT-файл), который содержит массив структур, представляющий объект модели, заданный как скаляр строки или вектор символов.

Необходимо создать filename файл с помощью saveLearnerForCoder, и модель в filename файл должен быть моделью классификации SVM (CompactClassificationSVM) или модель регрессии SVM (CompactRegressionSVM).

Расширение filename файлом должен быть .mat. Если filename не имеет никакого расширения, затем generateLearnerDataTypeFcn добавляет .mat.

Если filename не включает полный путь, затем generateLearnerDataTypeFcn загружает файл от текущей папки.

Пример: 'myMdl'

Типы данных: char | string

Данные о предикторе для predict функция модели сохранена в filename, заданный, когда n-by-p числовая матрица, где n является количеством наблюдений и p, является количеством переменных предикторов.

Типы данных: single | double

Аргументы в виде пар имя-значение

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: generateLearnerDataTypeFcn(filename,X,'OutputFunctionName','myDataTypeFcn','WordLength',32) генерирует функцию с именем типа данных myDataTypeFcn это использует 32 бита в размере слова при определении типа данных с фиксированной точкой для каждой переменной.

Имя сгенерированной функции, заданной как разделенная запятой пара, состоящая из 'OutputFunctionName' и вектор символов или скаляр строки. 'OutputFunctionName' значение должно быть допустимым именем функции MATLAB.

Имя функции по умолчанию является именем файла в filename сопровождаемый _datatype. Например, если filename myMdl, затем именем функции по умолчанию является myMdl_datatype.

Пример: 'OutputFunctionName','myDataTypeFcn'

Типы данных: char | string

Размер слова в битах, заданных как разделенная запятой пара, состоящая из 'WordLength' и числовой скаляр.

Сгенерированная функция типа данных задает объект фиксированной точки для каждой переменной с помощью заданного 'WordLength' значение. Если переменная требует более длинного размера слова, чем заданное значение, программное обеспечение удваивает размер слова для переменной.

Оптимальный размер слова зависит от ваших свойств целевого компьютера. Когда заданный размер слова более длинен, чем самый долгий размер слова вашего целевого компьютера, сгенерированный код содержит операции многословные.

Для получения дополнительной информации смотрите Типы данных с фиксированной точкой (Fixed-Point Designer) и Глоссарий (Fixed-Point Designer).

Пример: 'WordLength',32

Типы данных: single | double

Область значений выходного аргумента predict функция, заданная как разделенная запятой пара, состоящая из 'OutputRange' и числовой вектор двух элементов (минимальные и максимальные значения выхода). Программное обеспечение определяет промежуток чисел, которые данные фиксированной точки могут представлять при помощи 'OutputRange' значение и 'PercentSafetyMargin' значение.

Когда X содержит большое количество наблюдений, и область значений для выходного аргумента известна, задайте 'OutputRange' значение, чтобы уменьшать объем расчета. Если вы не задаете 'OutputRange' значение, затем программное обеспечение симулирует выходную область значений с помощью данных о предикторе X и predict функция.

Эта таблица приводит выходные аргументы, для которых можно указать диапазон при помощи 'OutputRange' аргумент пары "имя-значение".

Модельpredict Функция моделиВыходные аргументы
Классификация SVMpredictscore (баллы или апостериорные вероятности)
Регрессия SVMpredictyfit (предсказанные ответы)

Пример: 'OutputRange',[0,1]

Типы данных: single | double

Процент запаса прочности, заданный как разделенная запятой пара, состоящая из 'PercentSafetyMargin' и числовой скаляр.

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

Соблюдите осторожность, когда вы зададите 'PercentSafetyMargin' значение. Если переменный диапазон является большим, то увеличение запаса прочности может вызвать потерю значимости, потому что программное обеспечение уменьшает дробную длину, чтобы представлять большую область значений с помощью данного размера слова.

Пример: 'PercentSafetyMargin',15

Типы данных: single | double

Больше о

свернуть все

Функция типа данных

Используйте функцию типа данных, сгенерированную generateLearnerDataTypeFcn создать структуру, которая задает типы данных с фиксированной точкой для переменных, требуемых сгенерировать фиксированную точку код C/C++ для прогноза модели машинного обучения. Используйте структуру output функции типа данных как входной параметр T из loadLearnerForCoder.

Если filename 'myMdl', затем generateLearnerDataTypeFcn генерирует функцию с именем типа данных myMdl_datatype. myMdl_datatype функция поддерживает этот синтаксис:

T = myMdl_datatype(dt)

T = myMdl_datatype(dt) возвращает структуру типа данных, которая задает типы данных для переменных, требуемых сгенерировать фиксированную точку код C/C++ для прогноза модели машинного обучения.

Каждое поле T содержит объект фиксированной точки, возвращенный fi. Входной параметр dt задает DataType свойство объекта фиксированной точки.

  • Задайте dt как 'Fixed'(значение по умолчанию) для генерации фиксированной точки.

  • Задайте dt как 'Double' симулировать поведение с плавающей точкой фиксированной точки.

Используйте структуру output T как второй входной параметр loadLearnerForCoder.

Структура T содержит поля в этой таблице. Эти поля задают типы данных для переменных, которые непосредственно влияют на точность модели. Эти переменные, наряду с другими именованными и внутренними переменными, требуются запустить predict функция модели.

МодельПоля
Классификация SVM

  • XDataType (введите), ScoreDataType (выведите), InnerProductDataType (скалярное произведение)

  • XnormDataType (внутренняя переменная), применимая, только если вы обучаете модель с помощью 'Standardize' или 'KernelScale'

Регрессия SVM

  • XDataType (введите), YFitDataType (выведите), InnerProductDataType (скалярное произведение)

  • XnormDataType (внутренняя переменная), применимая, только если вы обучаете модель с помощью 'Standardize' или 'KernelScale'

Программное обеспечение предлагает максимальную дробную длину, которая не вызывает переполнение, на основе размера слова по умолчанию (16) и запас прочности (10%) для каждой переменной.

Следующий код показывает функции типа данных myMdl_datatype, сгенерированный generateLearnerDataTypeFcn когда filename 'myMdl' и модель в filename файл является классификатором SVM.

function T = myMdl_datatype(dt)

if nargin < 1
	dt = 'Fixed';
end

% Set fixed-point math settings
fm = fimath('RoundingMethod','Floor', ...
    'OverflowAction','Wrap', ...
    'ProductMode','FullPrecision', ...
    'MaxProductWordLength',128, ...
    'SumMode','FullPrecision', ...
    'MaxSumWordLength',128);

% Data type for predictor data
T.XDataType = fi([],true,16,14,fm,'DataType',dt);

% Data type for output score
T.ScoreDataType = fi([],true,16,14,fm,'DataType',dt);

% Internal variables
% Data type of the squared distance dist = (x-sv)^2 for the Gaussian kernel G(x,sv) = exp(-dist),
% where x is the predictor data for an observation and sv is a support vector
T.InnerProductDataType = fi([],true,16,6,fm,'DataType',dt);

end

Советы

  • Чтобы улучшить точность сгенерированной фиксированной точки, можно настроить типы данных с фиксированной точкой. Измените типы данных с фиксированной точкой путем обновления функции типа данных (myMdl_datatype) и создание новой структуры, и затем регенерирует код с помощью новой структуры. Можно обновить myMdl_datatype функция одним из двух способов:

    • Регенерируйте myMdl_datatype функция при помощи generateLearnerDataTypeFcn и его аргументы пары "имя-значение".

      • Увеличьте размер слова при помощи 'WordLength' аргумент пары "имя-значение".

      • Уменьшите запас прочности при помощи 'PercentSafetyMargin' аргумент пары "имя-значение".

      Если вы увеличиваете размер слова или уменьшаете запас прочности, программное обеспечение может предложить более долгую дробную длину, и поэтому, улучшить точность сгенерированного кода на основе набора определенных данных.

    • Вручную измените типы данных с фиксированной точкой в файле функции (myMdl_datatype.m). Для каждой переменной можно настроить размер слова и фракционировать длину и задать математические настройки фиксированной точки с помощью fimath объект.

  • В сгенерированной фиксированной точке большое количество операций или большого переменного диапазона может привести к потере точности, сравненной с точностью соответствующего кода с плавающей точкой. Когда обучение режим SVM, помните о следующих советах, чтобы избежать потери точности в сгенерированной фиксированной точке:

    • Стандартизация данных ('Standardize') — Чтобы избежать переполнения в значениях свойств модели векторов поддержки в модели SVM, можно стандартизировать данные о предикторе. Вместо того, чтобы использовать 'Standardize' аргумент пары "имя-значение", когда обучение модель, стандартизируйте данные о предикторе прежде, чем передать данные подходящей функции и predict функционируйте так, чтобы фиксированная точка не включала операции для стандартизации.

    • Функция ядра ('KernelFunction') — Используя Гауссово ядро или линейное ядро предпочтительно для использования полиномиального ядра. Полиномиальное ядро требует более высокой вычислительной сложности, чем другие ядра, и выход полиномиальной функции ядра неограничен.

    • Шкала ядра ('KernelScale') — Используя шкалу ядра требует дополнительных операций если значение 'KernelScale' не 1.

    • Прогноз проблемы классификации одного класса может иметь потерю точности, если предсказанные значения счета класса имеют большой спектр.

Введенный в R2019b