メインコンテンツ

ONNX Model Predict ブロックを使用した応答の予測

この例では、Simulink® での予測にONNX Model Predictブロックを使用する方法を示します。ブロックは入力データを受け入れ、Python® で実行される学習済み機械学習モデルを使用して予測した応答を返します。MATLAB® は、CPython とも呼ばれる Python のリファレンス実装をサポートしています。Mac または Linux® プラットフォームを使用している場合は、Python は既にインストールされています。Windows® を使用する場合は、https://www.python.org/downloads/ などで提供されているディストリビューションをインストールする必要があります。詳細については、Python を使用するためのシステムの構成を参照してください。使用する MATLAB Python 環境には onnxruntime モジュールがインストールされている必要があります。

ONNX Model Predict ブロックには、Python で保存した事前学習済みの ONNX™ モデルが必要です。この例では、保存されたモデル onnxmodel.onnx が用意されています。これは、UCI Machine Learning Repository [1] の ionosphere レーダー信号データ セットの半分で学習させたニューラル ネットワーク バイナリ分類モデルです。この例では、Python ファイル onnxScaler.pklonnxmodel.py、および onnxpreprocessor.py も用意されています。サポートされる Python ファイルはすべて、onnxruntime version 1.15.0 を使用して保存されました。

用意された Simulink モデルを開く

この例では、ONNX Model Predict ブロックを含む Simulink モデル slexONNXPredictExample.slx が用意されています。次のセクションで説明するように、Simulink モデルを開くことも、新しいモデルを作成することもできます。

Simulink モデル slexONNXPredictExample.slx を開きます。

open_system("slexONNXPredictExample");

ONNXexamplepredict.png

Simulink モデルを開くと、Simulink モデルを読み込む前にソフトウェアによって PreLoadFcn コールバック関数内のコードが実行されます。slexONNXPredictExamplePreLoadFcn コールバック関数には、学習済みモデルの modelInput 変数がワークスペースに含まれているかどうかをチェックするコードが含まれています。ワークスペースに変数が含まれていない場合、PreLoadFcn はサンプル データを読み込み、Simulink モデルの入力信号を作成します。コールバック関数を表示するには、[モデル化] タブの [設定] セクションで、[モデル設定] をクリックし、[モデル プロパティ] を選択します。次に、[コールバック] タブの [モデルのコールバック] ペインで PreLoadFcn コールバック関数を選択します。

Simulink モデルの作成

新しい Simulink モデルを作成するには、[空のモデル] テンプレートを開き、Statistics and Machine Learning Toolbox™ ライブラリから ONNX Model Predict ブロックを追加します。

Inport ブロックと Outport ブロックを追加し、それらを ONNX Model Predict ブロックに接続します。

ONNX Model Predict ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。[ONNX モデル ファイルへのパス] テキスト ボックスに onnxmodel.onnx と入力します。ソフトウェアによって [実行プロバイダー] テキスト ボックスが自動入力されます。

[前/後処理] タブで、[preprocess() を定義する Python ファイルへのパス] テキスト ボックスに onnxpreprocessor.py と入力します。[OK] をクリックします。

Python モデルは 34 個の予測子変数を含むデータ セットを使用して学習させているため、ONNX Model Predict ブロックでは 34 個の予測子の値を含む観測値が必要です。Inport ブロックをダブルクリックし、[信号属性] タブで [端子の次元] を 34 に設定します。

出力信号が入力信号と同じ長さになるように指定するには、[実行] タブで [サンプル時間] を 1 に設定します。

[データを内挿する] のチェック ボックスをオフにして、[OK] をクリックします。

ionosphere データ セットを読み込みます。このデータ セットには、レーダー反射に対する 34 個の予測子 (X) と 351 個の二項反応 (Y) があり、不良 ("b") または良好 ("g") のいずれかになります。

load ionosphere

入力データに適した構造体配列を作成します。詳細については、Control How Models Load Input Data (Simulink)を参照してください。

modelInput.time = (1:size(X,1))' - 1;
modelInput.signals.values = X;
modelInput.signals.dimensions = size(X,2);

次のようにして、ワークスペースから信号データをインポートします。

  • [モデル化] タブで [モデル設定] をクリックし、[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。

  • ダイアログ ボックスの左側にある [データのインポート/エクスポート] をクリックします。次に、[入力] チェック ボックスをオンにし、隣接するテキスト ボックスに modelInput と入力します。

  • 左側の [ソルバー] をクリックします。[シミュレーション時間] の下にある [終了時間]size(X,1)-1 に設定します。[ソルバーの選択] で、[タイプ][Fixed-step] に設定し、[ソルバー][discrete (no continuous states)] に設定します。[OK] をクリックします。

詳細については、シミュレーションのための信号データの読み込み (Simulink)を参照してください。

Simulink でモデルを slexONNXPredictExample.slx として保存します。

Simulink モデルのシミュレーション

Simulink モデルをシミュレーションして、入力観測値に対する応答を予測します。Python のインストールで 1.15.0 より前のバージョンの onnxruntime を使用している場合は、警告メッセージが表示されることがあります。

simOut=sim("slexONNXPredictExample");

Inport ブロックは入力データを検出すると、そのデータを ONNX Model Predict ブロックに配置します。ONNX Model Predict ブロックは、入力データを [Python データ型] 列 ([ブロック パラメーター] ダイアログ ボックスの [入力] タブ内) で指定されている Python データ型または NumPy データ型に変換します。ブロックはデータを Python に渡し、ソフトウェアは onnxpreprocessor.py で定義された関数を使用してデータを前処理した後、データを Python モデルに送信します。Python モデルは、観測値に対する予測応答を返します。シミュレーション データ インスペクター (Simulink)を使用して、Outport ブロックのログ データを表示できます。

モデル予測の可視化

各観測値に対する予測応答をプロットします。

Resp = round(squeeze(simOut.yout.getElement(1).Values.Data));
plot(Resp,LineStyle="none",Marker="*")
xlabel("Observation")
ylabel("Predicted Response")

Figure contains an axes object. The axes object with xlabel Observation, ylabel Predicted Response contains a line object which displays its values using only markers.

不良 ("b") および良好 ("g") の予測応答値は、それぞれ 0 と 1 として示されます。

参考文献

[1] Lichman, M. UCI Machine Learning Repository, Irvine, CA: University of California, School of Information and Computer Science, 2013. https://archive.ics.uci.edu.

参考

| | |

トピック