Main Content

generateCode

コーダー コンフィギュアラーの使用による C/C++ コードの生成

説明

機械学習モデルに学習をさせた後で、learnerCoderConfigurer を使用してモデルのコーダー コンフィギュアラーを作成します。コンフィギュアラーのプロパティを変更して、コード生成オプションを指定します。その後、generateCode を使用して、機械学習モデルの関数 predict および update に対する C/C++ コードを生成します。C/C++ コードの生成には MATLAB® Coder™ が必要です。

次のフロー チャートは、コーダー コンフィギュアラーを使用するコード生成のワークフローを示します。強調表示されているステップで generateCode を使用します。

Two code generation workflows: the first after training a model, and the second after retraining the same model. First workflow, Step 1: Create a coder configurer. Step 2 (highlighted): Generate code. Step 3: Verify the generated code. Second workflow, Step 1: Check if the update is valid. If yes, go to Step 2; if no, go to the first step of the first workflow. Step 2: Update the model parameters in the generated code.

generateCode(configurer) は、configurer を使用して、機械学習モデルの関数 predict および update に対する MEX (MATLAB 実行可能ファイル) 関数を生成します。生成された MEX 関数の名前は outputFileName になります。これは、configurerOutputFileName プロパティに格納されているファイル名です。

generateCode は、MEX 関数を生成するため、コードの生成に必要な以下の MATLAB ファイルを生成し、これらを現在のフォルダーに保存します。

  • predict.mupdate.m および initialize.mpredict.mupdate.m はそれぞれ、機械学習モデルの関数 predict および update のエントリポイント関数です。この 2 つの関数で initialize.m を呼び出します。

  • 機械学習モデルの情報が格納されている MAT ファイル — generateCode は、関数 saveLearnerForCoder を使用して、機械学習モデルの情報を MAT ファイルに保存します。このファイルの名前は、コーダー コンフィギュアラーの OutputFileName プロパティに格納されます。initialize.m は、関数 loadLearnerForCoder を使用して、保存された MAT ファイルを読み込みます。

generateCode は、必要な MATLAB ファイルを生成した後で、MEX 関数およびそのコードを codegen\mex\outputFileName フォルダーに作成し、MEX 関数を現在のフォルダーにコピーします。

generateCode(configurer,cfg) は、cfg によって指定されたビルド タイプを使用して C/C++ コードを生成します。

generateCode(___,'OutputPath',outputPath) は、前の構文の入力引数に加えて、出力ファイルのフォルダー パスを指定します。generateCode は、outputPath によって指定されたフォルダーに MATLAB ファイルを生成し、outputPath\codegen\type\outputFileName フォルダーに C/C++ を生成します。type は、cfg によって指定されたビルド タイプです。

すべて折りたたむ

機械学習モデルに学習させてから、コーダー コンフィギュアラーを使用して、このモデルの関数 predict および update に対してコードを生成します。

carsmall データ セットを読み込み、サポート ベクター マシン (SVM) 回帰モデルに学習をさせます。

load carsmall
X = [Horsepower,Weight];
Y = MPG;
Mdl = fitrsvm(X,Y);

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

Mdl = discardSupportVectors(Mdl);

learnerCoderConfigurer を使用して、RegressionSVM モデルについてコーダー コンフィギュアラーを作成します。予測子データ X を指定します。関数 learnerCoderConfigurer は、入力 X を使用して、関数 predict の入力のコーダー属性を設定します。

configurer = learnerCoderConfigurer(Mdl,X)
Warning: Default response is removed to support learnerCoderConfigurer. The model will predict NaNs for observations with missing values.
configurer = 
  RegressionSVMCoderConfigurer with properties:

   Update Inputs:
              Beta: [1x1 LearnerCoderInput]
             Scale: [1x1 LearnerCoderInput]
              Bias: [1x1 LearnerCoderInput]

   Predict Inputs:
                 X: [1x1 LearnerCoderInput]

   Code Generation Parameters:
        NumOutputs: 1
    OutputFileName: 'RegressionSVMModel'


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

