ドキュメンテーション

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

generateCode

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

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

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

構文

generateCode(configurer)
generateCode(configurer,cfg)
generateCode(___,'OutputPath',outputPath)

説明

generateCode(configurer) は、configurer を使用して機械学習モデルの関数 predict および update に対する MEX 関数を生成します。生成された 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: [1×1 LearnerCoderInput]
    SupportVectors: [1×1 LearnerCoderInput]
             Scale: [1×1 LearnerCoderInput]
              Bias: [1×1 LearnerCoderInput]

   Predict Inputs:
                 X: [1×1 LearnerCoderInput]

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


  Properties, Methods

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

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

generateCode を使用して、RegressionSVM モデルの関数 predict および update について、既定の設定でコード生成します。

generateCode(configurer)
These files do not exist in output folder:
'initialize.m', 'predict.m', 'update.m', 'RegressionSVMModel.mat'
generateCode generates these files for code generation.

generateCode は、コードを生成するために必要な MATLAB ファイルを生成します。これには、RegressionSVM モデル (Mdl) の関数 predict および update にそれぞれ対応するエントリポイント関数 predict.m および update.m が含まれます。次に generateCode は、2 つのエントリポイント関数に対する RegressionSVMModel という名前の MEX 関数およびこの MEX 関数のコードを codegen\mex\RegressionSVMModel フォルダー内に作成し、この MEX 関数を現在のフォルダーにコピーします。

predict.mupdate.m および initialize.m ファイルの内容を表示します。

type predict.m % Display contents of predict.m
function varargout = predict(X,varargin) %#codegen
% Autogenerated by MATLAB,  19-Jul-2018 13:17:23
[varargout{1:nargout}] = initialize('predict',X,varargin{:});
end
type update.m % Display contents of update.m
function update(varargin) %#codegen
% Autogenerated by MATLAB,  19-Jul-2018 13:17:23
initialize('update',varargin{:});
end
type initialize.m % Display contents of initialize.m
function [varargout] = initialize(command,varargin) %#codegen
% Autogenerated by MATLAB, 19-Jul-2018 13:17:23
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.
These files do not exist in output folder:
'initialize.m', 'predict.m', 'update.m', 'ClassificationSVMModel.mat'
generateCode generates these files for code generation.
Code generation successful: View report

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

データセットの一部を使用してサポート ベクター マシン (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 を使用すると、既定のコンパイラを表示および変更できます。詳細は、既定のコンパイラの変更 (MATLAB)を参照してください。

generateCode を使用して、ClassificationSVM モデルの関数 predict および update について、既定の設定でコード生成します。

generateCode(configurer)
These files do not exist in output folder:
'initialize.m', 'predict.m', 'update.m', 'ClassificationSVMModel.mat'
generateCode generates these files for code generation.

generateCode は、コードを生成するために必要な MATLAB ファイルを生成します。これには、ClassificationSVM モデル (Mdl) の関数 predict および update にそれぞれ対応するエントリポイント関数 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 を使用して、labellabel_mex を比較します。

isequal(label,label_mex)
ans = logical
   1

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

score と比較すると、score_mex には丸めによる差が含まれている場合があります。このような場合は、小さい誤差を許容して score_mexscore を比較します。

find(abs(score-score_mex) > 1e-8)
ans =

  0×1 empty double column vector

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

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

データセット全体を使用してモデルに再学習をさせます。

retrainedMdl = fitcsvm(X,Y);

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

params = validatedUpdateInputs(configurer,retrainedMdl);

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

ClassificationSVMModel('update',params)

生成されたコードの確認

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

labels = predict(retrainedMdl,X);
label_mex = ClassificationSVMModel('predict',X);
isequal(labels,label_mex)
ans = logical
   1

find(abs(score-score_mex) > 1e-8)
ans =

  0×1 empty double column vector

この比較により、labelslabels_mex が等しく、スコアの値が許容誤差内で等しいことを確認します。

入力引数

すべて折りたたむ

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

次の表に、サポートされる機械学習モデルに対応するコーダー コンフィギュアラー オブジェクトを示します。

モデルコーダー コンフィギュアラー オブジェクト
サポート ベクター マシン (SVM) 分類ClassificationSVMCoderConfigurer
SVM 回帰RegressionSVMCoderConfigurer

ビルド タイプ。'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 の関数リファレンス ページを参照してください。

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

    モデルモデル オブジェクトオブジェクト関数
    SVM 分類CompactClassificationSVMpredictupdate
    SVM 回帰CompactRegressionSVMpredictupdate

代替機能

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

R2018b で導入