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 набор данных и train двоичной модели классификации 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 открывает папку примера. Эта папка включает файл функции точки входа.

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

The 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)}
Code generation successful.

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 возвращает логический 1 (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' и вектор символов или строковый скаляр. The 'OutputFunctionName' значение должно быть допустимым именем функции MATLAB.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

расширить все

Поведение изменено в R2020a

Введенный в R2019b