exponenta event banner

generateLearnerDataTypeFcn

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

Описание

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

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

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

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

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

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

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

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)}
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-за-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' значение. Если переменная требует большую длину слова, чем указанное значение, программа удваивает длину слова для переменной.

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

Дополнительные сведения см. в разделе Типы данных фиксированных точек (конструктор фиксированных точек).

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

Использовать структуру вывода 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). Для каждой переменной можно настроить длину слова и длину дроби и задать математические настройки с фиксированной точкой с помощью fimath (Конструктор фиксированных точек).

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

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

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

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

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

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

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

В R2020a изменилось поведение

См. также

| | (Конструктор фиксированных точек) | (Конструктор фиксированных точек) | (Конструктор фиксированных точек) | (Кодер MATLAB)

Представлен в R2019b