generateLearnerDataTypeFcn

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

Описание

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

  • После обучения модель машинного обучения сохраните использование модели 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 функция модели.

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

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

Примеры

свернуть все

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

Прежде, чем сгенерировать код с помощью codegen, можно использовать buildInstrumentedMex (Fixed-Point Designer) и showInstrumentationResults (Fixed-Point Designer), чтобы оптимизировать типы данных с фиксированной точкой, чтобы улучшать производительность фиксированной точки. Запишите минимальные и максимальные значения именованных и внутренних переменных для предсказания при помощи 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 (Fixed-Point Designer). Объект фиксированной точки задает свойства типа данных с фиксированной точкой, такие как размер слова и дробная длина. Например, отобразите свойства типа данных с фиксированной точкой данных о предикторе.

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 (Fixed-Point Designer) функция.

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 может быть одно из следующего:

Расширение 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).

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

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

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

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

Модель классификации

Модельpredict Функция моделиВыходной аргумент
Дерево решенийpredictscore
Ансамбль деревьев решенийpredictscore
SVMpredictscore

Модель регрессии

Модельpredict Функция моделиВыходной аргумент
Дерево решенийpredictYfit
Ансамбль деревьев решенийpredictYfit
SVMpredictyfit

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

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

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

Пример: '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 (Fixed-Point Designer). Входной параметр dt задает DataType свойство объекта фиксированной точки.

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

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

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

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

ОписаниеПоля
Общие поля для классификации
  • XDataType входной параметр

  • ScoreDataType (выходная или внутренняя переменная) и TransformedScoreDataType вывод

    • Если вы обучаете модель с помощью 'ScoreTransform' по умолчанию значение 'none' или 'identity' (то есть, вы не преобразовываете предсказанные баллы), затем ScoreDataType поле влияет на точность выходных баллов.

    • Если вы обучаете модель с помощью значения 'ScoreTransform' кроме 'none' или 'identity' (то есть, вы действительно преобразовываете предсказанные баллы), затем ScoreDataType поле влияет на точность внутренних непреобразованных баллов. TransformedScoreDataType поле влияет на точность преобразованных выходных баллов.

Общие поля для регрессии
  • XDataType входной параметр

  • YFitDataType вывод

Дополнительные поля для ансамбля деревьев решений
  • WeakLearnerOutputDataType (внутренняя переменная) — Тип данных для выходных параметров от слабых учеников.

  • AggregatedLearnerWeightsDataType (внутренняя переменная) — Тип данных для взвешенного агрегата выходных параметров от слабых учеников, применимых, только если вы обучаете укладывание в мешки использования модели ('Method','bag'). Программное обеспечение вычисляет предсказанные баллы (ScoreDataType) путем деления агрегата на сумму весов ученика.

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

  • InnerProductDataType (внутренняя переменная)

Программное обеспечение предлагает максимальную дробную длину, которая не вызывает переполнение, на основе размера слова по умолчанию (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). Для каждой переменной можно настроить размер слова и фракционировать длину и задать математические настройки фиксированной точки с помощью a fimath Объект (Fixed-Point Designer).

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

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

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

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

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

Вопросы совместимости

развернуть все

Поведение изменяется в R2020a

Смотрите также

| | (Fixed-Point Designer) | (Fixed-Point Designer) | (Fixed-Point Designer) | (MATLAB Coder)

Введенный в R2019b