Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

loadLearnerForCoder

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

説明

機械学習モデルのオブジェクト関数 (predictrandomknnsearchrangesearch、インクリメンタル学習オブジェクト関数など) に対する 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に含まれるようにします。

loadfisheririsinds = ~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 分類モデルを読み込む。

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

typeclassifyIris.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)を参照してください。

codegenclassifyIris-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 =logical1

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

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

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

モデルの学習

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

loadfisheririsX = meas; Y = species;

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

Mdl = fitcnb(X,Y);

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

モデルの保存

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

saveLearnerForCoder(Mdl,'naiveBayesIris');

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

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

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

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

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

typeclassifyIrisSingle.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); codegenclassifyIrisSingle-argsXpred
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 =logical1

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 分類モデルに学習をさせます。

loadionosphereMdl = 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 分類モデルの固定小数点バージョンを読み込みます。

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

typemyFixedPointPredict.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をエントリポイント関数の入力引数として指定します。

codegenmyFixedPointPredict-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 =logical1

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 の予測用の固定小数点コード生成を参照してください。

入力引数

すべて折りたたむ

モデル オブジェクトを表す構造体配列が格納されている 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

出力引数

すべて折りたたむ

機械学習モデル。次のいずれかのモデル オブジェクトとして返されます。

ヒント

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

アルゴリズム

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

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

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

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

代替機能

拡張機能

バージョン履歴

R2019b で導入