带选项的转换器

大多数转换器总是生成相同的转换模型,该模型计算与原始模型相同的输出。然而,有些转换器不是这样,用户可能需要通过函数 convert_sklearnto_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}