Main Content

saveLearnerForCoder

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

説明

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

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

Code generation workflow for the object function of a machine learning model. Step 1: Train a model. Step 2 (highlighted): Save the model. Step 3: 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 の固定小数点のコード生成ワークフローを示します。強調表示されているステップで saveLearnerForCoder を使用します。

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

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);

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 を使用してモデルを保存します。固定小数点のコード生成の場合、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 の予測用の固定小数点コード生成を参照してください。

入力引数

すべて折りたたむ

機械学習モデル。完全またはコンパクトなモデル オブジェクトを指定します。サポートされるモデルは次の表に記載されています。表には、各モデルが固定小数点コードの生成をサポートしているかどうかも示されています。

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

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

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

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

例: 'SVMMdl'

データ型: char | string

ヒント

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

    • Mdl が線形 SVM モデルの場合、モデルに予測子係数とサポート ベクターの両方があれば、関数 discardSupportVectors (分類の場合) または関数 discardSupportVectors (回帰の場合) を使用してモデルからサポート ベクターを削除できます。既定では、線形カーネルを使用する SVM モデルには、予測子係数とサポート ベクターの両方が含まれています。

    • Mdl が線形 SVM 学習器を含む ECOC モデルの場合、学習器に予測子係数とサポート ベクターの両方があれば、関数 discardSupportVectors を使用して学習器からサポート ベクターを削除できます。線形 SVM 学習器の既定の SaveSupportVectors の値は false です。したがって、既定では、ECOC モデルに学習器のサポート ベクターは含まれません。

アルゴリズム

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

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

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

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

代替機能

バージョン履歴

R2019b で導入