関数 generateCode は、以下の処理を実行します。

  • コードを生成するために必要な MATLAB ファイルを生成する。これには、Mdl の関数 predict および update にそれぞれ対応する 2 つのエントリポイント関数 predict.m および update.m が含まれます。

  • 2 つのエントリポイント関数に対して、RegressionSVMModel という名前の MEX 関数を作成する。

  • MEX 関数のコードを codegen\mex\RegressionSVMModel フォルダーに作成する。

  • MEX 関数を現在のフォルダーにコピーする。

関数typeを使用して、predict.mupdate.m および initialize.m ファイルの内容を表示します。

type predict.m
function varargout = predict(X,varargin) %#codegen
% Autogenerated by MATLAB, 20-Jul-2024 17:19:44
[varargout{1:nargout}] = initialize('predict',X,varargin{:});
end
type update.m
function update(varargin) %#codegen
% Autogenerated by MATLAB, 20-Jul-2024 17:19:44
initialize('update',varargin{:});
end
type initialize.m
function [varargout] = initialize(command,varargin) %#codegen
% Autogenerated by MATLAB, 20-Jul-2024 17:19:44
coder.inline('always')
persistent model
if isempty(model)
    model = loadLearnerForCoder('RegressionSVMModel.mat');
end
switch(command)
    case 'update'
        % Update struct fields: Beta
        %                       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

機械学習モデルに学習をさせ、学習済みモデルのコーダー コンフィギュアラーを使用してコードを生成します。コードを生成するときに、コード生成構成オブジェクトを使用して、ビルド タイプおよび他の構成オプションを指定します。

ionosphere データ セットを読み込みます。

load ionosphere

自動カーネル スケールのガウス カーネル関数を使用してバイナリ サポート ベクター マシン (SVM) 分類モデルに学習させます。

Mdl = fitcsvm(X,Y, ...
    'KernelFunction','gaussian','KernelScale','auto');

Mdl は、ClassificationSVM オブジェクトです。

learnerCoderConfigurer を使用して、ClassificationSVM モデルについてコーダー コンフィギュアラーを作成します。予測子データ X を指定します。関数 learnerCoderConfigurer は、入力 X を使用して、関数 predict の入力のコーダー属性を設定します。

configurer = learnerCoderConfigurer(Mdl,X);

configurer は、ClassificationSVM オブジェクトのコーダー コンフィギュアラーである ClassificationSVMCoderConfigurer オブジェクトです。

coder.config (MATLAB Coder) を使用して、コード生成構成オブジェクトを作成します。ダイナミック ライブラリを生成するため 'dll' を指定し、コード生成レポートを有効にするため GenerateReport プロパティとして true を指定します。

cfg = coder.config('dll');
cfg.GenerateReport = true;

C/C++ コードを生成するには、適切に設定されている C/C++ コンパイラにアクセスできなければなりません。MATLAB Coder は、サポートされているインストール済みのコンパイラを探して使用します。mex -setup を使用すると、既定のコンパイラを表示および変更できます。詳細は、既定のコンパイラの変更を参照してください。

generateCode と構成オブジェクト cfg を使用して、コードを生成します。また、出力フォルダー パスを指定します。

generateCode(configurer,cfg,'OutputPath','testPath')
Specified folder does not exist. Folder has been created.
generateCode creates these files in output folder:
'initialize.m', 'predict.m', 'update.m', 'ClassificationSVMModel.mat'
Code generation successful: To view the report, open('codegen/dll/ClassificationSVMModel/html/report.mldatx')

generateCode は、指定されたフォルダーを作成します。この関数は、コードの生成に必要な MATLAB ファイルも生成し、これらをこのフォルダーに格納します。その後、generateCodetestPath\codegen\dll\ClassificationSVMModel フォルダーに C コードを生成します。

