Main Content

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

sim

ニューラル ネットワークのシミュレーション

構文

[Y,Xf,Af] = sim(net,X,Xi,Ai,T)
[Y,Xf,Af] = sim(net,{Q TS},Xi,Ai)
[Y,...] = sim(net,...,'useParallel',...)
[Y,...] = sim(net,...,'useGPU',...)
[Y,...] = sim(net,...,'showResources',...)
[Ycomposite,...] = sim(net,Xcomposite,...)
[Ygpu,...] = sim(net,Xgpu,...)

ヘルプの表示

help network/sim と入力します。

説明

sim は、ニューラル ネットワークのシミュレーションを行います。

[Y,Xf,Af] = sim(net,X,Xi,Ai,T) は、次の引数を取ります。

net

ネットワーク

X

ネットワークの入力

Xi

入力遅延の初期条件 (既定値 = ゼロ配列)

Ai

層遅延の初期条件 (既定値 = ゼロ配列)

T

ネットワークのターゲット (既定値 = ゼロ配列)

これは、以下を返します。

Y

ネットワークの出力

Xf

最終の入力遅延条件

Af

最終の層遅延条件

sim は通常、ニューラル ネットワークを関数として呼び出すことによって、暗黙的に呼び出されます。たとえば、次の 2 つの式は同じ結果を返します。

y = sim(net,x,xi,ai)
y = net(x,xi,ai)

引数 XiAiXf、および Af はオプションであり、入力または層の遅延があるネットワークにのみ使用する必要があることに注意してください。

信号引数には、cell 配列と行列の 2 つの形式があります。

cell 配列形式は、記述が最も簡単です。これは複数の入出力があるネットワークの場合に非常に便利で、入力をシーケンスで与えることができます。

X

NiTS 列の cell 配列

各要素 X{i,ts} は、RiQ 列の行列。

Xi

NiID 列の cell 配列

各要素 Xi{i,k} は、RiQ 列の行列。

Ai

NlLD 列の cell 配列

各要素 Ai{i,k} は、SiQ 列の行列。

T

NoTS 列の cell 配列

各要素 X{i,ts} は、UiQ 列の行列。

Y

NoTS 列の cell 配列

各要素 Y{i,ts} は、UiQ 列の行列。

Xf

NiID 列の cell 配列

各要素 Xf{i,k} は、RiQ 列の行列。

Af

NlLD 列の cell 配列

各要素 Af{i,k} は、SiQ 列の行列。

ここで、

Ni = net.numInputs
Nl = net.numLayers
No = net.numOutputs
ID = net.numInputDelays
LD = net.numLayerDelays
TS =

タイム ステップ数

Q =

バッチのサイズ

Ri = net.inputs{i}.size
Si = net.layers{i}.size
Ui = net.outputs{i}.size

XiAiXf、および Af の列は、最も古い遅延条件から最新の遅延条件まで順に並べられます。

Xi{i,k}=

時間 ts = k - ID の入力 i

Xf{i,k}=

時間 ts = TS + k - ID の入力 i

Ai{i,k}=

時間 ts = k - LD の層出力 i

Af{i,k}=

時間 ts = TS + k - LD の層出力 i

行列形式は、1 タイム ステップのみのシミュレーションが行われる (TS = 1) の場合に使用できます。これは入出力が 1 つしかないネットワークの場合に便利ですが、複数の入出力があるネットワークにも使用できます。

行列の各引数は、対応する cell 配列引数の要素を単一の行列に格納することによって求められます。

X

(sum of Ri)Q 列の行列

Xi

(sum of Ri)(ID*Q) 列の行列

Ai

(sum of Si)(LD*Q) 列の行列

T

(sum of Ui)Q 列の行列

Y

(sum of Ui)Q 列の行列

Xf

(sum of Ri)(ID*Q) 列の行列

Af

(sum of Si)(LD*Q) 列の行列

[Y,Xf,Af] = sim(net,{Q TS},Xi,Ai) は、cell 配列表記が使用される場合に、入力がないネットワークに使用されます。

[Y,...] = sim(net,...,'useParallel',...)[Y,...] = sim(net,...,'useGPU',...)[Y,...] = sim(net,...,'showResources',...) (または関数として呼び出されるネットワーク) は、オプションの名前と値のペアの引数を受け入れ、計算の実行方法を制御します。これらのうち 2 つのオプションを使用すると、Parallel Computing Toolbox が利用可能な場合に、並列ワーカーまたは GPU デバイスを使用して、学習をより高速に、またはより大規模なデータセットで行うことができます。オプションの名前と値のペアを以下に示します。

'useParallel','no'

通常の MATLAB スレッドで計算が実行されます。これは、'useParallel' の既定の設定です。

'useParallel','yes'

並列プールが開いている場合、計算は並列ワーカーで実行されます。そうでない場合、通常の MATLAB スレッドで計算が実行されます。

'useGPU','no'

CPU で計算が実行されます。これは、'useGPU' の既定の設定です。

'useGPU','yes'

現在の gpuDevice がサポートされている GPU の場合 (Parallel Computing Toolbox の GPU 要件を参照)、計算はこの gpuDevice で実行されます。現在の gpuDevice がサポートされていない場合、計算は CPU で実行されます。'useParallel''yes' であり、並列プールが開いている場合、固有の GPU を持つ各ワーカーはその GPU を使用し、他のワーカーはそれぞれの CPU コアで計算を実行します。

