Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

saveLearnerForCoder

モデル オブジェクトをコード生成用のファイルに保存

説明

機械学習モデルのオブジェクト関数 (predictrandomknnsearch または rangesearch) に対する C/C++ コードを生成するには、saveLearnerForCoderloadLearnerForCoder および codegen (MATLAB Coder) を使用します。機械学習モデルに学習をさせた後で、saveLearnerForCoder を使用してモデルを保存します。loadLearnerForCoder を使用してモデルを読み込みオブジェクト関数を呼び出す、エントリポイント関数を定義します。その後、codegen または MATLAB® Coder™ アプリを使用して C/C++ コードを生成します。C/C++ コードの生成には MATLAB Coder が必要です。

次のフロー チャートは、機械学習モデルのオブジェクト関数に対するコード生成ワークフローを示します。強調表示されているステップで saveLearnerForCoder を使用します。

固定小数点の C/C++ コードを生成するには、予測に必要な変数の固定小数点データ型を定義する追加の手順が必要です。generateLearnerDataTypeFcn によって生成されるデータ型関数を使用して固定小数点データ型構造体を作成し、その構造体をエントリポイント関数で loadLearnerForCoder の入力引数として使用します。固定小数点の C/C++ コードを生成するには、MATLAB Coder および Fixed-Point Designer™ が必要です。

次のフロー チャートは、機械学習モデルの関数 predict の固定小数点のコード生成ワークフローを示します。強調表示されているステップで saveLearnerForCoder を使用します。

saveLearnerForCoder(Mdl,filename) は、分類モデル、回帰モデルまたは最近傍探索モデル (Mdl) をコード生成用に準備してから、filename という名前の MATLAB 形式のバイナリ ファイル (MAT ファイル) に保存します。filenameloadLearnerForCoder に渡すと、filename ファイルからモデル オブジェクトを再構築できます。

すべて折りたたむ

機械学習モデルに学習をさせた後で、saveLearnerForCoder を使用してモデルを保存します。loadLearnerForCoder を使用してモデルを読み込み学習済みモデルの関数 predict を呼び出す、エントリポイント関数を定義します。その後、codegen (MATLAB Coder) を使用して C/C++ コードを生成します。

この例では、コマンド ラインで機械学習モデルの予測を行うためのコード生成ワークフローについて簡単に説明します。詳細は、機械学習モデルの予測をコマンド ラインで行うコードの生成を参照してください。MATLAB Coder アプリを使用してコードを生成することもできます。詳細については、機械学習モデルの予測を MATLAB Coder アプリを使用して行うコードの生成を参照してください。再近傍探索モデルを使用した最近傍探索用のコード生成の詳細については、最近傍探索モデルのコード生成を参照してください。

モデルの学習

フィッシャーのアヤメのデータセットを読み込みます。観測された setosa 種のアヤメをすべて削除して、2 つのクラスのデータのみが XY に含まれるようにします。

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

処理済みのデータセットを使用して、サポート ベクター マシン (SVM) 分類モデルに学習をさせます。

Mdl = fitcsvm(X,Y);

MdlClassificationSVM モデルです。

モデルの保存

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

saveLearnerForCoder(Mdl,'SVMIris');

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

以下を行う classifyIris という名前のエントリポイント関数を定義します。

  • meas に対応する列をもつアヤメの花の測定値を受け入れ、予測したラベルを返す。

  • 学習済みの SVM 分類モデルを読み込む。

  • 読み込んだアヤメの花の測定値の分類モデルを使用して、ラベルを予測する。

type classifyIris.m % Display contents of classifyIris.m file
function label = classifyIris(X) %#codegen
%CLASSIFYIRIS Classify iris species using SVM Model
%   CLASSIFYIRIS classifies the iris flower measurements in X using the SVM
%   model in the file SVMIris.mat, and then returns class labels in label.
Mdl = loadLearnerForCoder('SVMIris');
label = predict(Mdl,X);
end

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

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

