ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

generateCode

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

説明

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

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

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 は、関数 saveCompactModel を使用して、機械学習モデルの情報を MAT ファイルに保存します。このファイルの名前は、コーダー コンフィギュアラーの OutputFileName プロパティに格納されます。initialize.m は、関数 loadCompactModel を使用して、保存された 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 は、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 を使用すると、既定のコンパイラを表示および変更できます。詳細は、既定のコンパイラの変更 (MATLAB)を参照してください。

既定の設定を使用して、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.mupdate.m および initialize.m ファイルの内容を表示します。

type predict.m
function varargout = predict(X,varargin) %#codegen
% Autogenerated by MATLAB,  09-Feb-2019 00:40:54
[varargout{1:nargout}] = initialize('predict',X,varargin{:});
end
type update.m
function update(varargin) %#codegen
% Autogenerated by MATLAB,  09-Feb-2019 00:40:54
initialize('update',varargin{:});
end
type initialize.m
function [varargout] = initialize(command,varargin) %#codegen
% Autogenerated by MATLAB, 09-Feb-2019 00:40:54
coder.inline('always');
persistent model;
if isempty(model)
    model = loadCompactModel('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

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

ionosphere データセットを読み込み、バイナリ サポート ベクター マシン (SVM) 分類モデルに学習をさせます。

load ionosphere
Mdl = fitcsvm(X,Y);

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

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

configurer = learnerCoderConfigurer(Mdl,X);

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

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

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

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

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: [1×1 ClassificationSVMCoderConfigurer]
             Prior: [1×1 LearnerCoderInput]
              Cost: [1×1 LearnerCoderInput]

   Predict Inputs:
                 X: [1×1 LearnerCoderInput]

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


  Properties, Methods

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: [1×1 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: [1×1 ClassificationSVMCoderConfigurer]
             Prior: [1×1 LearnerCoderInput]
              Cost: [1×1 LearnerCoderInput]

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

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


  Properties, Methods

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

コードの生成

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

既定の設定を使用して、ECOC 分類モデル (Mdl) の関数 predict および update に対するコードを生成します。

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

関数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 =

  0×1 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 =

  0×1 empty double column vector

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

入力引数

すべて折りたたむ

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

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

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

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

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

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

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

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

    cfg = coder.config('mex');
    cfg.GenerateReport = true;
    cfg.TargetLang = 'C++';
    詳細については、codegen-config オプション、coder.config、およびビルド設定の構成 (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

制限

  • 関数 generateCode は関数 saveCompactModelloadCompactModel および codegen を使用するので、これらの関数におけるコード生成の制限は関数 generateCode にも適用されます。詳細については、saveCompactModelloadCompactModel および codegen の関数リファレンス ページを参照してください。

  • 機械学習モデルおよびそのオブジェクト関数のコード生成に関する使用上の注意および制限については、対応するリファレンス ページの「コード生成」セクションを参照してください。

    モデルモデル オブジェクト関数 predict
    SVM 回帰CompactRegressionSVMpredict
    1 クラスおよびバイナリ分類用の SVMCompactClassificationSVMpredict
    SVM 用のマルチクラス モデルCompactClassificationECOCpredict

代替機能

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

R2018b で導入