带选项的转换器¶
大多数转换器总是生成相同的转换模型,该模型计算与原始模型相同的输出。然而,有些转换器不是这样,用户可能需要通过函数 convert_sklearn
或 to_onnx
向转换器提供额外信息来修改转换。每个选项最终都会创建一个不同的 ONNX 图。以下是启用此机制的模型列表。
GaussianProcessRegressor, NearestNeighbors¶
这两种模型都需要计算成对距离。函数 onnx_cdist
生成图的这部分,但存在两个选项。第一个是使用 _Scan_ 运算符,第二个是使用一个名为 _CDist_ 的专用运算符,该运算符不是常规 ONNX 运算符的一部分,直到 #2442 问题解决。默认情况下,使用 _Scan_,可以通过提供
options={GaussianProcessRegressor: {'optim': 'cdist'}}
上一行启用 _GaussianProcessRegressor_ 所有模型的优化,但只能通过使用以下方式为单个模型进行优化:
options={id(model): {'optim': 'cdist'}}
TfidfVectorizer, CountVectorizer¶
- skl2onnx.operator_converters.text_vectoriser.convert_sklearn_text_vectorizer(scope: Scope, operator: Operator, container: ModelComponentContainer)[源代码]¶
用于 _TfidfVectorizer_ 类的转换器。当前实现仍在进行中,ONNX 版本生成的��果不完全相同。转换器允许用户更改其某些参数。
附加选项¶
- tokenexp: string
默认值将在 1.6.0 版本中更改为 true。分词器使用此正则表达式(或 _scikit-learn_ 指定的正则表达式)来分割单词,如果值为 empty string。另请参阅下面的注释。默认值:None
- separators: list of separators
这些分隔符用于将字符串分割成单词。如果 _tokenexp_ 选项不为 None,则 _separators_ 选项将被忽略。默认值:
[' ', '[.]', '\\?', ',', ';', ':', '\\!']
。- locale
在 scikit-object 中未提及 locale。此选项可用于更改 ONNX 运算符 _StringNormalizer_ 的 locale 参数的值。
示例(来自 带 ONNX 的 TfIdfVectorizer)
seps = {TfidfVectorizer: {"separators": [' ', '[.]', '\\?', ',', ';', ':', '!', '\\(', '\\)', '\n', '\\"', "'", "-", "\\[", "\\]", "@"]}} model_onnx = convert_sklearn(pipeline, "tfidf", initial_types=[("input", StringTensorType([None, 2]))], options=seps)
分词器的默认正则表达式是
(?u)\\b\\w\\w+\\b
(请参阅 re)。此表达式可能不受处理后端的库支持。 _onnxruntime_ 使用 _re2_。您可能需要切换到基于 python wrapper for re2 或其源代码 pyre2(语法)的自定义分词器。如果未指定正则表达式,并且 TfidfVectorizer 实例使用默认模式(?u)\\b\\w\\w+\\b
,则将其替换为[a-zA-Z0-9_]+
。任何其他情况都必须手动处理。如果
analyser=='char'
,则使用正则表达式[^\\\\n]
将句子分割成字符(而不是单词)。模式analyser=='char_wb'
未实现。
分类器¶
分类器的转换器实现了多种选项。
ZipMap¶
_ZipMap_ 运算符生成字典列表。它会重复类名或 ID,但这没有必要(请参阅 #2149 问题)。默认情况下,会添加 ZipMap 运算符,可以通过使用以下选项来禁用它:
options={type(model): {'zipmap': False}}
它由 PR 327 实现。
类信息¶
类信息通常会在对类进行分类的 ONNX 运算符和 ZipMap 运算符的输出中重复(请参阅 2149 问题)。以下选项可以从 ONNX 运算符中删除字符串信息和类 ID,以获得更小的模型。
options={type(model): {'nocl': True}}
类被替换为从 0 到类数的整数。
原始分数¶
几乎所有分类器都被转换为以获得概率而不是原始分数。这是默认行为。可以通过使用以下选项来禁用它:
options={type(model): {'raw_scores': True}}
它由 PR 308 实现。
可序列化性和管道¶
指定选项的提议方法并不总是可序列化的。函数 id(model)
取决于执行,将一个选项映射到一个类可能不足以自定义转换。但是,可以通过 _scikit-learn_ 管道中 get_params 方法引用的参数的方式来指定一个选项。支持以下语法:
pipe = Pipeline([('pca', PCA()), ('classifier', LogisticRegression())])
options = {'classifier': {'zipmap': False}}
Or
options = {'classifier__zipmap': False}
应用于单个模型而不是管道的选项,因为转换器会将管道结构替换为单个 onnx 图。遵循此规则,如果 _zipmap_ 和 _nocl_ 选项应用于管道和管道的最后一个步骤,它们将没有影响。但是,因为转换应该是什么没有歧义,对于 _zipmap_ 和 _nocl_ 选项,以下选项将具有相同的效果:
pipe = Pipeline([('pca', PCA()), ('classifier', LogisticRegression())])
options = {id(pipe.steps[-1][1]): {'zipmap': False}}
options = {id(pipe): {'zipmap': False}}
options = {'classifier': {'zipmap': False}}
options = {'classifier__zipmap': False}