SVM バイナリ学習器を使用する誤り訂正出力符号 (ECOC) モデルに学習をさせ、このモデルのコーダー コンフィギュアラーを作成します。コーダー コンフィギュアラーのプロパティを使用して、ECOC モデルのパラメーターのコーダー属性を指定します。コーダー コンフィギュアラーのオブジェクト関数を使用して、新しい予測子データについてラベルを予測する C コードを生成します。その後、異なる設定を使用してモデルに再学習をさせ、コードを再生成せずに、生成されたコードのパラメーターを更新します。

モデルの学習

フィッシャーのアヤメのデータ セットを読み込みます。

load fisheriris
X = meas;
Y = species;

ガウス カーネル関数を使用し、予測子データを標準化する、SVM バイナリ学習器テンプレートを作成します。

t = templateSVM('KernelFunction','gaussian','Standardize',true);

テンプレート t を使用して、マルチクラス ECOC モデルに学習をさせます。

Mdl = fitcecoc(X,Y,'Learners',t);

Mdl は、ClassificationECOC オブジェクトです。

コーダー コンフィギュアラーの作成

learnerCoderConfigurer を使用して、ClassificationECOC モデルについてコーダー コンフィギュアラーを作成します。予測子データ X を指定します。関数 learnerCoderConfigurer は、入力 X を使用して、関数 predict の入力のコーダー属性を設定します。また、出力の個数を 2 に設定して、生成されるコードが関数predictの最初の 2 つの出力 (予測されたラベルと符号を反転した平均バイナリ損失) を返すようにします。

configurer = learnerCoderConfigurer(Mdl,X,'NumOutputs',2)
configurer = 
  ClassificationECOCCoderConfigurer with properties:

   Update Inputs:
    BinaryLearners: [1x1 ClassificationSVMCoderConfigurer]
             Prior: [1x1 LearnerCoderInput]
              Cost: [1x1 LearnerCoderInput]

   Predict Inputs:
                 X: [1x1 LearnerCoderInput]

   Code Generation Parameters:
        NumOutputs: 2
    OutputFileName: 'ClassificationECOCModel'


configurer は、ClassificationECOC オブジェクトのコーダー コンフィギュアラーである ClassificationECOCCoderConfigurer オブジェクトです。表示には、predictupdate の調整可能な入力引数 XBinaryLearnersPrior および Cost が示されています。

パラメーターのコーダー属性の指定

predict の引数 (予測子データと名前と値のペアの引数 'Decoding' および 'BinaryLoss') と update の引数 (SVM 学習器のサポート ベクター) のコーダー属性を指定して、生成されるコードでこれらの引数を predictupdate の入力引数として使用できるようにします。

はじめに、生成されたコードが任意の個数の観測値を受け入れるように、X のコーダー属性を指定します。属性 SizeVector および VariableDimensions を変更します。属性 SizeVector は、予測子データのサイズの上限を指定し、属性 VariableDimensions は、予測子データの各次元が可変サイズと固定サイズのどちらであるかを指定します。

configurer.X.SizeVector = [Inf 4];
configurer.X.VariableDimensions = [true false];

1 番目の次元のサイズは、観測値の個数です。このケースでは、サイズの上限が Inf であり、サイズが可変、つまり X の観測値の個数が任意であることを指定します。この指定は、コードを生成するときに観測値の個数が不明である場合に便利です。

2 番目の次元のサイズは、予測子変数の個数です。この値は、機械学習モデルに対して固定しなければなりません。X には 4 つの予測子が含まれているので、SizeVector 属性の 2 番目の値は 4、VariableDimensions 属性の 2 番目の値は false でなければなりません。

次に、生成されるコードで名前と値のペアの引数 'BinaryLoss' および 'Decoding' を使用するように、BinaryLossDecoding のコーダー属性を変更します。BinaryLoss のコーダー属性を表示します。

