機械学習モデルのコーダー コンフィギュアラーの作成
機械学習モデルに学習をさせた後で、learnerCoderConfigurer
を使用してモデルのコーダー コンフィギュアラーを作成します。コンフィギュアラーのプロパティとオブジェクト関数を使用することにより、コード生成オプションを指定し、機械学習モデルの関数 predict
および update
に対する C/C++ コードを生成します。C/C++ コードの生成には MATLAB® Coder™ が必要です。
次のフロー チャートは、コーダー コンフィギュアラーを使用するコード生成のワークフローを示します。強調表示されているステップで learnerCoderConfigurer
を使用します。
は、機械学習モデル configurer
= learnerCoderConfigurer(Mdl
,X
)Mdl
のコーダー コンフィギュアラー configurer
を返します。Mdl
の関数 predict
のための予測子データ X
を指定します。
は、1 つ以上の名前と値のペアの引数で指定された追加オプションを使用して、コーダー コンフィギュアラーを返します。たとえば、関数 configurer
= learnerCoderConfigurer(Mdl
,X
,Name,Value
)predict
の出力引数の個数、生成される C/C++ のファイル名、およびコーダー コンフィギュアラーの詳細レベルを指定できます。
機械学習モデルに学習させてから、コーダー コンフィギュアラーを使用して、このモデルの関数 predict
および update
に対してコードを生成します。
carsmall
データセットを読み込み、サポート ベクター マシン (SVM) 回帰モデルに学習をさせます。
load carsmall
X = [Horsepower,Weight];
Y = MPG;
Mdl = fitrsvm(X,Y);
Mdl
は、RegressionSVM
オブジェクトです。
learnerCoderConfigurer
を使用して、RegressionSVM
モデルについてコーダー コンフィギュアラーを作成します。予測子データ X
を指定します。関数 learnerCoderConfigurer
は、入力 X
を使用して、関数 predict
の入力のコーダー属性を設定します。
configurer = learnerCoderConfigurer(Mdl,X)
configurer = RegressionSVMCoderConfigurer with properties: Update Inputs: Alpha: [1x1 LearnerCoderInput] SupportVectors: [1x1 LearnerCoderInput] Scale: [1x1 LearnerCoderInput] Bias: [1x1 LearnerCoderInput] Predict Inputs: X: [1x1 LearnerCoderInput] Code Generation Parameters: NumOutputs: 1 OutputFileName: 'RegressionSVMModel' Properties, Methods
configurer
は、RegressionSVM
オブジェクトのコーダー コンフィギュアラーである RegressionSVMCoderConfigurer
オブジェクトです。
C/C++ コードを生成するには、適切に設定されている C/C++ コンパイラにアクセスできなければなりません。MATLAB Coder は、サポートされているインストール済みのコンパイラを探して使用します。mex
-setup
を使用すると、既定のコンパイラを表示および変更できます。詳細は、既定のコンパイラの変更を参照してください。
既定の設定を使用して、SVM 回帰モデル (Mdl
) の関数 predict
および update
に対するコードを生成します。
generateCode(configurer)
generateCode creates these files in output folder: 'initialize.m', 'predict.m', 'update.m', 'RegressionSVMModel.mat'
関数 generateCode
は、以下の処理を実行します。
コードを生成するために必要な MATLAB ファイルを生成する。これには、Mdl
の関数 predict
および update
にそれぞれ対応する 2 つのエントリポイント関数 predict.m
および update.m
が含まれます。
2 つのエントリポイント関数に対して、RegressionSVMModel
という名前の MEX 関数を作成する。
MEX 関数のコードを codegen\mex\RegressionSVMModel
フォルダーに作成する。
MEX 関数を現在のフォルダーにコピーする。
関数type
を使用して、predict.m
、update.m
および initialize.m
ファイルの内容を表示します。
type predict.m
function varargout = predict(X,varargin) %#codegen % Autogenerated by MATLAB, 04-Aug-2020 00:25:34 [varargout{1:nargout}] = initialize('predict',X,varargin{:}); end
type update.m
function update(varargin) %#codegen % Autogenerated by MATLAB, 04-Aug-2020 00:25:34 initialize('update',varargin{:}); end
type initialize.m
function [varargout] = initialize(command,varargin) %#codegen % Autogenerated by MATLAB, 04-Aug-2020 00:25:34 coder.inline('always') persistent model if isempty(model) model = loadLearnerForCoder('RegressionSVMModel.mat'); end switch(command) case 'update' % Update struct fields: Alpha % SupportVectors % Scale % Bias model = update(model,varargin{:}); case 'predict' % Predict Inputs: X X = varargin{1}; if nargin == 2 [varargout{1:nargout}] = predict(model,X); else PVPairs = cell(1,nargin-2); for i = 1:nargin-2 PVPairs{1,i} = varargin{i+1}; end [varargout{1:nargout}] = predict(model,X,PVPairs{:}); end end end
データセットの一部を使用して SVM モデルに学習をさせ、モデルについてコーダー コンフィギュアラーを作成します。コーダー コンフィギュアラーのプロパティを使用して、SVM モデル パラメーターのコーダー属性を指定します。コーダー コンフィギュアラーのオブジェクト関数を使用して、新しい予測子データについてラベルを予測する C コードを生成します。その後、データセット全体を使用してモデルに再学習をさせ、コードを再生成せずに、生成されたコードのパラメーターを更新します。
モデルの学習
ionosphere
データセットを読み込みます。このデータセットには、レーダー反射についての 34 個の予測子と、不良 ('b'
) または良好 ('g'
) という 351 個の二項反応が含まれています。最初の 50 個の観測値を使用して、バイナリ SVM 分類モデルに学習をさせます。
load ionosphere
Mdl = fitcsvm(X(1:50,:),Y(1:50));
Mdl
は、ClassificationSVM
オブジェクトです。
コーダー コンフィギュアラーの作成
learnerCoderConfigurer
を使用して、ClassificationSVM
モデルについてコーダー コンフィギュアラーを作成します。予測子データ X
を指定します。関数 learnerCoderConfigurer
は、入力 X
を使用して、関数 predict
の入力のコーダー属性を設定します。また、生成されるコードが予測ラベルおよびスコアを返すようにするため、出力の個数を 2 に設定します。
configurer = learnerCoderConfigurer(Mdl,X(1:50,:),'NumOutputs',2);
configurer
は、ClassificationSVM
オブジェクトのコーダー コンフィギュアラーである ClassificationSVMCoderConfigurer
オブジェクトです。
パラメーターのコーダー属性の指定
生成されたコードのパラメーターをモデルの再学習後に更新できるようにするため、SVM 分類モデルのパラメーターのコーダー属性を指定します。この例では、生成されたコードに渡す予測子データのコーダー属性と、SVM モデルのサポート ベクターのコーダー属性を指定します。
はじめに、生成されたコードが任意の個数の観測値を受け入れるように、X
のコーダー属性を指定します。属性 SizeVector
および VariableDimensions
を変更します。属性 SizeVector
は、予測子データのサイズの上限を指定し、属性 VariableDimensions
は、予測子データの各次元が可変サイズと固定サイズのどちらであるかを指定します。
configurer.X.SizeVector = [Inf 34]; configurer.X.VariableDimensions = [true false];
1 番目の次元のサイズは、観測値の個数です。このケースでは、サイズの上限が Inf
であり、サイズが可変、つまり X
の観測値の個数が任意であることを指定します。この指定は、コードを生成するときに観測値の個数が不明である場合に便利です。
2 番目の次元のサイズは、予測子変数の個数です。この値は、機械学習モデルに対し固定でなければなりません。X
には 34 個の予測子が含まれているので、属性 SizeVector
の値は 34、属性 VariableDimensions
の値は false
でなければなりません。
新しいデータまたは異なる設定を使用して SVM モデルに再学習をさせた場合、サポート ベクターの個数が変化する可能性があります。したがって、生成されたコードのサポート ベクターを更新できるように SupportVectors
のコーダー属性を指定します。
configurer.SupportVectors.SizeVector = [250 34];
SizeVector attribute for Alpha has been modified to satisfy configuration constraints. SizeVector attribute for SupportVectorLabels has been modified to satisfy configuration constraints.
configurer.SupportVectors.VariableDimensions = [true false];
VariableDimensions attribute for Alpha has been modified to satisfy configuration constraints. VariableDimensions attribute for SupportVectorLabels has been modified to satisfy configuration constraints.
SupportVectors
のコーダー属性が変更されると、Alpha
および SupportVectorLabels
のコーダー属性が構成の制約を満たすように変更されます。あるパラメーターのコーダー属性の変更によって構成の制約を満たすために他の従属パラメーターの変更が必要になる場合、従属パラメーターのコーダー属性は変更されます。
コードの生成
C/C++ コードを生成するには、適切に設定されている C/C++ コンパイラにアクセスできなければなりません。MATLAB Coder は、サポートされているインストール済みのコンパイラを探して使用します。mex
-setup
を使用すると、既定のコンパイラを表示および変更できます。詳細は、既定のコンパイラの変更を参照してください。
generateCode
を使用して、SVM 分類モデル (Mdl
) の関数 predict
および update
について、既定の設定でコードを生成します。
generateCode(configurer)
generateCode creates these files in output folder: 'initialize.m', 'predict.m', 'update.m', 'ClassificationSVMModel.mat'
generateCode
は、コードを生成するために必要な MATLAB ファイルを生成します。これには、Mdl
の関数 predict
および update
にそれぞれ対応する 2 つのエントリポイント関数 predict.m
および update.m
が含まれます。次に generateCode
は、2 つのエントリポイント関数に対して ClassificationSVMModel
という名前の MEX 関数を codegen\mex\ClassificationSVMModel
フォルダー内に作成し、この MEX 関数を現在のフォルダーにコピーします。
生成されたコードの確認
予測子データを渡して、Mdl
の関数 predict
と MEX 関数の関数 predict
が同じラベルを返すかどうかを確認します。複数のエントリポイントがある MEX 関数内のエントリポイント関数を呼び出すため、1 番目の入力引数として関数名を指定します。
[label,score] = predict(Mdl,X);
[label_mex,score_mex] = ClassificationSVMModel('predict',X);
isequal
を使用して、label
と label_mex
を比較します。
isequal(label,label_mex)
ans = logical
1
すべての入力が等しい場合、isequal
は logical 1 (true
) を返します。この比較により、同じラベルを Mdl
の関数 predict
と MEX 関数の関数 predict
が返すことを確認します。
score
と比較すると、score_mex
には丸めによる差が含まれている場合があります。このような場合は、小さい誤差を許容して score_mex
と score
を比較します。
find(abs(score-score_mex) > 1e-8)
ans = 0x1 empty double column vector
この比較により、許容誤差 1e–8
内で score
と score_mex
が等しいことを確認します。
モデルの再学習と生成コード内のパラメーターの更新
データセット全体を使用してモデルに再学習をさせます。
retrainedMdl = fitcsvm(X,Y);
validatedUpdateInputs
を使用して、更新するパラメーターを抽出します。この関数は、retrainedMdl
内の修正されたモデル パラメーターを判別し、修正されたパラメーター値がパラメーターのコーダー属性を満たすかどうかを検証します。
params = validatedUpdateInputs(configurer,retrainedMdl);
生成されたコード内のパラメーターを更新します。
ClassificationSVMModel('update',params)
生成されたコードの確認
retrainedMdl
の関数 predict
の出力と、更新した MEX 関数の関数 predict
の出力を比較します。
[label,score] = predict(retrainedMdl,X);
[label_mex,score_mex] = ClassificationSVMModel('predict',X);
isequal(label,label_mex)
ans = logical
1
find(abs(score-score_mex) > 1e-8)
ans = 0x1 empty double column vector
この比較により、labels
と labels_mex
が等しく、スコアの値が許容誤差内で等しいことを確認します。
Mdl
— 機械学習モデル機械学習モデル。完全またはコンパクトなモデル オブジェクトを指定します。サポートされるモデルは次の表に記載されています。
モデル | 完全/コンパクトなモデル オブジェクト | 学習関数 |
---|---|---|
マルチクラス分類用の二分決定木 | ClassificationTree , CompactClassificationTree | fitctree |
1 クラスおよびバイナリ分類用の SVM | ClassificationSVM , CompactClassificationSVM | fitcsvm |
バイナリ分類用の線形モデル | ClassificationLinear | fitclinear |
SVM モデルおよび線形モデル用のマルチクラス モデル | ClassificationECOC , CompactClassificationECOC | fitcecoc |
回帰用の二分決定木 | RegressionTree , CompactRegressionTree | fitrtree |
サポート ベクター マシン (SVM) 回帰 | RegressionSVM , CompactRegressionSVM | fitrsvm |
線形回帰 | RegressionLinear | fitrlinear |
機械学習モデルのコード生成に関する使用上の注意および制限については、モデル オブジェクトのページの「コード生成」セクションを参照してください。
X
— 予測子データMdl
の関数 predict
の予測子データ。n 行 p 列の数値行列を指定します。n は観測値の個数、p は予測子変数の個数です。代わりに X
を観測値が列に対応する p 行 n 列の行列として指定するには、名前と値のペアの引数 'ObservationsIn'
を 'columns'
に設定します。このオプションが利用できるのは、線形バイナリ学習器を含む線形モデルと ECOC モデルのみです。
機械学習モデルの関数 predict
は、分類の場合はラベルを、回帰の場合は応答を、与えられた予測子データに対して予測します。コーダー コンフィギュアラー configurer
の作成後、関数 generateCode
を使用して Mdl
の関数 predict
に対する C/C++ コードを生成できます。生成されるコードは、X
と同じサイズおよびデータ型の予測子データを受け入れます。configurer
の作成後、各次元のサイズを可変または固定のどちらにするかを指定できます。
たとえば、100 個の観測値と 3 つの予測子変数を使用してラベルを予測する C/C++ コードを生成する場合、X
として zeros(100,3)
を指定します。関数 learnerCoderConfigurer
は、X
の値ではなく、サイズおよびデータ型のみを使用します。したがって X
は、特定のデータ型をもつ一連の値を表す MATLAB 式または予測子データにすることができます。出力 configurer
には、configurer
の X
プロパティ内の X
のサイズおよびデータ型が格納されます。configurer
の作成後、X
のサイズおよびデータ型を変更できます。たとえば、観測値の個数を 200 に、データ型を single
に変更します。
configurer.X.SizeVector = [200 3];
configurer.X.DataType = 'single';
生成される C/C++ コードが、最大 100 個の観測値がある予測子データを受け入れるようにするには、X
として zeros(100,3)
を指定し、VariableDimensions
プロパティを変更します。
configurer.X.VariableDimensions = [1 0];
[1 0]
は、X
の 1 番目の次元 (観測値の個数) が可変サイズであり、X
の 2 番目の次元 (予測子変数の個数) が固定サイズであることを示します。指定した観測値の個数 (この例では 100) は、生成される C/C++ コードで許容される観測値の最大数になります。任意の個数の観測値を可能にするには、上限として Inf
を指定します。configurer.X.SizeVector = [Inf 3];
データ型: single
| double
オプションの Name,Value
引数のコンマ区切りペアを指定します。Name
は引数名で、Value
は対応する値です。Name
は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN
のように、複数の名前と値のペアの引数を、任意の順番で指定できます。
configurer = learnerCoderConfigurer(Mdl,X,'NumOutputs',2,'OutputFileName','myModel')
は、predict
の出力の個数を 2 に設定し、生成される C/C++ コードのファイル名として 'myModel'
を指定します。'NumOutputs'
— predict
の出力の個数機械学習モデル Mdl
の関数 predict
の出力引数の個数。'NumOutputs'
と正の整数 n
から構成されるコンマ区切りのペアとして指定します。
次の表は、各種のモデルにおける関数 predict
の出力の一覧です。生成される C/C++ コードの predict
は、「出力」列に示されている順序で関数 predict
の最初の n
個の出力を返します。
モデル | モデルの関数 predict | 出力 |
---|---|---|
マルチクラス分類用の二分決定木 | predict | label (予測クラス ラベル)、score (事後確率)、node (予測クラスのノード数)、cnum (予測ラベルのクラス数) |
1 クラスおよびバイナリ分類用の SVM | predict | label (予測されたクラス ラベル)、score (スコアまたは事後確率) |
バイナリ分類用の線形モデル | predict | Label (予測されたクラス ラベル)、Score (分類スコア) |
SVM モデルおよび線形モデル用のマルチクラス モデル | predict | label (予測されたクラス ラベル)、NegLoss (符号を反転した平均バイナリ損失)、PBScore (正のクラス スコア) |
回帰用の二分決定木 | predict | Yfit (予測された応答)、node (予測のノード数) |
SVM 回帰 | predict | yfit (予測された応答) |
線形回帰 | predict | YHat (予測された応答) |
たとえば、SVM 分類モデルに対して 'NumOutputs',1
を指定した場合、predict
は生成された C/C++ コードで予測クラス ラベルを返します。
コーダー コンフィギュアラー configurer
を作成した後で、ドット表記を使用して出力の個数を変更できます。
configurer.NumOutputs = 2;
名前と値のペアの引数 'NumOutputs'
は、codegen
(MATLAB Coder) のコンパイラ オプション '-nargout'
と等価です。このオプションは、コード生成のエントリポイント関数における出力引数の個数を指定します。コーダー コンフィギュアラーのオブジェクト関数 generateCode
は、Mdl
の関数 predict
および update
に対して predict.m
および update.m
という 2 つのエントリポイント関数をそれぞれ生成し、この 2 つのエントリポイント関数に対して C/C++ コードを生成します。'NumOutputs'
について指定した値は、predict.m
の出力引数の個数に対応します。
例: 'NumOutputs',2
データ型: single
| double
'OutputFileName'
— 生成される C/C++ コードのファイル名Mdl
オブジェクト名+'Model'
(既定値) | 文字ベクトル | string スカラー生成される C/C++ コードのファイル名。'OutputFileName'
と文字ベクトルまたは string スカラーから構成されるコンマ区切りのペアとして指定します。
コーダー コンフィギュアラーのオブジェクト関数 generateCode
は、このファイル名を使用して C/C++ コードを生成します。
オペレーティング システムの構成によってはコード生成に失敗する可能性があるので、ファイル名には空白を含めないでください。また、名前は有効な MATLAB 関数名でなければなりません。
既定のファイル名は、Mdl
のオブジェクト名に 'Model'
を追加した名前です。たとえば、Mdl
が CompactClassificationSVM
または ClassificationSVM
オブジェクトである場合、既定の名前は 'ClassificationSVMModel'
です。
コーダー コンフィギュアラー configurer
を作成した後で、ドット表記を使用してファイル名を変更できます。
configurer.OutputFileName = 'myModel';
例: 'OutputFileName','myModel'
データ型: char
| string
'Verbose'
— 詳細レベルtrue
(logical 1) (既定値) | false
(logical 0)詳細レベル。'Verbose'
と true
(logical 1) または false
(logical 0) のいずれかから構成されるコンマ区切りのペアとして指定します。詳細レベルは、コマンド ラインにおけるコーダー コンフィギュアラー configurer
に関する通知メッセージの表示を制御します。
値 | 説明 |
---|---|
true (logical 1) | パラメーターのコーダー属性に対する変更によって他の従属するパラメーターが変化する場合、通知メッセージが表示されます。 |
false (logical 0) | 通知メッセージは表示されません。 |
生成コード内の機械学習のモデル パラメーターを更新できるようにするには、コード生成の前にパラメーターのコーダー属性を構成する必要があります。パラメーターのコーダー属性は互いに依存するので、依存関係が構成の制約として保存されます。コーダー コンフィギュアラーを使用してパラメーターのコーダー属性を変更するときに、構成の制約を満たすために他の従属するパラメーターも変更する必要がある場合、従属するパラメーターのコーダー属性が変更されます。詳細レベルは、これらの引き続いて起きた変更についてメッセージを表示するかどうかを決定します。
コーダー コンフィギュアラー configurer
を作成した後で、ドット表記を使用して詳細レベルを変更できます。
configurer.Verbose = false;
例: 'Verbose',false
データ型: logical
'ObservationsIn'
— 予測子データにおける観測値の次元'rows'
(既定値) | 'columns'
予測子データにおける観測値の次元。'ObservationsIn'
と、'rows'
または 'columns'
のいずれかから構成されるコンマ区切りのペアとして指定します。'ObservationsIn'
を 'columns'
に設定すると、観測値が列に対応するように予測子データ X
の方向を設定しなければなりません。
メモ
'columns'
オプションが利用できるのは、線形バイナリ学習器を含む線形モデルと ECOC モデルのみです。
例: 'ObservationsIn','columns'
configurer
— コーダー コンフィギュアラー機械学習モデルのコーダー コンフィギュアラー オブジェクト。次の表のいずれかのコーダー コンフィギュアラー オブジェクトとして返されます。
モデル | コーダー コンフィギュアラー オブジェクト |
---|---|
マルチクラス分類用の二分決定木 | ClassificationTreeCoderConfigurer |
1 クラスおよびバイナリ分類用の SVM | ClassificationSVMCoderConfigurer |
バイナリ分類用の線形モデル | ClassificationLinearCoderConfigurer |
SVM モデルおよび線形モデル用のマルチクラス モデル | ClassificationECOCCoderConfigurer |
回帰用の二分決定木 | RegressionTreeCoderConfigurer |
サポート ベクター マシン (SVM) 回帰 | RegressionSVMCoderConfigurer |
線形回帰 | RegressionLinearCoderConfigurer |
コーダー コンフィギュアラー オブジェクトのプロパティとオブジェクト関数を使用することにより、コード生成オプションを設定し、機械学習モデルの関数 predict
および update
に対する C/C++ コードを生成します。
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
Select web siteYou can also select a web site from the following list:
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.