主要内容

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

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

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

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

分類モデルの学習

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

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

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

Mdl = fitctree(量、种类);

MdlClassificationTreeモデルです。

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

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

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

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

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

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

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

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

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

类型mypredictTree.m显示mypredictree的内容。m文件
函数[标签,分数、节点cnum] = mypredictTree (x, savedmdl变长度输入宗量)% # codegen % mypredictTree预测虹膜物种使用分类树% mypredictTree预测虹膜物种的n观察% n-by-4矩阵x使用分类树存储在MAT-file savedmdl %的名字,然后在% array标签中返回预测结果。每一行x包含了鸢尾的花瓣%和萼片的长度和宽度(参见fishiris数据集)。有关其他输出%参数的描述,请参阅预测参考页。CompactMdl = loadLearnerForCoder (savedmdl);[标签,分数、节点cnum] =预测(CompactMdl x,变长度输入宗量{:});结束

メモ:このページの右上にあるボタンをクリックしてこの例を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)は対応する次元が可変サイズであることを意味します。値(逻辑0)は対応する次元が固定サイズであることを意味します。

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

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

ARGS =细胞(4,1);

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

p =元素个数(Mdl.PredictorNames);ARGS {1} = coder.typeof(0[正无穷,p] [1,0]);

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

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

ARGS {2} = coder.Constant (MdlName);

最後の2つの入力は,名前と値のペアの引数“子树”の名前および値です。名前と値のペアの引数の名前は,コンパイル時の定数でなければなりません。

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

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

m = max (Mdl.PruneList);ARGS {4} = coder.typeof (0, 1, m], [0,1]);

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

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

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

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

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

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

生成されたコードの確認

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

rng (“默认”);%的再现性Xnew = datasample(量、15);[labelMEX, scoreMEX] = mypredictTree_mex (Xnew MdlName,“子树”1);[labelPREDICT, scorePREDICT] =预测(Mdl Xnew,“子树”1);labelPREDICT
labelPREDICT =15 x10 char数组'virginica ', 'virginica ', 'setosa ', 'virginica ', 'versicolor', 'setosa ', 'versicolor', 'virginica ', 'virginica ', 'setosa ', 'virginica ', 'virginica ', ' vericolor ', 'virginica ', '
labelMEX
labelMEX =15 x1细胞{'virginica'} {'virginica'} {'virginica'} {'versicolor'} {'virginica'} {'virginica'} {'virginica'} {'virginica'} {'virginica'} {'virginica'} {'virginica'} 'versicolor'}

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

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

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

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

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

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

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

参考

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

関連するトピック