Main Content

機械学習モデルの予測をコマンド ラインで行うコードの生成

この例では、分類および回帰モデル オブジェクトの予測を行うためのコードをコマンド ラインで生成する方法を示します。MATLAB® Coder™ アプリを使用してコードを生成することもできます。詳細については、機械学習モデルの予測を MATLAB Coder アプリを使用して行うコードの生成を参照してください。

一部の分類および回帰モデル オブジェクトには、コード生成をサポートする関数 predict または random があります。これらのオブジェクト関数を使用する予測には学習済みの分類または回帰モデル オブジェクトが必要ですが、codegen (MATLAB Coder)-args オプションはこれらのオブジェクトを受け入れません。この例で説明されているように saveLearnerForCoderloadLearnerForCoder を使用して、この制限に対処します。

次のフロー チャートは、分類および回帰モデル オブジェクトのオブジェクト関数に対するコード生成ワークフローを示します。

モデルに学習をさせた後で、saveLearnerForCoder を使用して学習済みモデルを保存します。loadLearnerForCoder を使用して保存済みモデルを読み込んでオブジェクト関数を呼び出す、エントリポイント関数を定義します。次に、codegen を使用してエントリポイント関数のコードを生成し、生成されたコードを確認します。

分類モデルの学習

コード生成に対応している関数 predict がある分類モデル オブジェクトに学習をさせます。このケースでは、サポート ベクター マシン (SVM) 分類モデルに学習をさせます。

load fisheriris
inds = ~strcmp(species,'setosa');
X = meas(inds,3:4);
Y = species(inds);
Mdl = fitcsvm(X,Y);

Mdl は線形 SVM モデルです。線形 SVM モデルでは、新しい観測値のラベルを予測するための十分な情報が予測子の係数によって提供されます。サポート ベクターを削除することで、生成コードのメモリ使用量が少なくなります。関数discardSupportVectorsを使用して線形 SVM モデルからサポート ベクターを削除します。

Mdl = discardSupportVectors(Mdl);

この手順には、データの前処理、特徴選択および (交差検証などの使用による) モデルの最適化が含まれる可能性があります。

saveLearnerForCoder の使用によるモデルの保存

saveLearnerForCoder を使用して、分類モデルを SVMModel.mat というファイルに保存します。

saveLearnerForCoder(Mdl,'SVMModel');

saveLearnerForCoder は、現在のフォルダーの MATLAB バイナリ ファイル SVMModel.mat に構造体配列として分類モデルを保存します。

エントリポイント関数の定義

"エントリポイント" 関数は、コード生成用に定義する関数で、"最上位" 関数または "プライマリ" 関数とも呼ばれます。codegen を使用して最上位レベルの関数を呼び出すことはできないので、コード生成に対応する関数を呼び出すエントリポイント関数を定義し、codegen を使用してエントリポイント関数の C/C++ コードを生成しなければなりません。エントリポイント関数内のすべての関数がコード生成をサポートしなければなりません。

入力された予測子データに対して予測したラベルを返すエントリポイント関数を定義します。この関数では、loadLearnerForCoder を使用して学習済みの分類モデルを読み込み、predict に渡します。このケースでは、SVM モデル Mdl を使用してラベルを予測する関数 predictLabelsSVM を定義します。

function label = predictLabelsSVM(x) %#codegen
%PREDICTLABELSSVM Label new observations using trained SVM model Mdl
%   predictLabelsSVM predicts the vector of labels label using 
%   the saved SVM model Mdl and the predictor data x.
Mdl = loadLearnerForCoder('SVMModel');
label = predict(Mdl,x);
end

MATLAB のアルゴリズムについてのコードを生成しようとしていることを指示するため、コンパイラ命令 %#codegen (またはプラグマ) をエントリポイント関数のシグネチャの後に追加します。この命令を追加すると、MATLAB Code Analyzer はコード生成時にエラーになる違反の診断と修正を支援します。コード アナライザーによるコードのチェック (MATLAB Coder)を参照してください。

