带选项的转换器¶
大多数转换器始终生成相同的转换模型,该模型计算与原始模型相同的输出。但是,其中一些转换器没有这样做,用户可能需要通过函数 convert_sklearn
或 to_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 将不会有任何影响。但是,因为转换应该是什么没有歧义,所以对于选项 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}