带选项的转换器

大多数转换器总是生成相同且计算与原始模型相同输出的已转换模型。然而,有些转换器并非如此,用户可能需要通过 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)[源代码]

TfidfVectorizer 的转换器。当前的实现是一个正在进行的工作,ONNX 版本生成的结果并不完全相同。转换器允许用户更改其一些参数。

附加选项

tokenexp: 字符串

默认值将在 1.6.0 版本中更改为 true。分词器使用此正则表达式将字符串分割成单词,如果该值为空字符串,则使用由 scikit-learn 指定的正则表达式。另请参阅下面的注释。默认值:None

separators: 分隔符列表

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

locale

区域设置(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 实现。

可序列化性(Pickability)和流水线

指定选项的建议方式并非总是可序列化的。函数 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}