メモ: このページの右上にあるボタンをクリックしてこの例を MATLAB® で開くと、MATLAB® で例のフォルダーが開きます。このフォルダーには、エントリポイント関数のファイルが含まれています。

コードの生成

コンパイラの設定

C/C++ コードを生成するには、適切に設定されている C/C++ コンパイラにアクセスできなければなりません。MATLAB Coder は、サポートされているインストール済みのコンパイラを探して使用します。mex -setup を使用すると、既定のコンパイラを表示および変更できます。詳細は、既定のコンパイラの変更を参照してください。

codegen の使用によるコードの生成

codegen (MATLAB Coder) を使用して、エントリポイント関数のコードを生成します。C および C++ は静的な型の言語なので、エントリポイント関数内のすべての変数のプロパティをコンパイル時に決定しなければなりません。codegen を呼び出すときに -args オプションを使用して、エントリポイント関数のすべての入力についてデータ型とサイズを指定します。

このケースでは、-args オプションの値として X を渡し、生成コードが学習データ X と同じデータ型および配列サイズをもつ入力を受け入れなければならないことを指定します。

codegen predictLabelsSVM -args {X}
Code generation successful.

コンパイル時に観測値の個数が不明である場合、coder.typeof (MATLAB Coder) を使用して可変サイズの入力を指定することもできます。詳細については、コード生成用の可変サイズ引数の指定エントリポイント関数の入力のプロパティの指定 (MATLAB Coder)を参照してください。

ビルド タイプ

MATLAB Coder は、以下のビルド タイプについてコードを生成できます。

  • MEX (MATLAB 実行可能ファイル) 関数

  • スタンドアロン C/C++ コード

  • スタティック ライブラリにコンパイルされるスタンドアロン C/C++ コード

  • ダイナミック リンク ライブラリにコンパイルされるスタンドアロン C/C++ コード

  • 実行可能ファイルにコンパイルされるスタンドアロン C/C++ コード

ビルド タイプは、codegen (MATLAB Coder)-config オプションを使用して指定できます。コード生成オプションの設定の詳細については、codegen (MATLAB Coder)-config オプションとビルド設定の構成 (MATLAB Coder)を参照してください。

既定では、codegen は MEX 関数を生成します。MEX 関数は、MATLAB から実行できる C/C++ プログラムです。MEX 関数を使用すると、MATLAB のアルゴリズムを高速化し、生成されたコードの機能と実行時の問題をテストすることができます。詳細は、MATLAB アルゴリズムの高速化 (MATLAB Coder)MATLAB で MEX 関数をテストする理由 (MATLAB Coder) を参照してください。

コード生成レポート

-report フラグを使用して、コード生成レポートを作成できます。このレポートは、コード生成の問題のデバッグと、生成された C/C++ コードの確認に役立ちます。詳細については、コード生成レポート (MATLAB Coder)を参照してください。

生成されたコードの確認

MEX 関数をテストして、生成されたコードが元の MATLAB コードと同じ機能を提供するかどうかを確認します。このテストを実行するため、元の MATLAB コードの実行に使用したものと同じ入力を使用して MEX 関数を実行してから、結果を比較します。スタンドアロン コードを生成する前に MATLAB で MEX 関数を実行すると、実行時エラーを検出して修正することもできます。生成されたスタンドアロン コードでは、このようなエラーの診断がはるかに困難になります。詳細は、MATLAB で MEX 関数をテストする理由 (MATLAB Coder)を参照してください。

予測子データを渡して、predictpredictLabelsSVM および MEX 関数が同じラベルを返すかどうかを確認します。

labels1 = predict(Mdl,X);
labels2 = predictLabelsSVM(X);
labels3 = predictLabelsSVM_mex(X);

isequal を使用して、予測されたラベルを比較します。

verifyMEX = isequal(labels1,labels2,labels3)
verifyMEX = logical
   1

isequal は、すべての入力が等しいことを意味する logical 1 (true) を返します。この比較により、同じラベルを関数 predict、関数 predictLabelsSVM、および MEX 関数が返すことを確認します。

参考

(MATLAB Coder) | | |

関連するトピック