Привязка модели
Модель машинного обучения имеет выходные и выходные признаки для передачи информации в модель и из нее.
Выполнив загрузку модели в объект LearningModel, вы можете применить LearningModel.InputFeatures и LearningModel.OutputFeatures для получения объектов ILearningModelFeatureDescriptor. Они позволяют получить списки ожидаемых типов входных и выходных признаков модели.
Используйте LearningModelBinding для привязки значений к этим признакам, указав ссылку на ILearningModelFeatureDescriptor по значению свойства Name (Имя).
В следующем видео представлен краткий обзор процесса привязки признаков для модели машинного обучения.
Типы функций
Windows ML поддерживает все типы признаков ONNX, которые перечислены в LearningModelFeatureKind. Они сопоставляются с разными классами дескрипторов признаков.
- Тензор:TensorFeatureDescriptor
- Последовательность:SequenceFeatureDescriptor
- Сопоставление:MapFeatureDescriptor
- Изображение:ImageFeatureDescriptor
Тензоры
Тензорами называют многомерные массивы, из которых наиболее распространены тензоры с 32-разрядными значениями с плавающей запятой. Размерности тензоров развертываются по строкам, а каждая размерность представлена плотно упакованными смежными данными. Общий размер тензора вычисляется как произведение размеров каждого измерения.
Последовательности
Последовательности — это векторы значений. Типы последовательностей чаще всего применяются для хранения вектора вероятностей с плавающей запятой, которые некоторые модели классификации возвращают как оценку точности каждого прогноза.
Maps
Карты содержат информацию в формате пар "ключ — значение". Модели классификации часто возвращают карту строковых значений и чисел с плавающей запятой, которые обозначают численную вероятность для каждой метки имен классификации. Например, выходные данные модели, прогнозирующей породу собаки на изображении, могут выглядеть так: ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6]
.
Скаляры
Большинство карт и последовательностей содержат скалярные значения. Они используются, когда значение TensorFeatureDescriptor.Shape.Size равно нулю (0). В этом случае карта или последовательность будет иметь скалярный тип. Наиболее распространенным является float
. Например, карта сопоставления строк с числами с плавающей запятой будет выглядеть следующим образом:
MapFeatureDescriptor.KeyKind == TensorKind.String
MapFeatureDescriptor.ValueDescriptor.Kind == LearningModelFeatureKind.Tensor
MapFeatureDescriptor.ValueDescriptor.as<TensorFeatureDescriptor>().Shape.Size == 0
Фактическое значение признака карты выражается как IMap<string, float>
.
Последовательность карт
Последовательность карт является простым вектором пар "ключ — значение". Например, последовательность карт для сопоставления строк и чисел с плавающей запятой будет иметь тип IVector<IMap<string, float>>
. Приведенные выше выходные данные прогнозирования породы собак ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6]
типичный пример последовательности карт.
Изображения
При работе с изображениями важно понимать форматы изображений и процесс преобразования в тензор.
Форматы изображений
Модели обучаются по обучающему набору изображений, для которого подбираются и сохраняются весовые коэффициенты. Формат изображения, передаваемого в качестве входных данных в эту модель, должен соответствовать формату обучающих изображений.
Во многих случаях модель сама описывает ожидаемый формат изображений. Например, модели ONNX могут использовать метаданные для описания ожидаемых форматов.
В большинстве моделей, хотя и не во всех, используются следующие форматы.
- Image.BitmapPixelFormat: Bgr8
- Image.ColorSpaceGamma: SRGB
- Image.NominalPixelRange: NominalRange_0_255
Преобразование в тензор
В Windows ML изображения представлены в формате тензоров. Преобразование изображения в тензор выполняется во время привязки.
Windows ML позволяет преобразовать изображения в 4-мерные тензоры 32-разрядных чисел с плавающей запятой (формат NCHW).
- N: размер пакета (количество изображений). В настоящее время Windows ML поддерживает только размер пакета N=1.
- C: число каналов (1 для формата Gray8 или 3 для Bgr8).
- H: высота изображения.
- W: ширина изображения.
Каждый пиксель на изображении представлен 8-разрядным значением цвета в диапазоне от 0 до 255, которые упаковываются в 32-разрядные числа с плавающей запятой.
Передача изображений в модель
Существует два способа передать изображения в модель.
-
Мы рекомендуем использовать объект ImageFeatureValue для привязки изображений в качестве входных и выходных данных, так как он выполняет преобразование формата и преобразование в тензор в соответствии с требованиями модели к изображениям. В настоящее время для моделей поддерживаются следующие типы форматов: Gray8, Rgb8 и Bgr8 с диапазоном значений пикселей от 0 до 255.
Вы можете создать ImageFeatureValue с помощью статического метода ImageFeatureValue.CreateFromVideoFrame.
Чтобы узнать, какой формат нужен для модели, WinML использует следующую логику и порядок очередности.
- Bind(String, Object, IPropertySet) переопределяет все параметры изображения.
- После этого проверяются и применяются метаданные модели, если они доступны.
- Если для модели не предоставлено ни метаданных, ни свойств от вызывающей стороны, среда выполнения пытается выбрать лучшее соответствие.
- Если тензор имеет формат, близкий к NCHW (4-мерный со значениями float32, где N==1), среда выполнения применит формат Gray8 (C==1) или Bgr8 (C==3) в зависимости от количества каналов.
- Подразумевается NominalRange_0_255
- Подразумевается SRGB
В вызов Bind(String, Object, IPropertySet) можно передать несколько необязательных свойств.
- BitmapBounds. Это свойство используется для обозначения границ для обрезки перед отправкой изображения в модель.
- BitmapPixelFormat. Это свойство используется как формат пикселей для модели во время преобразования изображения.
Для размера изображений в модели можно указать определенную форму (например, SqueezeNet принимает размер 224×224) или произвольные размеры для изображения любой формы (многие модели типа StyleTransfer могут принимать изображения с переменным размером). Вызывающая сторона может применить BitmapBounds для выбора используемого фрагмента изображения. Если это значение не указано, среда выполнения масштабирует изображение до размера модели с сохранением пропорций, а затем обрезает его по центру.
-
Если Windows ML не поддерживает выбранный для модели цветовой формат или диапазон значений пикселей, вы можете реализовать собственную процедуру преобразования. Для входящего значения создайте четырехмерный тензор формата NCHW с 32-разрядными числами с плавающей запятой. Пример таких преобразований вы найдете здесь.
При использовании этого метода игнорируются все заданные в модели метаданные изображения.
Пример
В следующем примере показано, как выполнить привязку ко входу модели. В нашем примере мы создаем привязку из сеанса, затем создаем ImageFeatureValue из inputName и выполняем привязку изображения ко входу модели (inputName).
private void BindModel(
LearningModelSession session,
VideoFrame inputFrame,
string inputName)
{
// Create a binding object from the session
LearningModelBinding binding = new LearningModelBinding(session);
// Create an image tensor from a video frame
ImageFeatureValue image =
ImageFeatureValue.CreateFromVideoFrame(inputFrame);
// Bind the image to the input
binding.Bind(inputName, image);
}
См. также раздел
- Предыдущий: Создание сеанса
- Следующий: Оценка входных данных модели
Примечание
Используйте следующие ресурсы для получения справки по машинному обучению в Windows:
- Чтобы задать технические вопросы о машинном обучении в Windows или ответить на них, используйте тег windows-machine-learning в Stack Overflow.
- Сообщить об ошибке можно в нашем репозитории GitHub.