Main Content

浅層ニューラル ネットワーク関数の展開

学習済みネットワークを展開するための関数とツール

関数 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 ブロック線図の展開を参照してください。

関連するトピック