このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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)
引数 Xi
、Ai
、Xf
、および Af
はオプションであり、入力または層の遅延があるネットワークにのみ使用する必要があることに注意してください。
信号引数には、cell 配列と行列の 2 つの形式があります。
cell 配列形式は、記述が最も簡単です。これは複数の入出力があるネットワークの場合に非常に便利で、入力をシーケンスで与えることができます。
X |
| 各要素 |
Xi |
| 各要素 |
Ai |
| 各要素 |
T |
| 各要素 |
Y |
| 各要素 |
Xf |
| 各要素 |
Af |
| 各要素 |
ここで、
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 |
Xi
、Ai
、Xf
、および Af
の列は、最も古い遅延条件から最新の遅延条件まで順に並べられます。
Xi{i,k} | = | 時間 |
Xf{i,k} | = | 時間 |
Ai{i,k} | = | 時間 |
Af{i,k} | = | 時間 |
行列形式は、1 タイム ステップのみのシミュレーションが行われる (TS = 1)
の場合に使用できます。これは入出力が 1 つしかないネットワークの場合に便利ですが、複数の入出力があるネットワークにも使用できます。
行列の各引数は、対応する cell 配列引数の要素を単一の行列に格納することによって求められます。
X |
|
Xi |
|
Ai |
|
T |
|
Y |
|
Xf |
|
Af |
|
[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','yes' | 並列プールが開いている場合、計算は並列ワーカーで実行されます。そうでない場合、通常の MATLAB スレッドで計算が実行されます。 |
'useGPU','no' | CPU で計算が実行されます。これは、'useGPU' の既定の設定です。 |
'useGPU','yes' | 現在の gpuDevice がサポートされている GPU の場合 (Parallel Computing Toolbox の GPU 要件を参照)、計算はこの gpuDevice で実行されます。現在の gpuDevice がサポートされていない場合、計算は CPU で実行されます。 |
'useGPU','only' | どの並列プールも開いていない場合、この設定は |
'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 より前に導入