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形式モデルの例

  1. 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")
  2. 既存のモデルにアクセスします:

    データベース内の既存のONNXモデルには、onnxモジュールを使用してアクセスできます。次の例では、omluserが所有するclassif_autoという名前のモデルにアクセスします。

    from oml.algo import onnx
    model = onnx(model_name="classif_auto", model_owner="omluser")
    

    モデルがロードされたら、modelと入力してモデル情報を表示できます。

  3. 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

関連項目