configurer.BinaryLoss
ans = 
  EnumeratedInput with properties:

             Value: 'hinge'
    SelectedOption: 'Built-in'
    BuiltInOptions: {'hamming'  'linear'  'quadratic'  'exponential'  'binodeviance'  'hinge'  'logit'}
        IsConstant: 1
        Tunability: 0

生成されるコードで既定以外の値を使用するには、コードを生成する前に値を指定しなければなりません。BinaryLossValue 属性として 'exponential' を指定します。

configurer.BinaryLoss.Value = 'exponential';
configurer.BinaryLoss
ans = 
  EnumeratedInput with properties:

             Value: 'exponential'
    SelectedOption: 'Built-in'
    BuiltInOptions: {'hamming'  'linear'  'quadratic'  'exponential'  'binodeviance'  'hinge'  'logit'}
        IsConstant: 1
        Tunability: 1

Tunabilityfalse (logical 0) である場合に属性値を変更すると、Tunabilitytrue (logical 1) に設定されます。

Decoding のコーダー属性を表示します。

configurer.Decoding
ans = 
  EnumeratedInput with properties:

             Value: 'lossweighted'
    SelectedOption: 'Built-in'
    BuiltInOptions: {'lossweighted'  'lossbased'}
        IsConstant: 1
        Tunability: 0

生成されるコードで BuiltInOptions の利用可能なすべての値を使用できるようにするため、DecodingIsConstant 属性として false を指定します。

configurer.Decoding.IsConstant = false;
configurer.Decoding
ans = 
  EnumeratedInput with properties:

             Value: [1x1 LearnerCoderInput]
    SelectedOption: 'NonConstant'
    BuiltInOptions: {'lossweighted'  'lossbased'}
        IsConstant: 0
        Tunability: 1

DecodingValue 属性が LearnerCoderInput オブジェクトに変更されるので、'lossweighted''lossbased' の両方を 'Decoding' の値として使用できます。また、SelectedOption'NonConstant' に、Tunabilitytrue に設定されます。

最後に、BinaryLearnersSupportVectors のコーダー属性を変更します。SupportVectors のコーダー属性を表示します。

configurer.BinaryLearners.SupportVectors
ans = 
  LearnerCoderInput with properties:

            SizeVector: [54 4]
    VariableDimensions: [1 0]
              DataType: 'double'
            Tunability: 1

各学習器でサポート ベクターの個数が異なるので、VariableDimensions の既定値は [true false] です。新しいデータまたは異なる設定を使用して ECOC モデルに再学習をさせた場合、SVM 学習器のサポート ベクターの個数が変化する可能性があります。したがって、サポート ベクターの個数の上限を増やします。

configurer.BinaryLearners.SupportVectors.SizeVector = [150 4];
SizeVector attribute for Alpha has been modified to satisfy configuration constraints.
SizeVector attribute for SupportVectorLabels has been modified to satisfy configuration constraints.

SupportVectors のコーダー属性が変更されると、Alpha および SupportVectorLabels のコーダー属性が構成の制約を満たすように変更されます。あるパラメーターのコーダー属性の変更によって構成の制約を満たすために他の従属パラメーターの変更が必要になる場合、従属パラメーターのコーダー属性は変更されます。

コーダー コンフィギュアラーを表示します。

configurer
configurer = 
  ClassificationECOCCoderConfigurer with properties:

   Update Inputs:
    BinaryLearners: [1x1 ClassificationSVMCoderConfigurer]
             Prior: [1x1 LearnerCoderInput]
              Cost: [1x1 LearnerCoderInput]

   Predict Inputs:
                 X: [1x1 LearnerCoderInput]
        BinaryLoss: [1x1 EnumeratedInput]
          Decoding: [1x1 EnumeratedInput]

   Code Generation Parameters:
        NumOutputs: 2
    OutputFileName: 'ClassificationECOCModel'


BinaryLossDecoding も表示に含まれるようになりました。

コードの生成

C/C++ コードを生成するには、適切に設定されている C/C++ コンパイラにアクセスできなければなりません。MATLAB Coder は、サポートされているインストール済みのコンパイラを探して使用します。mex -setup を使用すると、既定のコンパイラを表示および変更できます。詳細は、既定のコンパイラの変更を参照してください。

