如何转换包含自定义函数的 Sci-kit 管道,以便 iOS 设备可以使用它? (如果可能,使用 .mlmodel 和 CoreML))
How to convert a Sci-kit pipeline containing a custom function so it can be used by iOS device? (if possible using .mlmodel and CoreML))
我想在 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 之外的一些工具是否可以支持这种类型的转换吗?
非常感谢!
coremltools scikit-learn 转换器似乎不知道如何处理自定义函数。它们仅在神经网络模型中受支持。
由于您的自定义函数在分类器之前应用,您可以在 Swift 或 Obj-C 中实现它,然后调用 Core ML 模型进行分类。
也可以手动将自定义函数添加到 Core ML 模型中(通过添加带有自定义层的神经网络模型,或者通过在 Core ML 管道中添加 "custom model"),但是这很麻烦,无论如何您都需要在 Swift 或 Obj-C 中实现该功能的实际逻辑...
我想在 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 之外的一些工具是否可以支持这种类型的转换吗?
非常感谢!
coremltools scikit-learn 转换器似乎不知道如何处理自定义函数。它们仅在神经网络模型中受支持。
由于您的自定义函数在分类器之前应用,您可以在 Swift 或 Obj-C 中实现它,然后调用 Core ML 模型进行分类。
也可以手动将自定义函数添加到 Core ML 模型中(通过添加带有自定义层的神经网络模型,或者通过在 Core ML 管道中添加 "custom model"),但是这很麻烦,无论如何您都需要在 Swift 或 Obj-C 中实现该功能的实际逻辑...