PyTorch Model Predict ブロックを使用した応答の予測
この例では、Simulink® での予測にPyTorch Model Predictブロックを使用する方法を示します。ブロックは入力データを受け入れ、Python® で実行される学習済み機械学習モデルを使用して予測した応答を返します。MATLAB は、CPython とも呼ばれる Python のリファレンス実装をサポートしています。Mac または Linux® プラットフォームを使用している場合は、Python は既にインストールされています。Windows® を使用する場合は、https://www.python.org/downloads/ などで提供されているディストリビューションをインストールする必要があります。詳細については、Python を使用するためのシステムの構成を参照してください。使用する MATLAB Python 環境には torch モジュールがインストールされている必要があります。
PyTorch Model Predict ブロックには、Python で保存した事前学習済みの PyTorch™ モデルが必要です。この例では、保存されたモデル ptmodel.pth が用意されています。これは、UCI Machine Learning Repository [1] の ionosphere レーダー信号データ セットの半分で学習させたニューラル ネットワーク バイナリ分類モデルです。この例では、Python ファイル ptScaler.pkl、ptmodel.py、および ptpreprocessor.py も用意されています。サポートされる Python ファイルはすべて、torch version 1.15.0 を使用して保存されました。
用意された Simulink モデルを開く
この例では、PyTorch Model Predict ブロックを含む Simulink モデル slexPyTorchPredictExample.slx が用意されています。次のセクションで説明するように、Simulink モデルを開くことも、新しいモデルを作成することもできます。
Simulink モデル slexPyTorchPredictExample.slx を開きます。
open_system("slexPyTorchPredictExample");
Simulink モデルを開くと、Simulink モデルを読み込む前にソフトウェアによって PreLoadFcn コールバック関数内のコードが実行されます。slexPyTorchPredictExample の PreLoadFcn コールバック関数には、学習済みモデルの modelInput 変数がワークスペースに含まれているかどうかをチェックするコードが含まれています。ワークスペースに変数が含まれていない場合、PreLoadFcn はサンプル データを読み込み、Simulink モデルの入力信号を作成します。コールバック関数を表示するには、[モデル化] タブの [設定] セクションで、[モデル設定] をクリックし、[モデル プロパティ] を選択します。次に、[コールバック] タブの [モデルのコールバック] ペインで PreLoadFcn コールバック関数を選択します。
Simulink モデルの作成
新しい Simulink モデルを作成するには、[空のモデル] テンプレートを開き、Deep Learning Toolbox™ ライブラリから PyTorch Model Predict ブロックを追加します。
Inport ブロックと Outport ブロックを追加し、それらを PyTorch Model Predict ブロックに接続します。
PyTorch Model Predict ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。[モデル ファイルまたは重み (state_dict) ファイルへのパス] テキスト ボックスに、ptmodel.pth と入力します。

[前/後処理] タブで、[preprocess() を定義する Python ファイルへのパス] テキスト ボックスに ptpreprocessor.py と入力します。[OK] をクリックします。
Python モデルは 34 個の予測子変数を含むデータ セットを使用して学習させているため、PyTorch 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 でモデルを slexPyTorchPredictExample.slx として保存します。
Simulink モデルのシミュレーション
Simulink モデルをシミュレーションして、入力観測値に対する応答を予測します。Python のインストールで 2.1.0 より前のバージョンの torch を使用している場合は、警告メッセージが表示されることがあります。
simOut=sim("slexPyTorchPredictExample");Epoch [10/100], Loss: 0.2918 Epoch [20/100], Loss: 0.3234 Epoch [30/100], Loss: 0.1583 Epoch [40/100], Loss: 0.0835 Epoch [50/100], Loss: 0.0417 Epoch [60/100], Loss: 0.0263 Epoch [70/100], Loss: 0.0160 Epoch [80/100], Loss: 0.0242 Epoch [90/100], Loss: 0.0265 Epoch [100/100], Loss: 0.0279 sys:1: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly. To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()
Inport ブロックは入力データを検出すると、そのデータを PyTorch Model Predict ブロックに配置します。PyTorch Model Predict ブロックは、入力データを [Python データ型] 列 ([ブロック パラメーター] ダイアログ ボックスの [入力] タブ内) で指定されている Python データ型または NumPy データ型に変換します。ブロックはデータを Python に渡し、ソフトウェアは ptpreprocessor.py で定義された関数を使用してデータを前処理した後、データを Python モデルに送信します。Python モデルは、観測値に対する予測応答を返します。シミュレーション データ インスペクター (Simulink)を使用して、Outport ブロックのログ データを表示できます。
モデル予測の可視化
各観測値に対する予測応答をプロットします。
Resp = round(squeeze(simOut.yout.getElement(1).Values.Data)); plot(Resp,LineStyle="none",Marker="*") xlabel("Observation") ylabel("Predicted Response")

不良 ("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.
参考
TensorFlow Model Predict | PyTorch Model Predict | ONNX Model Predict | Custom Python Model Predict