ECOC 分類モデル (Mdl) の関数 predict および update のコードを生成します。

generateCode(configurer)
generateCode creates these files in output folder:
'initialize.m', 'predict.m', 'update.m', 'ClassificationECOCModel.mat'
Code generation successful.

関数 generateCode は、以下の処理を実行します。

  • コードを生成するために必要な MATLAB ファイルを生成する。これには、Mdl の関数 predict および update にそれぞれ対応する 2 つのエントリポイント関数 predict.m および update.m が含まれます。

  • 2 つのエントリポイント関数に対して、ClassificationECOCModel という名前の MEX 関数を作成する。

  • MEX 関数のコードを codegen\mex\ClassificationECOCModel フォルダーに作成する。

  • MEX 関数を現在のフォルダーにコピーする。

生成されたコードの確認

予測子データを渡して、Mdl の関数 predict と MEX 関数の関数 predict が同じラベルを返すかどうかを確認します。複数のエントリポイントがある MEX 関数内のエントリポイント関数を呼び出すため、1 番目の入力引数として関数名を指定します。コードを生成する前に IsConstant 属性を変更して 'Decoding' を調整可能な入力引数として指定したので、'lossweighted''Decoding' の既定値ですが、MEX 関数を呼び出すときにも同じ指定を行う必要があります。

[label,NegLoss] = predict(Mdl,X,'BinaryLoss','exponential');
[label_mex,NegLoss_mex] = ClassificationECOCModel('predict',X,'BinaryLoss','exponential','Decoding','lossweighted');

isequalを使用して、labellabel_mex を比較します。

isequal(label,label_mex)
ans = logical
   1

すべての入力が等しい場合、isequal は logical 1 (true) を返します。この比較により、同じラベルを Mdl の関数 predict と MEX 関数の関数 predict が返すことを確認します。

NegLoss と比較すると、NegLoss_mex には丸めによる差が含まれている可能性があります。このケースでは、小さい誤差を許容して NegLoss_mexNegLoss を比較します。

find(abs(NegLoss-NegLoss_mex) > 1e-8)
ans =

  0x1 empty double column vector

この比較により、許容誤差 1e–8 内で NegLossNegLoss_mex が等しいことを確認します。

モデルの再学習と生成コード内のパラメーターの更新

異なる設定を使用してモデルに再学習をさせます。ヒューリスティック手法を使用して適切なスケール係数が選択されるようにするため、'KernelScale' として 'auto' を指定します。

t_new = templateSVM('KernelFunction','gaussian','Standardize',true,'KernelScale','auto');
retrainedMdl = fitcecoc(X,Y,'Learners',t_new);

validatedUpdateInputs を使用して、更新するパラメーターを抽出します。この関数は、retrainedMdl 内の修正されたモデル パラメーターを判別し、修正されたパラメーター値がパラメーターのコーダー属性を満たすかどうかを検証します。

params = validatedUpdateInputs(configurer,retrainedMdl);

生成されたコード内のパラメーターを更新します。

ClassificationECOCModel('update',params)

生成されたコードの確認

retrainedMdl の関数 predict の出力と、更新した MEX 関数の関数 predict の出力を比較します。

[label,NegLoss] = predict(retrainedMdl,X,'BinaryLoss','exponential','Decoding','lossbased');
[label_mex,NegLoss_mex] = ClassificationECOCModel('predict',X,'BinaryLoss','exponential','Decoding','lossbased');
isequal(label,label_mex)
ans = logical
   1

find(abs(NegLoss-NegLoss_mex) > 1e-8)
ans =

  0x1 empty double column vector

この比較により、labellabel_mex が等しく、NegLossNegLoss_mex が許容誤差内で等しいことが確認されます。

入力引数

すべて折りたたむ

