このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
ClassificationNeuralNetwork Predict ブロックの使用によるクラス ラベルの予測
この例では、ClassificationNeuralNetwork Predictブロックを Simulink® のラベル予測に使用する方法を示します。このブロックは、観測値 (予測子データ) を受け入れて、学習済みのニューラル ネットワーク分類モデルを使用することにより、その観測値の予測されたクラス ラベルとクラス スコアを返します。
ニューラル ネットワーク分類器の学習
ニューラル ネットワーク分類器に学習させ、テスト セットで分類器の性能を評価します。
humanactivity
データセットを読み込みます。このデータセットには、人間の次の 5 種類の身体動作についての 24,075 個の観測値が含まれています。座る、立つ、歩く、走る、踊るです。各観測値には、スマートフォンの加速度センサーによって測定された加速度データから抽出した 60 個の特徴量が含まれています。
load humanactivity
24,075 個の観測値に対する 60 個の特徴量を格納する数値行列として予測子 X
を作成します。活動 ID を整数で格納する数値ベクトルとしてクラス ラベル Y
を作成します。1 ~ 5 はそれぞれ、座る、立つ、歩く、走る、踊る、を表します。
X = feat; Y = actid;
Y のクラス情報を使用して、観測値を階層的に学習セットとテスト セットに無作為に分割します。観測値の約 80% をニューラル ネットワーク モデルの学習に使用し、観測値の約 20% を学習済みモデルの新しいデータでの性能のテストに使用します。
rng("default") % For reproducibility of the partition cv = cvpartition(Y,"Holdout",0.20);
学習インデックスとテスト インデックスを抽出します。
trainingInds = training(cv); testInds = test(cv);
学習データ セットとテスト データ セットを指定します。
XTrain = X(trainingInds,:); YTrain = Y(trainingInds); XTest = X(testInds,:); YTest = Y(testInds);
学習データ XTrain
および YTrain
を関数 fitcnet
に渡して、ニューラル ネットワーク分類器に学習させます。最初の全結合層の出力数を 40、2 番目の全結合層の出力数を 20 に指定します。
nnetMdl = fitcnet(XTrain,YTrain,"LayerSizes",[40 20])
nnetMdl = ClassificationNeuralNetwork ResponseName: 'Y' CategoricalPredictors: [] ClassNames: [1 2 3 4 5] ScoreTransform: 'none' NumObservations: 19260 LayerSizes: [40 20] Activations: 'relu' OutputLayerActivation: 'softmax' Solver: 'LBFGS' ConvergenceInfo: [1x1 struct] TrainingHistory: [1000x7 table] Properties, Methods
nnetMdl
は学習させた ClassificationNeuralNetwork
モデルです。ドット表記を使用して nnetMdl
のプロパティにアクセスできます。たとえば、nnetMdl.TrainingHistory
と指定すると、ニューラル ネットワーク モデルの学習履歴についての詳細情報を取得できます。
テスト セットの分類精度を計算して、テスト セットで分類器の性能を評価します。
testError = loss(nnetMdl,XTest,YTest,"LossFun","classiferror"); testAccuracy = 1 - testError
testAccuracy = 0.9821
Simulink モデルの作成
この例では、ClassificationNeuralNetwork Predictブロックを含む Simulink モデル slexClassificationNeuralNetworkPredictExample.slx
が用意されています。この節の説明に従って、この Simulink モデルを開くことも、新しいモデルを作成することもできます。
指定されたモデルを開く
Simulink モデル slexClassificationNeuralNetworkPredictExample.slx
を開きます。
SimMdlName = 'slexClassificationNeuralNetworkPredictExample';
open_system(SimMdlName)
Simulink モデルを開くと、Simulink モデルを読み込む前に、ソフトウェアがコールバック関数 PreLoadFcn
のコードを実行します。slexClassificationNeuralNetworkPredictExample
のコールバック関数 PreLoadFcn
には、学習済みモデルの変数 nnetMdl
がワークスペースにあるかどうかをチェックするコードが含まれています。ワークスペースに変数がない場合、PreLoadFcn
は標本データを読み込み、ニューラル ネットワーク モデルに学習させ、Simulink モデルの入力信号を作成します。コールバック関数を表示するには、[モデル化] タブの [設定] セクションで、[モデル設定] をクリックし、[モデル プロパティ] を選択します。次に、[コールバック] タブで、[モデルのコールバック] ペインのコールバック関数 PreLoadFcn
を選択します。
新規モデルの作成
指定されたモデルを開く代わりに新規モデルを作成できます。新しい Simulink モデルを作成するには、[空のモデル] テンプレートを開き、ClassificationNeuralNetwork Predict ブロックを追加します。Inport ブロックと Outport ブロックを追加して、それらを ClassificationNeuralNetwork Predict ブロックに接続します。
ClassificationNeuralNetwork Predict ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。学習済みのニューラル ネットワーク モデルを含むワークスペース変数の名前を指定できます。既定の変数名は nnetMdl
です。[更新] ボタンをクリックします。ダイアログ ボックスの [Trained Machine Learning Model] セクションに、モデル nnetMdl
の学習に使用されるオプションが表示されます。[Add output port for predicted class scores] チェック ボックスをオンにして、2 番目の出力端子 score を追加します。
ClassificationNeuralNetwork Predict ブロックには、60 個の予測子の値を含む観測値が必要です。Inport ブロックをダブルクリックし、[信号属性] タブで [端子の次元] を 60 に設定します。
Simulink モデルの構造体配列の形式で、入力信号を作成します。構造体配列には、次のフィールドが含まれていなければなりません。
time
— 観測値がモデルに入力された時点。方向は予測子データ内の観測値に対応しなければなりません。この例の場合はtime
が列ベクトルでなければなりません。signals
—values
フィールドとdimensions
フィールドが含まれている、入力データを説明する 1 行 1 列の構造体配列。values
は予測子データの行列、dimensions
は予測子変数の個数です。
将来の人の行動に適切な構造体配列を作成します。
activityInput.time = (0:length(YTest)-1)'; activityInput.signals(1).values = XTest; activityInput.signals(1).dimensions = size(XTest,2);
ワークスペースから信号データをインポートします。
[コンフィギュレーション パラメーター] ダイアログ ボックスを開く。[モデル化] タブで、[モデル設定] をクリック。
[データのインポート/エクスポート] ペインで [入力] チェック ボックスをオンにし、隣のテキスト ボックスに「
activityInput
」と入力。[ソルバー] ペインの [シミュレーション時間] で、[終了時間] を
activityInput.time(end)
に設定。[ソルバーの選択] で、[タイプ] をFixed-step
に、[ソルバー] をdiscrete (no continuous states)
に設定。
詳細は、シミュレーションのための信号データの読み込み (Simulink)を参照してください。
モデルをシミュレーション
モデルをシミュレートします。
sim(SimMdlName);
Inport ブロックでは、観測値を検出すると、その観測値を ClassificationNeuralNetwork Predict ブロックに配置します。シミュレーション データ インスペクター (Simulink)を使用して、Outport ブロックのログ データを表示できます。
参考
ClassificationNeuralNetwork Predict