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

초기 입력 지연 조건(디폴트 값 = 0)

Ai

초기 계층 지연 조건(디폴트 값 = 0)

T

신경망 목표값(디폴트 값 = 0)

그런 후 다음을 반환합니다.

Y

신경망 출력값

Xf

마지막 입력 지연 조건

Af

마지막 계층 지연 조건

sim은 보통 신경망을 함수로서 호출함으로써 암시적으로 호출됩니다. 예를 들어, 다음 두 표현식은 모두 동일한 결과를 반환합니다.

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

여기서 인수 Xi, Ai, Xf, Af는 선택 사항으로, 입력 또는 계층 지연이 있는 신경망에서만 사용해야 됩니다.

신호 인수의 형식은 셀형 배열이나 행렬의 형식을 가질 수 있습니다.

셀형 배열 형식이 표현하기 가장 쉬운 형식입니다. 입력값과 출력값이 여러 개인 신경망에서 사용하기에 가장 편리하며, 입력값의 시퀀스를 다음과 같이 표현할 수 있습니다.

X

Ni×TS 셀형 배열

각각의 X{i,ts} 요소는 Ri×Q 행렬입니다.

Xi

Ni×ID 셀형 배열

각각의 Xi{i,k} 요소는 Ri×Q 행렬입니다.

Ai

Nl×LD 셀형 배열

각각의 Ai{i,k} 요소는 Si×Q 행렬입니다.

T

No×TS 셀형 배열

각각의 X{i,ts} 요소는 Ui×Q 행렬입니다.

Y

No×TS 셀형 배열

각각의 Y{i,ts} 요소는 Ui×Q 행렬입니다.

Xf

Ni×ID 셀형 배열

각각의 Xf{i,k} 요소는 Ri×Q 행렬입니다.

Af

Nl×LD 셀형 배열

각각의 Af{i,k} 요소는 Si×Q 행렬입니다.

여기서

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}=

시간 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

행렬 형식은 하나의 시간 스텝만 시뮬레이션하는 경우에((TS = 1)) 사용할 수 있습니다. 입력값과 출력값이 하나만 있는 신경망에서 사용하기에 편리하지만, 더 많은 신경망에서도 사용 가능합니다.

각 행렬 인수는 대응되는 셀형 배열 인수의 요소를 하나의 행렬에 저장하여 찾습니다.

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)는 입력값이 없는 신경망에 사용됩니다.

[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이면 계산이 이 GPU 장치에서 이루어집니다(GPU 요구 사항은 Parallel Computing Toolbox를 참조하십시오). 현재 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'로 설정됩니다.

예제

아래 예제에서는 neural network 객체(net)를 함수로서 호출함으로써 sim 함수가 암시적으로 호출됩니다.

피드포워드 신경망 시뮬레이션하기

이 예제에서는 해부학적 측정값 x를 체지방 비율 t에 매핑하는 데이터셋을 불러옵니다. 10개의 뉴런을 갖는 피드포워드 신경망을 만들어서 이 데이터에 대해 훈련시키고 시뮬레이션합니다.

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

{"String":"Figure Neural Network Training (24-Jul-2022 21:28:53) contains an object of type uigridlayout.","Tex":[],"LaTex":[]}

y = net(x);

NARX 시계열 신경망 시뮬레이션하기

이 예제에서는 외부 입력값으로 개루프 비선형 자기회귀 신경망을 훈련시켜 제어 전류 x와 자석의 수직 위치 반응 t로 정의되는 자기 부상 시스템을 모델링하고 신경망을 시뮬레이션합니다. 함수 preparets는 훈련 및 시뮬레이션 전에 데이터를 준비합니다. 이 함수는 외부 입력값 x와 이전 위치 값 t를 모두 포함하는, 개루프 신경망의 결합된 입력값 xo를 만듭니다. 지연 상태 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를 사용하면 훈련 속도를 높이고 PC 1대에 담을 수 있는 것보다도 큰 데이터셋에 대한 훈련을 할 수 있습니다. 아래에서는 여러 병렬 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');

현재 GPU 장치를 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와 연결된 워커는 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 이전에 개발됨

참고 항목

| | |