コードの生成

codegen (MATLAB Coder) を使用して、エントリポイント関数のコードを生成します。C および C++ は静的な型の言語なので、エントリポイント関数内のすべての変数のプロパティをコンパイル時に決定しなければなりません。-args オプションの値として X を渡し、生成コードが学習データ X と同じデータ型および配列サイズをもつ入力を受け入れなければならないことを指定します。コンパイル時に観測値の個数が不明である場合、coder.typeof (MATLAB Coder) を使用して可変サイズの入力を指定することもできます。詳細は、コード生成用の可変サイズ引数の指定エントリポイント関数の入力のプロパティの指定 (MATLAB Coder) を参照してください。

codegen classifyIris -args {X}

codegen は、プラットフォームに依存する拡張子をもつ MEX 関数 classifyIris_mex を生成します。

生成されたコードの確認

predictclassifyIris および classifyIris_mex を使用して分類されたラベルを比較します。

label1 = predict(Mdl,X);
label2 = classifyIris(X);
label3 = classifyIris_mex(X);
verify_label = isequal(label1,label2,label3)
verify_label = logical
   1

isequal は、すべての入力が等しいことを意味する logical 1 (true) を返します。3 つの方法で分類したラベルは、すべて同じです。

機械学習モデルに学習させた後で、saveLearnerForCoder を使用してモデルを保存します。固定小数点のコード生成の場合、generateLearnerDataTypeFcnによって生成されるデータ型関数を使用して、予測に必要な変数の固定小数点データ型を指定します。次に、loadLearnerForCoder および指定した固定小数点データ型の両方を使用してモデルを読み込んでからモデルの関数 predict を呼び出す、エントリポイント関数を定義します。codegen (MATLAB Coder)を使用してエントリポイント関数の固定小数点の C/C++ コードを生成し、生成されたコードを確認します。

codegen を使用してコードを生成する前に、buildInstrumentedMex (Fixed-Point Designer)showInstrumentationResults (Fixed-Point Designer)を使用して固定小数点データ型を最適化し、固定小数点コードのパフォーマンスを向上させることができます。buildInstrumentedMex を使用して、予測用の名前付きの内部変数の最小値と最大値を記録します。showInstrumentationResults を使用して計測結果を表示します。次に、その結果に基づいて、変数の固定小数点データ型のプロパティを調整します。このオプション手順の詳細については、SVM の予測用の固定小数点コード生成を参照してください。

モデルの学習

ionosphere データセットを読み込み、バイナリ SVM 分類モデルに学習をさせます。

load ionosphere
Mdl = fitcsvm(X,Y,'KernelFunction','gaussian');

MdlClassificationSVM モデルです。

モデルの保存

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

saveLearnerForCoder(Mdl,'myMdl');

固定小数点データ型の定義

generateLearnerDataTypeFcn を使用して、SVM モデルの予測に必要な変数の固定小数点データ型を定義する関数を生成します。

generateLearnerDataTypeFcn('myMdl',X)

generateLearnerDataTypeFcn は関数 myMdl_datatype を生成します。

myMdl_datatype を使用して、固定小数点データ型を定義する構造体 T を作成します。

T = myMdl_datatype('Fixed')
T = struct with fields:
               XDataType: [0x0 embedded.fi]
           ScoreDataType: [0x0 embedded.fi]
    InnerProductDataType: [0x0 embedded.fi]

構造体 T には、関数 predict の実行に必要な名前付きの内部変数に対するフィールドが含まれています。各フィールドには、fi (Fixed-Point Designer)で返される固定小数点オブジェクトが含まれています。固定小数点オブジェクトは、語長や小数部の長さなどの固定小数点データ型のプロパティを指定します。たとえば、予測子データの固定小数点データ型プロパティを表示します。

T.XDataType
ans = 

