CoreML, как нормализовать входной массив

Я пытаюсь преобразовать нормализатор sklearn в модель coreml следующим образом:

normalized = sklearn.preprocessing.Normalizer()

coreml_model = coremltools.converters.sklearn.convert(normalized)

Но я получаю эту ошибку:

«Ошибка обработки списка функций: если указано одно имя функции, необходимо указать num_dimensions»

Как я могу установить "num_dimensions"?

Другой вариант — напрямую использовать нормализатор в CoreML:

https://apple.github.io/coremltools/coremlspecification/sections/FeatureEngineering.html#normalizer

Но нет никакой документации, как я могу использовать эту функцию в IOS. Как я могу запустить это, например, в массиве с плавающей запятой?


person Spring    schedule 09.02.2019    source источник


Ответы (2)


Чтобы создать нормализатор внутри Core ML, вам нужно построить модель конвейера. Конвейер — это просто последовательность моделей Core ML, объединенных в новую модель Core ML.

Первой моделью в конвейере будет модель Normalizer. Второй будет ваша обычная модель. Затем выходные данные модели нормализатора становятся входными данными вашей обычной модели.

Вы можете сделать это вручную (см. мою книгу, ссылка в моем профиле), но на самом деле проще всего позволить конвертеру scikit-learn справиться с этим, потому что для этого он и предназначен.

Ошибка num_dimensions возникает из-за того, что простое преобразование sklearn Normalizer не дает конвертеру coremltools достаточно информации для работы. Если вы хотите выполнить нормализацию в scikit-learn, похоже, вам также нужно создать модель конвейера в scikit-learn и преобразовать ее.

person Matthijs Hollemans    schedule 10.02.2019
comment
Спасибо, у меня уже есть книга! Хороший. Конвейеры кажутся хорошими, но все еще не отвечают на мою проблему, как преобразовать нормализованный ввод с помощью corelmltools. Мне не ясно, что вы имеете в виду, похоже, вам также нужно создать модель конвейера в scikit-learn и преобразовать ее? С другой стороны, поскольку нормализация scikit поддерживается coremltools, я не думаю, что я единственный, кто столкнулся с этой проблемой. Нет ли официального примера/решения для этого? - person Spring; 11.02.2019
comment
sklearn Normalize обычно объединяется с другими вещами, такими как SVM, случайный лес или что-то еще, в конвейер, чтобы вы могли запускать все эти разные вещи как единую модель. На самом деле не имеет особого смысла иметь только Normalize. - person Matthijs Hollemans; 11.02.2019
comment
Я тренировался с Keras TF. Я использую SKLearn только для нормализации и масштабирования. В этом случае, по вашему мнению, они должны быть частью моей модели keras с использованием компонентов tf, а не SKLearn. Верный? - person Spring; 11.02.2019
comment
Да, в самом деле. Я не думаю, что конвертер coremltools sklearn был предназначен для вашего варианта использования. - person Matthijs Hollemans; 11.02.2019

Вы можете указать входные размеры следующим образом:

coreml_model = coremltools.converters.sklearn.convert(normalized, input_features={'input': [0, 1, 2]})

Где input здесь — имя входного объекта (которое по умолчанию равно input), а список ([0, 1, 2]) — это идентификаторы входных объектов (для простоты вы можете просто сделать range(num_features) или просто явно указать значения индекса, как это сделал я).

person caleb    schedule 04.04.2019