'useGPU','only'

どの並列プールも開いていない場合、この設定は 'yes' と同じになります。並列プールが開いている場合、固有の GPU を持つワーカーのみが使用されます。ただし、並列プールが開いていても、サポートされている GPU が利用できない場合、計算は全ワーカー CPU での実行に戻ります。

'showResources','no'

使用されるコンピューティング リソースをコマンド ラインに表示しません。これは既定の設定です。

'showResources','yes'

実際に使用されるコンピューティング リソースの概要をコマンド ラインに表示します。並列計算または GPU コンピューティングが要求されても、並列プールが開いていないか、サポートされている GPU が利用できない場合、実際のリソースが要求されたリソースと異なる場合があります。並列ワーカーが使用される場合、使用されていないプール内のワーカーを含む、各ワーカーの計算モードが示されます。

[Ycomposite,...] = sim(net,Xcomposite,...) は Composite データを取り、Composite の結果を返します。Composite データが使用される場合、'useParallel' が自動的に 'yes' に設定されます。

[Ygpu,...] = sim(net,Xgpu,...) は gpuArray データを取り、gpuArray の結果を返します。gpuArray データが使用される場合、'useGPU' が自動的に 'yes' に設定されます。

次の例では、ニューラル ネットワーク オブジェクト (net) を関数として呼び出すことによって、関数 sim が暗黙的に呼び出されます。

フィードフォワード ネットワークのシミュレーション

この例では、解剖学的測定値 x を体脂肪率 t にマッピングするデータセットを読み込みます。10 個のニューロンがあるフィードフォワード ネットワークが作成され、このデータで学習が行われた後、シミュレーションが行われます。

[x,t] =  bodyfat_dataset;  
net = feedforwardnet(10);
net = train(net,x,t);
y = net(x);

NARX 時系列ネットワークのシミュレーション

この例では、制御電流 x および磁石の垂直位置応答 t によって定義される磁気浮上システムをモデル化するように、外部入力を伴う開ループの非線形自己回帰ネットワークに学習をさせた後、ネットワークのシミュレーションを行います。学習およびシミュレーションを行う前に、関数 preparets によってデータを準備します。これによって、開ループ ネットワークの結合された入力 xo が作成されます。これには、外部入力 x と位置 t の前の値の両方が含まれます。さらに、遅延状態 xi も準備されます。

[x,t] = maglev_dataset;
net = narxnet(10);
[xo,xi,~,to] = preparets(net,x,{},t);
net = train(net,xo,to,xi);
y = net(xo,xi)

同じシステムのシミュレーションを、閉ループ形式で行うこともできます。

netc = closeloop(net);
view(netc)
[xc,xi,ai,tc] = preparets(netc,x,{},t);
yc = netc(xc,xi,ai);

並列プールでのシミュレーションの並列実行

Parallel Computing Toolbox を使用すると、ネットワークのシミュレーションおよび学習を、1 台の PC で行う場合より高速に、より大規模なデータセットで行うことができます。以下では、学習およびシミュレーションは、並列 MATLAB ワーカー全体で行われます。

parpool
[X,T] = vinyl_dataset;
net = feedforwardnet(10);
net = train(net,X,T,'useParallel','yes','showResources','yes');
Y = net(X,'useParallel','yes');

GPU でのシミュレーション

Composite 値を使用してデータを手動で分散させ、結果を Composite 値として取得します。データが分散された状態で読み込まれる際に、各データセットが RAM に収まらなければならない場合、データセット全体はすべてのワーカーの合計 RAM によってのみ制限されます。

Xc = Composite;
for i=1:numel(Xc)
    Xc{i} = X+rand(size(X))*0.1;  % Use real data instead of random
end
Yc = net(Xc,'showResources','yes');

Parallel Computing Toolbox によってサポートされている場合、現在の GPU デバイスを使用してネットワークのシミュレーションを行うことができます。

gpuDevice % Check if there is a supported GPU
Y = net(X,'useGPU','yes','showResources','yes');

データを GPU に手動で配置し、GPU で結果を得るには、以下のようにします。

Xgpu = gpuArray(X);
Ygpu = net(Xgpu,'showResources','yes');
Y = gather(Ygpu);

固有の GPU に関連付けられたワーカーではそのハードウェアを利用し、残りのワーカーでは CPU を使用して並列実行するには、以下のようにします。

Y = net(X,'useParallel','yes','useGPU','yes','showResources','yes');

CPU ワーカーは同等の速度を実現できないため、固有の GPU を持つワーカーのみを使用する方が高速になります。

Y = net(X,'useParallel','yes','useGPU','only','showResources','yes');

アルゴリズム

sim は、次のプロパティを使用して、ネットワーク net のシミュレーションを行います。

net.numInputs, net.numLayers
net.outputConnect, net.biasConnect
net.inputConnect, net.layerConnect

これらのプロパティによって、ネットワークの重みとバイアスの値、および各重みに関連付けられた遅延の数が決定されます。

net.IW{i,j}
net.LW{i,j}
net.b{i}
net.inputWeights{i,j}.delays
net.layerWeights{i,j}.delays

次の関数プロパティは、sim が重みとバイアスの値を入力に適用し、各層の出力を得る方法を示します。

net.inputWeights{i,j}.weightFcn
net.layerWeights{i,j}.weightFcn
net.layers{i}.netInputFcn
net.layers{i}.transferFcn

参考

| | |

R2006a より前に導入