機械学習モデルの予測を MATLAB Coder アプリを使用して行うコードの生成
この例では、分類および回帰モデル オブジェクトの予測を行うための C/C++ コードを MATLAB Coder™ アプリを使用して生成する方法を示します。codegen (MATLAB Coder) を使用してコマンド ラインでコードを生成することもできます。詳細については、機械学習モデルの予測をコマンド ラインで行うコードの生成を参照してください。
一部の分類および回帰モデル オブジェクトには、コード生成をサポートする関数 predict または random があります。これらのオブジェクト関数を使用する予測には学習済みの分類または回帰モデル オブジェクトが必要ですが、コード生成用のエントリポイント関数の入力変数ではこれらのオブジェクトを使用できません。この例で説明されているように saveLearnerForCoder と loadLearnerForCoder を使用して、この制限に対処します。
次のフロー チャートは、分類および回帰モデル オブジェクトのオブジェクト関数に対するコード生成ワークフローを示します。
![]()
この例では、k 最近傍弱学習器を使用してアンサンブル分類モデルに学習をさせ、saveLearnerForCoder を使用して学習済みモデルを保存します。次に、loadLearnerForCoder を使用して保存済みモデルを読み込んでオブジェクト関数を呼び出す、エントリポイント関数を定義します。エントリポイント関数をテストするスクリプトを作成します。最後に、MATLAB Coder アプリを使用してコードを生成し、生成されたコードを確認します。
分類モデルの学習
ionosphere データ セットを読み込みます。このデータ セットには、レーダー反射についての 34 個の予測子と、不良 ('b') または良好 ('g') という 351 個の二項反応が含まれています。
load ionosphereランダム部分空間法を使用して、k 最近傍弱学習器でアンサンブル分類モデルに学習をさせます。ランダム部分空間アンサンブルを使用する分類の詳細については、ランダム部分空間の分類を参照してください。
rng('default') % For reproducibility learner = templateKNN('NumNeighbors',2); Mdl = fitcensemble(X,Y,'Method','Subspace','NPredToSample',5, ... 'Learners',learner,'NumLearningCycles',13);
saveLearnerForCoder の使用によるモデルの保存
学習済みのアンサンブル モデルを現在のフォルダーの knnEnsemble.mat という名前のファイルに保存します。
saveLearnerForCoder(Mdl,'knnEnsemble')saveLearnerForCoder は、完全な分類モデル Mdl をコンパクトにしてから、現在の作業フォルダー内の MATLAB バイナリ ファイル knnEnsemble.mat に構造体配列として保存します。
エントリポイント関数の定義
"エントリポイント" 関数は、コード生成用に定義する関数で、"最上位" 関数または "プライマリ" 関数とも呼ばれます。コード生成に対応する関数を呼び出すエントリポイント関数を定義し、エントリポイント関数から C/C++ コードを生成しなければなりません。エントリポイント関数内のすべての関数がコード生成をサポートしなければなりません。
現在のフォルダー内の新しいファイルで、以下を行う myknnEnsemblePredict という名前のエントリポイント関数を定義します。
入力データ (
X)、保存したモデルのファイル名 (fileName)、およびpredict関数の有効な名前と値の引数 (varargin) を受け入れる。loadLearnerForCoderを使用して学習済みアンサンブル モデルを読み込む。読み込んだモデルからラベルおよび対応するスコアを予測する。
入力引数として varargin を指定することにより、オプションの名前と値のペアの引数に対応できます。詳細については、可変長引数リストのコード生成 (MATLAB Coder)を参照してください。
type myknnEnsemblePredict.m % Display the contents of myknnEnsemblePredict.m file.
function [label,score] = myknnEnsemblePredict(X,fileName,varargin) %#codegen
CompactMdl = loadLearnerForCoder(fileName);
[label,score] = predict(CompactMdl,X,varargin{:});
end
MATLAB のアルゴリズムについてのコードを生成しようとしていることを指示するため、コンパイラ命令 %#codegen (またはプラグマ) をエントリポイント関数のシグネチャの後に追加します。この命令を追加すると、MATLAB Code Analyzer はコード生成時にエラーになる違反の診断と修正を支援します。コード アナライザーの使用 (MATLAB Coder)を参照してください。
メモ: このページの右上にあるボタンをクリックしてこの例を MATLAB で開くと、MATLAB で例のフォルダーが開きます。このフォルダーには、エントリポイント関数ファイル (myknnEnsemblePredict.m) とテスト ファイル (test_myknnEnsemblePredict.m、後述) が含まれています。
コンパイラの設定
C/C++ コードを生成するには、適切に設定されている C/C++ コンパイラにアクセスできなければなりません。MATLAB Coder は、サポートされているインストール済みのコンパイラを探して使用します。mex -setup を使用すると、既定のコンパイラを表示および変更できます。詳細は、既定のコンパイラの変更を参照してください。
テスト ファイルの作成
関数 myknnEnsemblePredict を呼び出すテスト スクリプトを作成します。テスト スクリプトでは、生成したコードで使用する入力引数および名前と値の引数を指定します。MATLAB Coder アプリを使用してコードを生成するときに、このテスト スクリプトを使用して入力の型を自動的に定義します。
この例では、次のように test_myknnEnsemblePredict.m というファイルを現在のフォルダーに作成します。
type test_myknnEnsemblePredict.m % Display the contents of test_myknnEnsemblePredict.m file.
%% Load Sample data load ionosphere %% Test myknnEnsemblePredict [label,score] = myknnEnsemblePredict(X,"knnEnsemble","Learners",1:13);
詳細については、Define Types of Entry-Point Inputs by Using the MATLAB Coder App (MATLAB Coder)を参照してください。
MATLAB Coder アプリの使用によるコードの生成
MATLAB Coder アプリは、MATLAB コードから C または C++ コードを生成します。アプリの手順に従ってコード生成プロセスを進めることができます。以下の手順は、このプロセスのワークフローについて簡単に示したものです。詳細については、MATLAB Coder (MATLAB Coder)およびMATLAB Coder アプリを使用した C コードの生成 (MATLAB Coder)を参照してください。
MATLAB Coder プロジェクト ファイルの選択
[アプリ] タブの [アプリ] セクションで [さらに表示] 矢印をクリックして、アプリ ギャラリーを開きます。[コード生成] で [MATLAB Coder] をクリックしてアプリを開きます。[MATLAB Coder プロジェクトの作成] ダイアログ ボックスで、プロジェクト名を必要に応じて編集し、プロジェクト ファイルのフォルダーを選択します。[OK] をクリックします。

