Main Content

浅いニューラル ネットワーク関数の配布

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

関数 genFunction を使用して、学習済みの浅いニューラル ネットワーク用のスタンドアロン MATLAB® 関数を生成できます。生成されるコードには、ニューラル ネットワークのシミュレーションに必要な、設定、重みとバイアスの値、モジュール関数、計算などすべての情報が含まれています。

生成される MATLAB 関数は、特定の浅いニューラル ネットワークが行ったものと同じシミュレーション計算を検証するために使用できます。この関数によって、幅広い MATLAB 配布製品とツールを使用する数多くの目的のためにニューラル ネットワークを簡単に配布できます。

関数 genFunction は、Neural Net Fitting アプリ、Neural Net Pattern Recognition アプリ、Neural Net Clustering アプリ、および Neural Net Time Series アプリによって使用されます。これらのアプリの詳細については、浅いニューラル ネットワークによるデータのあてはめ浅いニューラル ネットワークによるパターンの分類自己組織化マップによるデータのクラスタリング、および浅いニューラル ネットワークの時系列予測およびモデル化を参照してください。

これらのアプリによって生成される包括的なスクリプトには、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 ブロック線図の配布を参照してください。

関連するトピック