主要内容

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

コド生成用の可変サズ引数の指定

この例では,分類または回帰モデルオブジェクトのオブジェクト関数に対してコードを生成するときに可変サイズの入力引数を指定する方法を示します。可変サズのデタは,実行時にサズが変化する可能性があるデタです。可変サ▪▪ズの入力引数の指定は,コンパ▪▪ル時にサ▪▪ズが不明であるデ▪タの場合に便利です。この例では,名前と値のペアの引数をエントリポイント関数に含める方法と,コードを生成するときにこれらを指定する方法についても説明します。

コド生成ワクフロの詳細な例にいては,機械学習モデルの予測をコマンドラ▪▪ンで行うコ▪▪ドの生成機械学習モデルの予測をMATLAB Coderアプリを使用して行うコ,ドの生成を参照してください。

分類モデルの学習

フィッシャ,のアヤメのデ,タセットを読み込みます。ラベルを文字行列に変換します。

负载fisheriris物种= char(物种);

デ,タセット全体を使用して分類木に学習をさせます。

Mdl = fitctree(meas,种);

MdlClassificationTreeモデルです。

saveLearnerForCoderの使用によるモデルの保存

saveLearnerForCoderを使用して,学習済みの分類木を現在のフォルダ,のClassTreeIris.matという名前のファ@ @ルに保存します。

MdlName =“ClassTreeIris”;saveLearnerForCoder (Mdl MdlName);

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

現在のフォルダ,で,以下を行うmypredictTree.mという名前のエントリポ@ @ント関数を定義します。

  • に対応する列をも測定値を受け入れ,有効な名前と値のペアの引数を受け入れる。

  • loadLearnerForCoderを使用して,学習済み分類木を読み込む。

  • 読み込んだ分類木から,ラベルおよび対応するスコア,ノ,ド番号,クラス番号を予測する。

入力引数として变长度输入宗量を指定することにより,オプションの名前と値のペアの引数に対応できます。詳細にいては,可変長引数リストのコ,ド生成(MATLAB编码器)を参照してください。

类型mypredictTree.m显示mypredictTree的内容。m文件
function [label,score,node,cnum] = mypredictTree(x,savedmdl,varargin) %#codegen % mypredictTree使用分类树预测虹膜物种% mypredictTree使用mat文件%中名称在savedmdl中的分类树预测% n-by-4矩阵x中n个观测值的虹膜物种,然后返回%数组标签中的预测结果。x的每一行都包含了鸢尾花的花瓣%和萼片的长度和宽度(参见fishiriris数据集)。有关其他输出%参数的描述,请参阅预测参考页。CompactMdl = loadLearnerForCoder(savedmdl);[label,score,node,cnum] = predict(CompactMdl,x,varargin{:});结束

メモ:このページの右上にあるボタンをクリックしてこの例をMATLAB®で開くと,MATLAB®で例のフォルダーが開きます。このフォルダには,エントリポント関数のファルが含まれています。

コ,ドの生成

可変サ@ @ズ引数の指定

Cおよびc++は静的な型の言語なので,codegenarg游戏オプションを使用して,エントリポイント関数内のすべての変数のプロパティをコンパイル時に決定しなければなりません。

编码器。常数(MATLAB编码器)を使用して,コンパ。

coder.Constant (v)

coder.Constant (v)は,vと同じ値の定数値をも编码器。常数型の変数をコ,ド生成時に作成します。

coder.typeof(MATLAB编码器)を使用して,可変サ。

coder.typeof(example_value, size_vector, variable_dims)

example_valuesize_vectorvariable_dimsの値は,生成されるコ,ドが受け入れることができる入力配列のプロパティを指定します。

  • 入力配列は,example_valueの例の値と同じデ,タ型です。

  • 対応するvariable_dimsの値がである場合,size_vectorは入力配列の配列サ@ @ズです。

  • 対応するvariable_dimsの値が真正的である場合,size_vectorは配列サ@ @ズの上限です。

  • variable_dimsは,配列の各次元が可変サ▪▪ズと固定サ▪▪ズのど▪▪らであるかを指定します。値真正的(逻辑1)は対応する次元が可変サesc escズであることを意味します。値(逻辑0)は対応する次元が固定サaapl .ズであることを意味します。

エントリポ@ @ント関数mypredictTreeは,予測子データ,学習済みモデルオブジェクトが含まれている垫ファイルの名前,およびオプションの名前と値のペアの引数を受け入れます。生成するコードでは,予測子データについての可変サイズの配列と,値が可変サイズのベクトルである名前と値のペアの引数“子树”を受け入れるとします。すると,入力引数は,予測子デ,タ,垫ファル名,および名前と値のペアの引数“子树”の名前と値の4になります。

4行1列の细胞配列を定義し,エントリポイント関数の各入力引数の型を各细胞に割り当てます。

