Main Content

loadLearnerForCoder

保存されたコード生成用モデルからのモデル オブジェクトの再構築

R2019b 以降

説明

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

単精度の C/C++ コードの生成をサポートする関数の場合は、saveLearnerForCoderloadLearnerForCoder、および codegen (MATLAB Coder) を使用し、関数 loadLearnerForCoder を呼び出すときに名前と値の引数 'DataType','single' を指定します。

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

Code generation workflow for the object function of a machine learning model. Step 1: Train a model. Step 2: Save the model. Step 3 (highlighted): Define an entry-point function. Step 4: Generate code. Step 5: Verify the generated code.

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

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

Fixed-point code generation workflow. Step 1: Train a model. Step 2: Save the model. Step 3: Define the fixed-point data types. Step 4 (highlighted): Define an entry-point function. Step 5 (optional): Optimize the fixed-point data types. Step 6: Generate code. Step 7: Verify the generated code.

Mdl = loadLearnerForCoder(filename) は、filename という名前の MATLAB 形式のバイナリ ファイル (MAT ファイル) に格納されているモデルからモデル (Mdl) を再構築します。filename ファイルは、saveLearnerForCoder を使用して作成しなければなりません。

Mdl = loadLearnerForCoder(filename,'DataType','single') は、filename という名前の MATLAB 形式のバイナリ ファイル (MAT ファイル) に格納されているモデルから単精度のモデル (Mdl) を再構築します。

Mdl = loadLearnerForCoder(filename,'DataType',T) は、filename に格納されているモデルの固定小数点バージョンを返します。構造体 T には、モデルの関数 predict を使用するために必要な変数の固定小数点データ型を指定するフィールドが含まれます。generateLearnerDataTypeFcn によって生成された関数を使用して T を作成します。

この構文をエントリポイント関数で使用し、codegen を使用してエントリポイント関数の固定小数点コードを生成します。コードを生成する場合にのみ、この構文を使用できます。

すべて折りたたむ

機械学習モデルに学習をさせた後で、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);

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

Mdl = discardSupportVectors(Mdl);

モデルの保存

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

saveLearnerForCoder(Mdl,'SVMIris');

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

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

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

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

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

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}
Code generation successful.

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 を使用してモデルを保存します。loadLearnerForCoder を使用してモデルを読み込み学習済みモデルの関数 predict を呼び出す、エントリポイント関数を定義します。その後、codegen (MATLAB Coder) を使用して C/C++ コードを生成します。

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

モデルの学習

fisheriris データ セットを読み込みます。150 本のアヤメについて 4 つの花弁の測定値が含まれる数値行列 X を作成します。対応するアヤメの種類が含まれる文字ベクトルの cell 配列 Y を作成します。

load fisheriris
X = meas;
Y = species;

予測子 X とクラス ラベル Y を使用して、単純ベイズ分類器の学習を行います。

Mdl = fitcnb(X,Y);

Mdl は学習させた ClassificationNaiveBayes 分類器です。

モデルの保存

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

saveLearnerForCoder(Mdl,'naiveBayesIris');

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

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

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

  • 学習済みの単純ベイズ分類モデルを読み込む。

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

type classifyIrisSingle.m
function label = classifyIrisSingle(X) %#codegen
% CLASSIFYIRISSINGLE Classify iris species using single-precision naive
% Bayes model
% CLASSIFYIRISSINGLE classifies the iris flower measurements in X using the
% single-precision naive Bayes model in the file naiveBayesIris.mat, and
% then returns the predicted labels in label.
Mdl = loadLearnerForCoder('naiveBayesIris','DataType','single');
label = predict(Mdl,X);
end

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

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

コードの生成

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

Xpred = single(X);
codegen classifyIrisSingle -args Xpred
Code generation successful.

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

生成されたコードの確認

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

label1 = predict(Mdl,X);
label2 = classifyIrisSingle(X);
label3 = classifyIrisSingle_mex(Xpred);
verify_label = isequal(label1,label2,label3)
verify_label = logical
   1

isequal は、すべての入力が等しいことを意味する logical 1 (true) を返します。3 つの方法で分類したラベルは、すべて同じです。生成された MEX 関数 classifyIrisSingle_mex と関数 predict が同じ分類結果を生成しない場合は、不正に分類されたラベルの割合を計算できます。

sum(strcmp(label3,label1)==0)/numel(label1)*100
ans = 0

機械学習モデルに学習させた後で、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 分類モデルの固定小数点バージョンを読み込みます。

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

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)}
Code generation successful.

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 が等しいことを意味します。

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

入力引数

すべて折りたたむ

モデル オブジェクトを表す構造体配列が格納されている MAT ファイルの名前。文字ベクトルまたは string スカラーを指定します。filename ファイルは saveLearnerForCoder を使用して作成しなければなりません。loadLearnerForCoder は、filename ファイルに保存されているモデルをコンパイル時に再構築します。

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

filename に絶対パスが含まれていない場合、loadLearnerForCoder は現在のフォルダーからファイルを読み込みます。

以下の表は、saveLearnerForCoder を使用して保存できるモデル、および各モデルによる固定小数点および単精度のコード生成のサポートの有無を示しています。

例: 'Mdl'

データ型: char | string

固定小数点データ型。構造体を指定します。この引数は、固定小数点 C/C++ コード生成に使用されます。

generateLearnerDataTypeFcn によって生成された関数を使用して T を作成します。生成された関数と構造体 T の詳細については、generateLearnerDataTypeFcnデータ型関数を参照してください。

この引数は、filename のモデルが、SVM モデル、決定木モデル、および決定木のアンサンブルのときに使用できます。

データ型: struct

制限

  • MdlCompactLinearModel の場合 — fitlm を使用し、RobustWgtFun フィールドに無名関数ハンドルを設定した構造体を 'RobustOpts' に対して指定することにより線形モデルに学習をさせた場合に、saveLearnerForCoder を使用してモデルを保存してから、loadLearnerForCoder を使用してモデルを読み込んだとします。この場合、loadLearnerForCoderRobust プロパティを MATLAB ワークスペースに復元できません。しかし loadLearnerForCoder は、コード生成用のエントリポイント関数内でコンパイル時にモデルを読み込むことができます。

  • MdlCompactClassificationSVM または CompactClassificationECOC の場合 — 事後確率を予測するモデルを保存するために saveLearnerForCoder を使用し、モデルを読み込むために loadLearnerForCoder を使用した場合、loadLearnerForCoderScoreTransform プロパティを MATLAB ワークスペースに復元できません。しかし loadLearnerForCoder は、コード生成用のコンパイル時に、エントリポイント関数内で ScoreTransform プロパティを含めてモデルを読み込むことができます。

ヒント

  • ガウス過程回帰 (GPR) モデルまたはサポート ベクター マシン (SVM) モデル用の単精度コード生成では、モデルに学習させるときに 'Standardize',true を指定して標準化されたデータを使用します。

アルゴリズム

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

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

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

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

代替機能

拡張機能

バージョン履歴

R2019b で導入