Как преобразовать конвейер Sci-kit, содержащий пользовательскую функцию, чтобы она могла использоваться устройством iOS? (если возможно, используя .mlmodel и CoreML)) - PullRequest
0 голосов
/ 20 мая 2019

Я бы хотел использовать описанный ниже конвейер на устройстве iOS. Невозможно просто преобразовать его с помощью CoreML, потому что мой конвейер содержит пользовательскую функцию, которой нет в sklearn.preprocessing.

У меня есть конвейер, который содержит функцию, которая не поддерживается CoreML. Если я попытаюсь преобразовать свой конвейер с помощью coreML, у меня будет:

ValueError: Transformer '<class '__main__.Prepare_input'>' not supported; supported transformers are coremltools.converters.sklearn._dict_vectorizer,coremltools.converters.sklearn._one_hot_encoder,coremltools.converters.sklearn._normalizer,coremltools.converters.sklearn._standard_scaler,coremltools.converters.sklearn._imputer,coremltools.converters.sklearn._NuSVC,coremltools.converters.sklearn._NuSVR,coremltools.converters.sklearn._SVC,coremltools.converters.sklearn._SVR,coremltools.converters.sklearn._linear_regression,coremltools.converters.sklearn._LinearSVC,coremltools.converters.sklearn._LinearSVR,coremltools.converters.sklearn._logistic_regression,coremltools.converters.sklearn._random_forest_classifier,coremltools.converters.sklearn._random_forest_regressor,coremltools.converters.sklearn._decision_tree_classifier,coremltools.converters.sklearn._decision_tree_regressor,coremltools.converters.sklearn._gradient_boosting_classifier,coremltools.converters.sklearn._gradient_boosting_regressor.

У меня здесь есть пользовательская функция:

class Prepare_input(BaseEstimator):
    def __init__(self, *args, **kwargs):
        return super().__init__(*args, **kwargs)

    def fit(self, x, y=None):
        return self

    def transform(self, X, y=None):
        x= self.extract_features(x)
        return x

    def extract_features(signal):
        print("transforming...")
        signal = some_modif(signal)
        return signal

Я использую его для создания конвейера здесь:

classifier1= RandomForestClassifier(max_depth=700, n_estimators=100, random_state = 42)
pipeline1 = Pipeline([('Prepare_input', input_transform), ('classifier', classifier1)])

Тогда я подгоняю и конвертирую:

pipeline1.fit(train_data, train_labels)

coreml_model = coremltools.converters.sklearn.convert(pipeline1)
coreml_model.save('PPG_classif.mlmodel')

... А у меня ошибка выше.

  • Есть ли у вас какие-либо идеи о том, как я могу использовать свой конвейер на iOS?
  • Как написать собственный конвертер в CoreML? У вас есть пример, который я мог бы использовать?
  • Знаете ли вы, могут ли некоторые инструменты, кроме CoreML, поддерживать этот тип преобразования?

Большое спасибо!

1 Ответ

0 голосов
/ 21 мая 2019

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

Поскольку ваша пользовательская функция применяется перед классификатором, вы можете просто реализовать ее в Swift или Obj-C, а затем вызвать модель Core ML для выполнения классификации.

Также можно вручную добавить пользовательскую функцию в модель Core ML (либо добавив модель нейронной сети с пользовательским слоем, либо добавив «пользовательскую модель» в конвейер Core ML), но этогромоздко, и вам все равно придется реализовать реальную логику для этой функции в Swift или Obj-C ...

...