注意
前往結尾以下載完整的範例程式碼
修改 ONNX 圖形¶
此範例展示如何變更預設的 ONNX 圖形,例如重新命名輸入或輸出名稱。
基本範例¶
import numpy
from onnxruntime import InferenceSession
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from skl2onnx.common.data_types import FloatTensorType, Int64TensorType
from skl2onnx import to_onnx
iris = load_iris()
X, y = iris.data, iris.target
X = X.astype(numpy.float32)
X_train, X_test, y_train, y_test = train_test_split(X, y)
clr = LogisticRegression(solver="liblinear")
clr.fit(X_train, y_train)
onx = to_onnx(clr, X, options={"zipmap": False}, target_opset=15)
sess = InferenceSession(onx.SerializeToString(), providers=["CPUExecutionProvider"])
input_names = [i.name for i in sess.get_inputs()]
output_names = [o.name for o in sess.get_outputs()]
print("inputs=%r, outputs=%r" % (input_names, output_names))
print(sess.run(None, {input_names[0]: X_test[:2]}))
inputs=['X'], outputs=['label', 'probabilities']
[array([1, 1], dtype=int64), array([[0.05684776, 0.8244833 , 0.11866891],
[0.05001822, 0.73737246, 0.21260935]], dtype=float32)]
變更輸入名稱¶
可以使用參數 *initial_types* 來變更輸入名稱。但是,使用者也必須指定輸入類型。
onx = to_onnx(
clr,
X,
options={"zipmap": False},
initial_types=[("X56", FloatTensorType([None, X.shape[1]]))],
target_opset=15,
)
sess = InferenceSession(onx.SerializeToString(), providers=["CPUExecutionProvider"])
input_names = [i.name for i in sess.get_inputs()]
output_names = [o.name for o in sess.get_outputs()]
print("inputs=%r, outputs=%r" % (input_names, output_names))
print(sess.run(None, {input_names[0]: X_test[:2]}))
inputs=['X56'], outputs=['label', 'probabilities']
[array([1, 1], dtype=int64), array([[0.05684776, 0.8244833 , 0.11866891],
[0.05001822, 0.73737246, 0.21260935]], dtype=float32)]
變更輸出名稱¶
可以使用參數 *final_types* 來變更輸入名稱。
onx = to_onnx(
clr,
X,
options={"zipmap": False},
final_types=[("L", Int64TensorType([None])), ("P", FloatTensorType([None, 3]))],
target_opset=15,
)
sess = InferenceSession(onx.SerializeToString(), providers=["CPUExecutionProvider"])
input_names = [i.name for i in sess.get_inputs()]
output_names = [o.name for o in sess.get_outputs()]
print("inputs=%r, outputs=%r" % (input_names, output_names))
print(sess.run(None, {input_names[0]: X_test[:2]}))
inputs=['X'], outputs=['L', 'P']
[array([1, 1], dtype=int64), array([[0.05684776, 0.8244833 , 0.11866891],
[0.05001822, 0.73737246, 0.21260935]], dtype=float32)]
重新命名中間結果¶
可以使用字首或使用函式來重新命名中間結果。結果將會進行後處理,以確保名稱的唯一性。它不會影響圖形的輸入或輸出。
def rename_results(proposed_name, existing_names):
result = "_" + proposed_name.upper()
while result in existing_names:
result += "A"
print("changed %r into %r." % (proposed_name, result))
return result
onx = to_onnx(clr, X, options={"zipmap": False}, naming=rename_results, target_opset=15)
sess = InferenceSession(onx.SerializeToString(), providers=["CPUExecutionProvider"])
input_names = [i.name for i in sess.get_inputs()]
output_names = [o.name for o in sess.get_outputs()]
print("inputs=%r, outputs=%r" % (input_names, output_names))
print(sess.run(None, {input_names[0]: X_test[:2]}))
changed 'SklearnLinearClassifier' into '_SKLEARNLINEARCLASSIFIER'.
changed 'label' into '_LABEL'.
changed 'probabilities' into '_PROBABILITIES'.
changed 'LinearClassifier' into '_LINEARCLASSIFIER'.
changed 'probability_tensor' into '_PROBABILITY_TENSOR'.
changed 'Normalizer' into '_NORMALIZER'.
inputs=['X'], outputs=['label', 'probabilities']
[array([1, 1], dtype=int64), array([[0.05684776, 0.8244833 , 0.11866891],
[0.05001822, 0.73737246, 0.21260935]], dtype=float32)]
腳本總執行時間:(0 分鐘 0.065 秒)