9.16 ONNX
oml.onnx
クラスを使用すると、独自のONNX形式モデルをインポートして、データベースにロードし、Oracle Machine Learningの予測演算子を使用してデータをスコアリングできます。
onnxファイル(.onnx)とそれに関連付けられたメタデータを指定して、データベースにONNX形式モデルをロードし、データベース内の既存のデータを使用してスコアリングできます。データベース内の既存のONNXモデルにアクセスすることもできます。pythonモジュールonnx
は、次の特性を持つONNX形式のモデルを受け入れます:
- 手法: 事前トレーニング済モデルでは、次のいずれかの機械学習手法を使用する必要があります:
- 回帰
- 分類
- クラスタリング
- 埋込み
- データ型: モデルの入力は、次のPython型のいずれかである必要があります:
- 数値(float、int8、int16、int32、int64、uint8、uint16、uint32、uint64)
- String
- 入力タイプ: モデルの入力は、シェイプ[batch_size, n]の2次元ベクトルである必要があります。この構造では、1つ目の次元で各バッチのサイズを指定し、2つ目の次元で個々の入力のサイズを定義します。
oml.onnx
クラスの属性およびメソッドの詳細は、help(oml.onnx)
を呼び出すか、Oracle Machine Learning for Python APIリファレンスを参照してください。
ONNX形式モデルの例
-
ONNX形式モデルをデータベースにロードします:
onnxモジュールを使用して、ONNX形式のモデルをデータベースにロードします。OML4Pyでモデルを作成するには、onnxファイル(.onnx)とそれに関連付けられたメタデータを指定する必要があります。
ノート:
モデルをデータベースにロードするときに名前を指定しない場合は、システム生成のモデル名が使用されます。たとえば、
model.load2db()
ですfrom oml.algo import onnx model = onnx(onnx_file="path_to_model.onnx", mining_function='CLASSIFICATION', classification_prob_output="output", model_input={"tensor_of_dim_4":['Sepal_Length','Sepal_Width','Petal_Length','Petal_Width']}, apply_softmax=True, labels=['setosa','versicolor','virginica'], description={"description":"This model is useful.","author":"John Doe"}, default_on_null={'Sepal_Length':3.2,'Sepal_Width':2.5,'Petal_Length':46,'Petal_Width':1.8}) model.load2db("model1")
-
既存のモデルにアクセスします:
データベース内の既存のONNXモデルには、onnxモジュールを使用してアクセスできます。次の例では、omluserが所有するclassif_autoという名前のモデルにアクセスします。
from oml.algo import onnx model = onnx(model_name="classif_auto", model_owner="omluser")
モデルがロードされたら、
model
と入力してモデル情報を表示できます。 -
ONNX形式モデルを使用してデータをスコアリングします:
この例では、データベースにロードされたONNX形式モデルがスコアリングに使用されます:
model.predict(oml_iris.drop('Species'), supplemental_cols=oml_iris[:,['Sepal_Length', 'Sepal_Width', 'Species']], proba=True)
最後の例: すべての組合せ
import oml
import pandas as pd
from sklearn import datasets
# Load the iris data set and create a pandas.DataFrame for it.
iris = datasets.load_iris()
x = pd.DataFrame(iris.data,
columns = ['Sepal_Length','Sepal_Width',
'Petal_Length','Petal_Width'])
y = pd.DataFrame(list(map(lambda x:
{0: 'setosa', 1: 'versicolor',
2:'virginica'}[x], iris.target)),
columns = ['Species'])
try:
oml.drop('IRIS')
except:
pass
# Create the IRIS database table and the proxy object for the table.
oml_iris = oml.create(pd.concat([x, y], axis=1), table = 'IRIS')
model = oml.algo.onnx(onnx_file="model.onnx", mining_function='CLASSIFICATION', classification_prob_output="output",
model_input={"tensor_of_dim_4":['Sepal_Length','Sepal_Width','Petal_Length','Petal_Width']},
apply_softmax=True, labels=['setosa','versicolor','virginica'],
description={"description":"This model is useful.","author":"John Doe"},
default_on_null={'Sepal_Length':3.2,'Sepal_Width':2.5,'Petal_Length':4.6,'Petal_Width':1.8})
model.load2db("model1")
model.predict(oml_iris.drop('Species'),
supplemental_cols=oml_iris[:,['Sepal_Length', 'Sepal_Width', 'Species']], proba=True)
Sepal_Length Sepal_Width Species PREDICTION PROBABILITY
0 4.9 3.0 setosa setosa 1.000000
1 4.9 3.1 setosa setosa 1.000000
2 4.8 3.4 setosa setosa 1.000000
3 5.8 4.0 setosa setosa 1.000000
... ... ... ... ... ...
44 6.7 3.3 virginica versicolor 0.514706
45 6.7 3.0 virginica versicolor 0.514706
46 6.5 3.0 virginica versicolor 0.514706
47 5.9 3.0 virginica versicolor 0.514706
model.predict_proba(oml_iris.drop('Species'),
supplemental_cols = oml_iris[:,['Sepal_Length', 'Species']])
Sepal_Length Species PROBABILITY_OF_SETOSA \
0 4.4 setosa 1.0
1 4.4 setosa 1.0
2 4.5 setosa 1.0
3 4.8 setosa 1.0
... ... ... ...
42 6.7 virginica 0.0
43 6.9 versicolor 0.0
44 6.9 virginica 0.0
45 7.0 versicolor 0.0
PROBABILITY_OF_VERSICOLOR PROBABILITY_OF_VIRGINICA
0 0.000000 0.000000
1 0.000000 0.000000
2 0.000000 0.000000
3 0.000000 0.000000
... ... ...
42 0.514706 0.485294
43 0.514706 0.485294
44 0.514706 0.485294
45 0.514706 0.485294
関連項目