エントリポイント関数ファイルの選択
[MATLAB Coder] タブの [準備] セクションで [エントリ ポイント] をクリックします。エントリポイント関数 myknnEnsemblePredict の名前を入力または選択します。

入力の型の定義
C では静的型付けが使用されるため、アプリでは MATLAB ファイル内のすべての変数のプロパティをコンパイル時に決定しなければなりません。このため、エントリポイント関数の入力のプロパティを指定する必要があります。
テスト スクリプト test_myknnEnsemblePredict を入力または選択し、[スクリプトの実行] ボタン
をクリックします。myknnEnsemblePredict 関数の入力の型がテスト スクリプトに基づいて認識されます。

入力の型を次のように変更します。
X— アプリは入力Xがdouble (351x34)であると推定します。予測子の個数は学習済みモデルの予測子の個数と同じでなければなりません。ただし、予測用の観測値は異なる個数にすることができます。観測値の個数が不明である場合は、double (351x34)をdouble (:351x34)またはdouble (:infx34)に変更します。double (:351x34)に設定すると観測値の許容される最大個数が 351 個になり、double (:infx34)に設定すると観測値の個数に制限がなくなります。この例では、351をクリックして:Inf - Unboundedを選択することにより、double (:Infx34)を指定します。fileName—[fileName]の行で、[モードおよびアクション] ボタン
をクリックし、[定数の使用] を選択します。ファイル名を二重引用符で囲んで「"knnEnsemble"」と入力します。varargin{1}— 名前と値の引数に含まれる名前はコンパイル時の定数でなければなりません。[varargin{1}] の行で、[モードおよびアクション] ボタン
をクリックし、[定数の使用] を選択します。テキスト ボックスに、定数名を二重引用符で囲んで「"Learners"」と入力します。varargin{2}— 生成コードで最大 13 個の弱学習器に対応するユーザー定義インデックスを指定できるようにするため、[varargin{2}]の行の13をクリックし、:13 - Up to "13"を選択します。