ARGS = cell(4,1);

1番目の入力にいてcoder.typeofを使用して,予測子データ変数が倍精度であり,モデルの学習に使用した予測子データと同じ列数であることと,観測値の個数(行数)が任意であることを指定します。

p =数字(Mdl.PredictorNames);ARGS{1} = code .typeof(0,[Inf,p],[1,0]);

Matlabの既定の数値デ,タ型はなので,example_value0という値はデ,タ型がであることを意味します。size_vector(正,p)という値とvariable_dims(1,0)という値は,1个番目の次元のサ▪▪ズが可変で制限がなく,2个番目の次元のサ▪▪ズがpに固定されることを意味します。

2番目の入力はmatファ▪▪ル名であり,コンパ▪▪ル時の定数でなければなりません。编码器。常数を使用して,2番目の入力の型を指定します。

ARGS{2} = code . constant (MdlName);

最後の2の入力は,名前と値のペアの引数“子树”の名前および値です。名前と値のペアの引数の名前は,コンパ。

ARGS{3} =编码器。常数(“子树”);

coder.typeofを使用して,“子树”の値が倍精度行ベクトルであり,行ベクトルのサ马克斯(Mdl.PrunedList)であることを指定します。

m = max(mll . prunelist);ARGS{4} = code .typeof(0,[1,m],[0,1]);

ここでも,matlabの既定の数値デ,タ型はなので,example_value0という値はデ,タ型がであることを意味します。size_vector(1米)という値とvariable_dims[0, 1]という値は,1番目の次元のサズが1に固定され,2番目の次元のサescズが可変で上限がであることを意味します。

codegenの使用によるコ,ドの生成

mypredictTreeの入力引数の型が含まれているcell配列arg游戏を使用して,エントリポmypredictTreeからmex関数を生成します。arg游戏オプションを使用して,入力引数の型を指定します。-nargoutオプションを使用して,生成されるエントリポ。生成されるコードには,エントリポイント関数の定義に現れる順序で,指定した個数の出力引数が含まれます。

codegenmypredictTreearg游戏arg游戏-nargout2
代码生成成功。

codegenは,プラットフォ,ムに依存する拡張子の,mex関数mypredictTree_mexを現在のフォルダ,に生成します。

関数预测は,名前と値のペアの引数“子树”にいて単精度値,倍精度値,および“所有”を受け入れます。しかし,ARGS {4}で指定したデータ型が双なので,墨西哥人関数を予測に使用するときは倍精度値のみを指定できます。

生成されたコ,ドの確認

生成された墨西哥人関数と枝刈りレベルが1の部分木を使用して,学習データから無作為に選択した15個の値についてラベルを予測します。墨西哥関数によるラベルを预测が予測したラベルと比較します。

rng (“默认”);%用于再现性Xnew = datasample(meas,15);[labelMEX,scoreMEX] = mypredictTree_mex(Xnew,MdlName,“子树”1);[labelPREDICT,scorePREDICT] = predict(Mdl,Xnew,“子树”1);labelPREDICT
labelPREDICT =15x10字符数组“维珍”“维珍”“塞托萨”“维珍”“万紫千红”“塞托萨”“万紫千红”“维珍”“维珍”“塞托萨”“维珍”“维珍”“万紫千红”“维珍”
labelMEX
labelMEX =15 x1细胞{' virginiica '} {' virginiica '} {'setosa'} {' virginiica '} {' vericolor '} {'setosa'} {' vericolor '} {' virginiica '} {' virginiica '} {' veritolor '} {' virginiica '} {' veritolor '} {' virginiica '}

予測されたラベルは,デ,タ型以外は,mex関数のラベルと同じです。応答のデ,タ型が字符であり,子树の値がスカラ,であることをcodegenが確定できない場合,生成されたコ,ドからの出力は文字ベクトルのcell配列になります。

比較のため,labelsPREDICTをcell配列に変換してisequalを使用できます。

cell_labelPREDICT = cellstr(labelPREDICT);verifyLabel = isequal(labelMEX,cell_labelPREDICT)
verifyLabel =逻辑1

isequalは,すべての入力が等しいことを意味する逻辑1 (真正的)を返します。

同じように,2番目の出力を比較します。scorePREDICTと比較すると,scoreMexには丸めによる差が含まれている場合があります。このような場合は,小さい誤差を許容してscoreMEXscorePREDICTを比較します。

find(abs(scorePREDICT-scoreMEX) > 1e-8)
Ans = 0x1空双列向量

scorePREDICTscoreMEXの要素ごとの差の絶対値が指定された許容誤差1 e-8を超えない場合,找到は空のベクトルを返します。この比較により,許容誤差1 e-8内でscorePREDICTscoreMEXが等しいことを確認します。

参考

(MATLAB编码器)|(MATLAB编码器)||(MATLAB编码器)||

関連するトピック