このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
機械学習モデルの予測をコマンド ラインで行うコードの生成
この例では、分類および回帰モデル オブジェクトの予測を行うためのコードをコマンド ラインで生成する方法を示します。MATLAB® Coder™ アプリを使用してコードを生成することもできます。詳細については、機械学習モデルの予測を MATLAB Coder アプリを使用して行うコードの生成を参照してください。
一部の分類および回帰モデル オブジェクトには、コード生成をサポートする関数 predict
または random
があります。これらのオブジェクト関数を使用する予測には学習済みの分類または回帰モデル オブジェクトが必要ですが、codegen
(MATLAB Coder)の -args
オプションはこれらのオブジェクトを受け入れません。この例で説明されているように saveLearnerForCoder
と loadLearnerForCoder
を使用して、この制限に対処します。
次のフロー チャートは、分類および回帰モデル オブジェクトのオブジェクト関数に対するコード生成ワークフローを示します。
モデルに学習をさせた後で、saveLearnerForCoder
を使用して学習済みモデルを保存します。loadLearnerForCoder
を使用して保存済みモデルを読み込んでオブジェクト関数を呼び出す、エントリポイント関数を定義します。次に、codegen
を使用してエントリポイント関数のコードを生成し、生成されたコードを確認します。
分類モデルの学習
コード生成に対応している関数 predict
がある分類モデル オブジェクトに学習をさせます。このケースでは、サポート ベクター マシン (SVM) 分類モデルに学習をさせます。
load fisheriris inds = ~strcmp(species,'setosa'); X = meas(inds,3:4); Y = species(inds); Mdl = fitcsvm(X,Y);
この手順には、データの前処理、特徴選択および (交差検証などの使用による) モデルの最適化が含まれる可能性があります。
saveLearnerForCoder
の使用によるモデルの保存
saveLearnerForCoder
を使用して、分類モデルを SVMModel.mat
というファイルに保存します。
saveLearnerForCoder(Mdl,'SVMModel');
saveLearnerForCoder
は、現在のフォルダーの MATLAB バイナリ ファイル SVMModel.mat
に構造体配列として分類モデルを保存します。
エントリポイント関数の定義
"エントリポイント" 関数は、コード生成用に定義する関数で、"最上位" 関数または "プライマリ" 関数とも呼ばれます。codegen
を使用して最上位レベルの関数を呼び出すことはできないので、コード生成に対応する関数を呼び出すエントリポイント関数を定義し、codegen
を使用してエントリポイント関数の C/C++ コードを生成しなければなりません。エントリポイント関数内のすべての関数がコード生成をサポートしなければなりません。
入力された予測子データに対して予測したラベルを返すエントリポイント関数を定義します。この関数では、loadLearnerForCoder
を使用して学習済みの分類モデルを読み込み、predict
に渡します。このケースでは、SVM モデル Mdl
を使用してラベルを予測する関数 predictLabelsSVM
を定義します。
type predictLabelsSVM.m % Display contents of predictLabelsSVM.m file
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)を参照してください。
予測子データを渡して、predict
、predictLabelsSVM
および 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 関数が返すことを確認します。
参考
codegen
(MATLAB Coder) | saveLearnerForCoder
| loadLearnerForCoder
| learnerCoderConfigurer