具有選項的轉換器¶
大多數轉換器總是產生相同的轉換模型,該模型計算的輸出與原始模型相同。但是,其中一些並非如此,使用者可能需要透過函數 convert_sklearn
或 to_onnx
向轉換器提供額外資訊來變更轉換。每個選項最終都會建立不同的 ONNX 圖。以下是啟用此機制的模型清單。
GaussianProcessRegressor、NearestNeighbors¶
這兩個模型都需要計算成對距離。函數 onnx_cdist
會產生圖的這部分,但存在兩個選項。第一個選項是使用 Scan 運算子,第二個選項是使用名為 CDist 的專用運算子,該運算子在問題 #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。Tokenzier 使用此正規表示式或 scikit-learn 指定的正規表示式(如果值為空字串)將字詞分隔。另請參閱以下註解。預設值:None
- 分隔符號:分隔符號清單
這些分隔符號用於將字串分割成字詞。如果選項 tokenexp 不是 None,則會忽略選項 separators。預設值:
[' ', '[.]', '\\?', ',', ';', ':', '\\!']
。- locale
scikit 物件中未提及 locale。此選項可用於變更 ONNX 運算子 StringNormalizer 的參數 locale 值。
範例(來自 具有 ONNX 的 TfIdfVectorizer)
seps = {TfidfVectorizer: {"separators": [' ', '[.]', '\\?', ',', ';', ':', '!', '\\(', '\\)', '\n', '\\"', "'", "-", "\\[", "\\]", "@"]}} model_onnx = convert_sklearn(pipeline, "tfidf", initial_types=[("input", StringTensorType([None, 2]))], options=seps)
Tokenizer 的預設正規表示式為
(?u)\\b\\w\\w+\\b
(請參閱 re)。處理後端的程式庫可能不支援此表達式。onnxruntime 使用 re2。您可能需要切換到基於 re2 的 python 包裝器或其原始碼 pyre2(語法)的自訂 Tokenizer。如果未指定正規表示式,且如果 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)
取決於執行,並且將選項對應至一個類別可能不足以自訂轉換。但是,可以使用 get_params 方法,以與 scikit-learn 管線中參考參數相同的方式指定選項。支援以下語法
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}