浅層ニューラル ネットワーク関数の展開
学習済みネットワークを展開するための関数とツール
関数 genFunction
を使用して、学習済みの浅層ニューラル ネットワーク用のスタンドアロン MATLAB® 関数を生成できます。生成されるコードには、ニューラル ネットワークのシミュレーションに必要な、設定、重みとバイアスの値、モジュール関数、計算などすべての情報が含まれています。
生成される MATLAB 関数は、特定の浅層ニューラル ネットワークが行ったものと同じシミュレーション計算を検証するために使用できます。この関数によって、幅広い MATLAB 展開製品とツールを使用する数多くの目的のためにニューラル ネットワークを簡単に展開できます。
関数 genFunction
は、ニューラル ネット フィッティングアプリ、ニューラル ネット パターン認識アプリ、ニューラル ネット クラスタリングアプリ、およびニューラル ネット時系列アプリによって使用されます。これらのアプリの詳細については、浅層ニューラル ネットワークによるデータの当てはめ、浅層ニューラル ネットワークによるパターン認識、自己組織化マップによるデータのクラスタリング、および浅層ニューラル ネットワークの時系列予測およびモデル化を参照してください。
これらのアプリによって生成される包括的なスクリプトには、genFunction
を使用したネットワークの展開の例が含まれています。
アプリケーション 展開のためのニューラル ネットワーク関数の生成
関数 genFunction
は、任意の学習済みの浅層ニューラル ネットワークのシミュレーションと展開準備を行うためのスタンドアロン MATLAB 関数を生成します。これは次のようないくつかのタスクで役に立つ場合があります。
ネットワークの手動再実装のための計算テンプレートとして使用する、ニューラル ネットワークの入出力変換のドキュメント化
MATLAB 関数ブロックを使用した Simulink® ブロックの作成
次の目的での MATLAB Compiler™ の使用
スタンドアロン実行可能ファイルの生成
Excel® アドインの生成
次の目的での MATLAB Compiler SDK™ の使用
C/C++ ライブラリの生成
.COM コンポーネントの生成
Java® コンポーネントの生成
.NET コンポーネントの生成
次の目的での MATLAB Coder™ の使用
C/C++ コードの生成
効率的な MEX 関数の生成
genFunction(net,'pathname')
はニューラル ネットワークとファイル パスを取り、スタンドアロン MATLAB 関数ファイル filename.m
を生成します。
genFunction(...,'MatrixOnly','yes')
は既定の cell/行列の表記法をオーバーライドし、代わりに MATLAB Coder ツールと互換性のある行列引数のみを使用する関数を生成します。静的ネットワークの場合、行列の列は独立した標本として解釈されます。動的ネットワークの場合、行列の列は一連のタイム ステップとして解釈されます。既定値は 'no'
です。
genFunction(___,'ShowLinks','no')
は生成されたヘルプとソース コードへのリンクを表示する既定の動作を無効にします。既定値は 'yes'
です。
以下では、静的ネットワークの学習を行い、その出力を計算しています。
[x, t] = bodyfat_dataset; bodyfatNet = feedforwardnet(10); bodyfatNet = train(bodyfatNet, x, t); y = bodyfatNet(x);
次のコードは、ニューラル ネットワーク オブジェクトと同じインターフェイスを使用して MATLAB 関数の生成、テスト、表示を行います。
genFunction(bodyfatNet, 'bodyfatFcn'); y2 = bodyfatFcn(x); accuracy2 = max(abs(y - y2)) edit bodyfatFcn
mcc
を使用して、MATLAB Compiler ツール (ライセンスが必要) で新しい関数をコンパイルし、共有/ダイナミック リンク ライブラリを作成できます。
mcc -W lib:libBodyfat -T link:lib bodyfatFcn
次のコードは、行列引数のみ (cell 配列は対象外) をサポートする MATLAB 関数の別のバージョンを生成します。この関数はテストされます。その後、これは MATLAB Coder ツールの codegen
(ライセンスが必要) で MEX 関数を生成するために使用されます。これもテストされます。
genFunction(bodyfatNet, 'bodyfatFcn', 'MatrixOnly', 'yes'); y3 = bodyfatFcn(x); accuracy3 = max(abs(y - y3)) x1Type = coder.typeof(double(0), [13, Inf]); % Coder type of input 1 codegen bodyfatFcn.m -config:mex -o bodyfatCodeGen -args {x1Type} y4 = bodyfatCodeGen(x); accuracy4 = max(abs(y - y4))
以下では、動的ネットワークの学習を行い、その出力を計算しています。
[x,t] = maglev_dataset; maglevNet = narxnet(1:2,1:2,10); [X,Xi,Ai,T] = preparets(maglevNet,x,{},t); maglevNet = train(maglevNet,X,T,Xi,Ai); [y,xf,af] = maglevNet(X,Xi,Ai);
次に、MATLAB 関数の生成とテストが行われます。その後、この関数は、mcc
で共有/ダイナミック リンク ライブラリを作成するために使用されます。
genFunction(maglevNet,'maglevFcn'); [y2,xf,af] = maglevFcn(X,Xi,Ai); accuracy2 = max(abs(cell2mat(y)-cell2mat(y2))) mcc -W lib:libMaglev -T link:lib maglevFcn
次のコードは、行列引数のみ (cell 配列は対象外) をサポートする MATLAB 関数の別のバージョンを生成します。この関数はテストされます。その後、これは MATLAB Coder ツールの codegen
で MEX 関数を生成するために使用されます。これもテストされます。
genFunction(maglevNet,'maglevFcn','MatrixOnly','yes'); x1 = cell2mat(X(1,:)); % Convert each input to matrix x2 = cell2mat(X(2,:)); xi1 = cell2mat(Xi(1,:)); % Convert each input state to matrix xi2 = cell2mat(Xi(2,:)); [y3,xf1,xf2] = maglevFcn(x1,x2,xi1,xi2); accuracy3 = max(abs(cell2mat(y)-y3)) x1Type = coder.typeof(double(0),[1 Inf]); % Coder type of input 1 x2Type = coder.typeof(double(0),[1 Inf]); % Coder type of input 2 xi1Type = coder.typeof(double(0),[1 2]); % Coder type of input 1 states xi2Type = coder.typeof(double(0),[1 2]); % Coder type of input 2 states codegen maglevFcn.m -config:mex -o maglevNetCodeGen ... -args {x1Type x2Type xi1Type xi2Type} [y4,xf1,xf2] = maglevNetCodeGen(x1,x2,xi1,xi2); dynamic_codegen_accuracy = max(abs(cell2mat(y)-y4))
Simulink 図の生成
Simulink ツールを使用した浅層ニューラル ネットワークのシミュレーションと学習済みニューラル ネットワークの展開については、浅層ニューラル ネットワーク Simulink ブロック線図の展開を参照してください。