MEX 関数を使用したコードの検証 (オプション)
[MATLAB Coder] タブの [検証] セクションで [MEX を使用して検証] ボタンをクリックします。このオプションの手順では、MEX ファイルが生成されて MEX 関数が実行され、問題があれば報告されます。
C コードの生成
[MATLAB Coder] タブの [生成] セクションで [コード生成] ボタンをクリックします。MEX 関数 myknnEnsemblePredict_mex が生成されます。MEX 関数は、MATLAB から実行できる C/C++ プログラムです。MEX 関数を使用すると、MATLAB のアルゴリズムを高速化し、生成されたコードの機能と実行時の問題をテストすることができます。詳細は、MATLAB アルゴリズムの高速化 (MATLAB Coder) と MEX 関数を使用した MATLAB コードの問題の確認 (MATLAB Coder) を参照してください。
指定したビルド タイプに基づいて、コンパイルするとスタティック ライブラリ、ダイナミック リンク ライブラリ、または実行可能ファイルになる MEX 関数またはスタンドアロン C/C++ コードが生成されます。ビルド タイプの設定の詳細については、コード生成およびビルド設定の構成 (MATLAB Coder)を参照してください。
コード生成レポートの確認
コード生成が完了したら、[MATLAB Coder] タブの [ビュー] セクションで [レポートの表示] ボタンをクリックします。[MATLAB Coder レポート ビューアー] ウィンドウに、プロジェクトの概要と生成された出力へのリンクが示されます。
スクリプトの使用によるコードの生成
入力の型を定義した後で、MATLAB Coder プロジェクトを等価な MATLAB コマンドのスクリプトに変換できます。その後、スクリプトを実行してコードを生成します。詳細については、MATLAB スクリプトへの MATLAB Coder プロジェクトの変換 (MATLAB Coder)を参照してください。
[MATLAB Coder] タブの [エクスポート] セクションで、[エクスポート] をクリックして [スクリプトに変換] を選択します。
ファイル名を myknnEnsemblePredict_script に変更し、[保存] をクリックします。myknnEnsemblePredict_script.m というファイルが作成されます。このファイルは、構成オブジェクト内のプロジェクトを再現し、関数 codegen (MATLAB Coder) を実行します。ファイルは MATLAB エディター ウィンドウの新しいタブに表示されます。
C コードを生成するには、スクリプトを実行します。
myknnEnsemblePredict_script
Code generation successful: View report
生成されたコードの確認
MEX 関数をテストして、生成されたコードが元の MATLAB コードと同じ機能を提供するかどうかを確認します。このテストを実行するため、元の MATLAB コードの実行に使用したものと同じ入力を使用して MEX 関数を実行してから、結果を比較します。スタンドアロン コードを生成する前に MATLAB で MEX 関数を実行すると、実行時エラーを検出して修正することもできます。生成されたスタンドアロン コードでは、このようなエラーの診断がはるかに困難になります。詳細は、MEX 関数を使用した MATLAB コードの問題の確認 (MATLAB Coder)を参照してください。
予測子データを渡して、myknnEnsemblePredict と MEX 関数が同じ結果を返すかどうかを確認します。
[label1,score1] = predict(Mdl,X,'Learners',1:10); [label2,score2] = myknnEnsemblePredict(X,'knnEnsemble','Learners',1:10); [label3,score3] = myknnEnsemblePredict_mex(X,'knnEnsemble','Learners',1:10);
isequal を使用して、label1、label2 および label3 を比較します。
isequal(label1,label2,label3)
ans = logical
1
isequal は、すべての入力が等しいことを意味する logical 1 (true) を返します。
関数 predict からの出力と比較すると、MEX 関数からの出力 score3 には丸めによる差が含まれている場合があります。このような場合は、小さい誤差を許容して score1 と score3 を比較します。
find(abs(score1-score3) > 1e-12)
ans = 0×1 empty double column vector
score1 と score3 の要素ごとの差の絶対値が指定された許容誤差 1e-12 を超えない場合、find は空のベクトルを返します。この比較により、同じ結果を myknnEnsemblePredict と MEX 関数が返すことを確認します。
Copyright 2018–2024 The MathWorks, Inc.
参考
codegen (MATLAB Coder) | saveLearnerForCoder | loadLearnerForCoder | learnerCoderConfigurer