带选项的转换器

大多数转换器始终生成相同的转换模型,该模型计算与原始模型相同的输出。但是,其中一些转换器没有这样做,用户可能需要通过函数 convert_sklearnto_onnx 向转换器提供其他信息来更改转换。每个选项最终都会创建一个不同的 ONNX 图。以下是启用此机制的模型列表。

GaussianProcessRegressor、NearestNeighbors

这两个模型都需要计算成对距离。函数 onnx_cdist 生成图的这一部分,但存在两种选项。第一个是使用 Scan 操作符,第二个是使用名为 CDist 的专用操作符,该操作符在 issue #2442 得到解决之前不属于常规的 ONNX 操作符。默认情况下,使用 Scan,可以通过以下方式使用 CDist

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)[source]

TfidfVectorizer 的转换器。当前的实现正在开发中,ONNX 版本不会产生完全相同的结果。转换器允许用户更改其某些参数。

其他选项

tokenexp:字符串

默认值将在 1.6.0 版本中更改为 true。分词器使用此正则表达式或 scikit-learn 指定的正则表达式(如果值为空字符串)进行分词。另请参见下面的注释。默认值:None

separators:分隔符列表

这些分隔符用于将字符串拆分为单词。如果选项 tokenexp 不为 None,则忽略选项 separators。默认值:[' ', '[.]', '\\?', ',', ';', ':', '\\!']

locale

scikit-对象中未提及区域设置。此选项可用于更改 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。您可能需要切换到基于 re2 的 python 包装器 或其源代码 pyre2语法)的自定义分词器。如果未指定正则表达式,并且 TfidfVectorizer 的实例使用默认模式 (?u)\\b\\w\\w+\\b,则将其替换为 [a-zA-Z0-9_]+。任何其他情况都必须手动处理。

如果 analyser=='char',则正则表达式 [^\\\\n] 用于将句子拆分为字符(并且不起作用)。模式 analyser=='char_wb' 未实现。

分类器

分类器的转换器实现了多个选项。

ZipMap

操作符 ZipMap 生成一个字典列表。它重复类名或 ID,但这不是必需的(参见 issue #2149)。默认情况下,会添加 ZipMap 操作符,可以通过以下方式停用它:

options={type(model): {'zipmap': False}}

它由 PR 327 实现。

类信息

类信息通常在进行分类的 ONNX 操作符和 ZipMap 操作符的输出中重复(参见 issue 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}}

或者

options = {'classifier__zipmap': False}

选项应用于一个模型,而不是一个管道,因为转换器会将管道结构替换为单个 onnx 图。遵循此规则,如果应用于管道和管道的最后一步,则选项 zipmap 将不会有任何影响。但是,因为转换应该是什么没有歧义,所以对于选项 zipmapnocl,以下选项将具有相同的效果:

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}