[]

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 14

        RoundingMethod: Floor
        OverflowAction: Wrap
           ProductMode: FullPrecision
  MaxProductWordLength: 128
               SumMode: FullPrecision
      MaxSumWordLength: 128

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

以下を行う myFixedPointPredict という名前のエントリポイント関数を定義します。

  • 予測子データ X および固定小数点データ型構造体 T を受け入れる。

  • loadLearnerForCoder および構造体 T の両方を使用して、学習済み SVM 分類モデルの固定小数点バージョンを読み込みます。

  • 読み込まれたモデルを使用してラベルとスコアを予測する。

type myFixedPointPredict.m % Display contents of myFixedPointPredict.m file
function [label,score] = myFixedPointPredict(X,T) %#codegen
Mdl = loadLearnerForCoder('myMdl','DataType',T);
[label,score] = predict(Mdl,X);
end

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

コードの生成

構造体 TXDataType フィールドは予測子データの固定小数点データ型を指定します。関数cast (Fixed-Point Designer)を使用して XT.XDataType で指定された型に変換します。

X_fx = cast(X,'like',T.XDataType);

codegen を使用して、エントリポイント関数のコードを生成します。X_fx と定数畳み込みされた T をエントリポイント関数の入力引数として指定します。

codegen myFixedPointPredict -args {X_fx,coder.Constant(T)}

codegen は、プラットフォームに依存する拡張子をもつ MEX 関数 myFixedPointPredict_mex を生成します。

生成されたコードの確認

予測子データを predictmyFixedPointPredict_mex に渡し、出力を比較します。

[labels,scores] = predict(Mdl,X);
[labels_fx,scores_fx] = myFixedPointPredict_mex(X_fx,T);

predictmyFixedPointPredict_mex からの出力を比較します。

verify_labels = isequal(labels,labels_fx)
verify_labels = logical
   1

isequalは、logical 1 (true) を返します。これは labelslabels_fx が等しいことを意味します。ラベルが等しくない場合、不正に分類されたラベルの割合を次のように計算できます。

sum(strcmp(labels_fx,labels)==0)/numel(labels_fx)*100
ans = 0

スコア出力間の相対的な差分の最大値を求めます。

relDiff_scores = max(abs((scores_fx.double(:,1)-scores(:,1))./scores(:,1)))
relDiff_scores = 0.0055

比較結果に満足せず、生成されたコードの精度を向上させる場合、固定小数点データ型を調整し、コードを再生成できます。詳細については、generateLearnerDataTypeFcnヒントデータ型関数およびSVM の予測用の固定小数点コード生成を参照してください。

入力引数

すべて折りたたむ

機械学習モデル。完全またはコンパクトなモデル オブジェクトを指定します。サポートされるモデルは次の表に記載されています。

ファイル名。文字ベクトルまたは string スカラーを指定します。

filename ファイルが存在する場合、saveLearnerForCoder はファイルを上書きします。

filename ファイルの拡張子は .mat でなければなりません。filename に拡張子がない場合、saveLearnerForCoder.mat を追加します。

filename に絶対パスが含まれていない場合、saveLearnerForCoder は現在のフォルダーにファイルを保存します。

例: 'SVMMdl'

データ型: char | string

アルゴリズム

saveLearnerForCoder は機械学習モデル (Mdl) をコード生成用に準備します。この関数は、予測には必要ないプロパティを削除します。

  • 対応するコンパクトなモデルがあるモデルの場合、関数 saveLearnerForCoder は該当する関数 compact をモデルに適用してからモデルを保存します。

  • 対応するコンパクトなモデルがないモデル (ClassificationKNNClassificationLinearRegressionLinearExhaustiveSearcherKDTreeSearcher など) の場合、関数 saveLearnerForCoder はプロパティ (ハイパーパラメーター最適化プロパティなど)、ソルバーの学習に関する情報などを削除します。

loadLearnerForCoder は、saveLearnerForCoder によって保存されたモデルを読み込みます。

代替機能

R2019b で導入