機械学習モデルのコーダー コンフィギュアラー オブジェクト。learnerCoderConfigurer を使用して作成したコーダー コンフィギュアラー オブジェクトを指定します。

モデルコーダー コンフィギュアラー オブジェクト
マルチクラス分類用の二分決定木ClassificationTreeCoderConfigurer
1 クラスおよびバイナリ分類用の SVMClassificationSVMCoderConfigurer
バイナリ分類用の線形モデルClassificationLinearCoderConfigurer
SVM モデルおよび線形モデル用のマルチクラス モデルClassificationECOCCoderConfigurer
回帰用の二分決定木RegressionTreeCoderConfigurer
サポート ベクター マシン (SVM) 回帰RegressionSVMCoderConfigurer
線形回帰RegressionLinearCoderConfigurer

ビルド タイプ。'mex''dll''lib'、または coder.config (MATLAB Coder) で作成したコード生成構成オブジェクトを指定します。

generateCode は、以下のいずれかのビルド タイプを使用して C/C++ コードを生成します。

  • 'mex' — プラットフォームに依存する拡張子をもつ MEX 関数を生成します。MEX 関数は、コマンド ウィンドウから実行できる C/C++ プログラムです。展開用の C/C++ ライブラリを生成する前に、生成されるコードが正しい機能を提供するかどうかを検証するため、MEX 関数を生成します。

  • 'dll' — ダイナミック C/C++ ライブラリを生成します。

  • 'lib' — スタティック C/C++ ライブラリを生成します。

  • coder.config (MATLAB Coder) で作成したコード生成構成オブジェクト — コード生成オプションをカスタマイズするため、コード生成構成オブジェクトを使用して C/C++ コードを生成します。このオブジェクトを使用して、ビルド タイプおよび他の構成オプションを指定できます。たとえば、コード生成レポートを有効にするには GenerateReport パラメーターを変更し、C++ コードを生成するには TargetLang パラメーターを変更します。TargetLang パラメーターの既定値は、C コードを生成する 'C' です。

    cfg = coder.config('mex');
    cfg.GenerateReport = true;
    cfg.TargetLang = 'C++';
    詳細については、codegen (MATLAB Coder)-config オプション、coder.config (MATLAB Coder)、およびビルド設定の構成 (MATLAB Coder)を参照してください。

generateCode は、outputPath\codegen\type\outputFileName フォルダーに C/C++ コードを生成します。type は引数 cfg によって指定されたビルド タイプ、outputFileNameconfigurerOutputFileName プロパティに格納されているファイル名です。

generateCode の出力ファイルのフォルダー パス。文字ベクトルまたは string 配列を指定します。

フォルダー パスとして、絶対パスまたは現在のフォルダー パスに対する相対パスを指定できます。

  • パスには空白を含めないでください。これは、オペレーティング システムの構成によってはコード生成の失敗を引き起こす可能性があります。

  • 日本語文字など、7 ビット ASCII 以外の文字をパスに含めることもできません。

指定されたフォルダーが存在しない場合、generateCode はフォルダーを作成します。

generateCode は以下の 4 つの MATLAB ファイル、predict.mupdate.minitialize.m、および機械学習モデルの情報を含む MAT ファイルを、指定されたフォルダーで探します。この 4 つのファイルがフォルダーに存在しない場合、generateCode はファイルを生成します。それ以外の場合、generateCode は MATLAB ファイルを生成しません。

generateCode は、outputPath\codegen\type\outputFileName フォルダーに C/C++ コードを生成します。type は引数 cfg によって指定されたビルド タイプ、outputFileNameconfigurerOutputFileName プロパティに格納されているファイル名です。

例: 'C:\myfiles'

データ型: char | string

制限

代替機能

  • 独自のコード生成ワークフローに従って MATLAB ファイル (predict.mupdate.minitialize.m) を変更する場合は、generateFiles を使用してこれらのファイルを生成し、codegen (MATLAB Coder) を使用してコードを生成します。

バージョン履歴

R2018b で導入