Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

train

얕은 신경망 훈련

설명

이 함수는 얕은 신경망을 훈련시킵니다. 컨벌루션 신경망 또는 LSTM 신경망에서의 딥러닝의 경우 대신 trainnet 또는 trainNetwork를 사용하십시오.

예제

trainedNet = train(net,X,T,Xi,Ai,EW)net.trainFcnnet.trainParam에 따라 신경망 net을 훈련시킵니다.

[trainedNet,tr] = train(net,X,T,Xi,Ai,EW)는 훈련 기록도 반환합니다.

예제

[trainedNet,tr] = train(net,X,T,Xi,Ai,EW,Name,Value)는 하나 이상의 이름-값 쌍 인수로 지정된 추가 옵션을 사용하여 신경망을 훈련시킵니다.

예제

모두 축소

입력값 x와 목표값 t로 플로팅할 수 있는 간단한 함수를 정의합니다.

x = [0 1 2 3 4 5 6 7 8];
t = [0 0.84 0.91 0.14 -0.77 -0.96 -0.28 0.66 0.99];
plot(x,t,'o')

feedforwardnet을 사용하여 2계층 피드포워드 신경망을 만듭니다. 이 신경망에는 10개의 뉴런을 갖는 은닉 계층 1개가 있습니다.

net = feedforwardnet(10);
net = configure(net,x,t);
y1 = net(x)
plot(x,t,'o',x,y1,'x')

신경망을 훈련시키고 다시 시뮬레이션합니다.

net = train(net,x,t);
y2 = net(x)
plot(x,t,'o',x,y1,'x',x,y2,'*')

이 예제에서는 외부 입력값으로 개루프 비선형 자기회귀 신경망을 훈련시켜 제어 전류 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™가 필요합니다. 신경망 병렬 훈련은 역전파 훈련만 지원하며 자기 조직화 맵은 지원하지 않습니다.

아래에서는 병렬 MATLAB 워커에서 훈련과 시뮬레이션이 이루어집니다.

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

Composite형 값을 사용하여 데이터를 수동으로 분산하고 결과를 Composite형 값으로 얻습니다. 데이터를 불러옴과 동시에 데이터를 분산하는 경우, 각 데이터셋 조각은 RAM에 담을 수 있어야 하지만 전체 데이터셋은 모든 워커의 RAM의 총합으로만 제한됩니다.

[X,T] = vinyl_dataset;
Q = size(X,2);
Xc = Composite;
Tc = Composite;
numWorkers = numel(Xc);
ind = [0 ceil((1:numWorkers)*(Q/numWorkers))];
for i=1:numWorkers
    indi = (ind(i)+1):ind(i+1);
    Xc{i} = X(:,indi);
    Tc{i} = T(:,indi);
end
net = feedforwardnet;
net = configure(net,X,T);
net = train(net,Xc,Tc);
Yc = net(Xc);

이 예제에서 신경망 입력값의 처리 설정과 차원을 설정하는 데 configure 함수를 사용한 것을 볼 수 있습니다. 보통 train을 호출할 때 자동으로 신경망 입력값의 처리 설정과 차원이 설정되지만, Composite형 데이터를 입력할 때는 Composite형이 아닌 데이터를 가지고 이 단계를 수동으로 수행해야 합니다.

현재 GPU 장치를 Parallel Computing Toolbox에서 지원하는 경우, 이 GPU 장치를 사용하여 신경망을 훈련시킬 수 있습니다. 현재 GPU 훈련은 역전파 훈련만 지원하며, 자기 조직화 맵은 지원하지 않습니다.

[X,T] = vinyl_dataset;
net = feedforwardnet(10);
net = train(net,X,T,'useGPU','yes');
y = net(X); 

데이터를 수동으로 GPU에 올리려면 다음을 수행하십시오.

[X,T] = vinyl_dataset;
Xgpu = gpuArray(X);
Tgpu = gpuArray(T);
net = configure(net,X,T);
net = train(net,Xgpu,Tgpu);
Ygpu = net(Xgpu);
Y = gather(Ygpu); 

이 예제에서 신경망 입력값의 처리 설정과 차원을 설정하는 데 함수 configure를 사용한 것을 볼 수 있습니다. 보통 train을 호출할 때 자동으로 신경망 입력값의 처리 설정과 차원이 설정되지만, gpuArray 데이터를 입력할 때는 gputArray가 아닌 데이터를 가지고 이 단계를 수동으로 수행해야 합니다.

고유한 GPU에 할당된 워커는 GPU를 사용하고 나머지 워커는 CPU를 사용하도록 하면서 병렬로 실행하려면 다음을 수행하십시오.

net = train(net,X,T,'useParallel','yes','useGPU','yes');
y = net(X);

CPU 워커는 속도가 빠르지 않을 수 있으므로 고유한 GPU를 갖는 워커만 사용하면 속도가 빨라질 수 있습니다.

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

최대 2분에 한 번씩 검사 지점을 저장하면서 신경망을 훈련시킵니다.

[x,t] = vinyl_dataset;
net = fitnet([60 30]);
net = train(net,x,t,'CheckpointFile','MyCheckpoint','CheckpointDelay',120);

컴퓨터에 장애가 발생하면 마지막 신경망을 복구하여 장애 지점부터 훈련을 계속하는 데 사용할 수 있습니다. 검사 지점 파일에는 신경망, 훈련 기록, 파일 이름, 시간, 번호가 포함된 구조체 변수 checkpoint가 들어 있습니다.

[x,t] = vinyl_dataset;
load MyCheckpoint
net = checkpoint.net;
net = train(net,x,t,'CheckpointFile','MyCheckpoint');

입력 인수

모두 축소

입력 신경망으로, network 객체로 지정됩니다. network 객체를 만들려면 feedforwardnet 또는 narxnet 등을 사용하십시오.

신경망 입력값으로, R×Q 행렬 또는 Ni×TS 셀형 배열로 지정됩니다. 여기서 각각은 다음을 나타냅니다.

  • R은 입력 크기입니다.

  • Q는 배치 크기입니다.

  • Ni = net.numInputs

  • TS는 시간 스텝의 개수입니다.

train 인수에는 두 가지 형식(행렬 및 셀형 배열)이 있습니다. 정적 문제, 입력값과 출력값이 각각 1개씩인 신경망에는 행렬을 사용하고, 시간 스텝이 여러 개인 경우, 입력값과 출력값이 여러 개인 신경망에는 셀형 배열을 사용하십시오.

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

  • 셀형 배열은 보다 일반적인 형식이며, 입력값의 시퀀스를 표현할 수 있어 입력값과 출력값이 여러 개인 신경망에서 사용하기에 더 편리합니다. 각각의 X{i,ts} 요소는 Ri×Q 행렬로, 여기서 Ri = net.inputs{i}.size입니다.

Composite형 데이터가 사용되는 경우, 'useParallel'이 자동으로 'yes'로 설정됩니다. 이 함수는 Composite형 데이터를 받아서 Composite형 결과를 반환합니다.

gpuArray 데이터가 사용되는 경우, 'useGPU'가 자동으로 'yes'로 설정됩니다. 이 함수는 gpuArray 데이터를 받아서 gpuArray 결과를 반환합니다.

참고

X의 열에 적어도 하나의 NaN이 있는 경우, train은 이 열을 훈련, 테스트 또는 검증에 사용하지 않습니다.

신경망 목표값으로, U×Q 행렬 또는 No×TS 셀형 배열로 지정됩니다. 여기서 각각은 다음을 나타냅니다.

  • U는 입력 크기입니다.

  • Q는 배치 크기입니다.

  • No = net.numOutputs

  • TS는 시간 스텝의 개수입니다.

train 인수에는 두 가지 형식(행렬 및 셀형 배열)이 있습니다. 정적 문제, 입력값과 출력값이 각각 1개씩인 신경망에는 행렬을 사용하고, 시간 스텝이 여러 개인 경우, 입력값과 출력값이 여러 개인 신경망에는 셀형 배열을 사용하십시오.

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

  • 셀형 배열은 보다 일반적인 형식이며, 입력값의 시퀀스를 표현할 수 있어 입력값과 출력값이 여러 개인 신경망에서 사용하기에 더 편리합니다. 각각의 T{i,ts} 요소는 Ui×Q 행렬로, 여기서 Ui = net.outputs{i}.size입니다.

Composite형 데이터가 사용되는 경우, 'useParallel'이 자동으로 'yes'로 설정됩니다. 이 함수는 Composite형 데이터를 받아서 Composite형 결과를 반환합니다.

gpuArray 데이터가 사용되는 경우, 'useGPU'가 자동으로 'yes'로 설정됩니다. 이 함수는 gpuArray 데이터를 받아서 gpuArray 결과를 반환합니다.

T는 선택 사항으로, 목표값이 필요한 신경망에서만 사용해야 됩니다.

참고

목표값 T 내 모든 NaN 값은 누락된 데이터로 취급됩니다. T의 요소가 NaN이면, 그 요소는 훈련, 테스트 또는 검증에 사용되지 않습니다.

초기 입력 지연 조건으로, Ni×ID 셀형 배열 또는 R×(ID*Q) 행렬로 지정됩니다. 여기서 각각은 다음을 나타냅니다.

  • ID = net.numInputDelays

  • Ni = net.numInputs

  • R은 입력 크기입니다.

  • Q는 배치 크기입니다.

셀형 배열 입력값의 경우, Xi의 열은 가장 오래된 지연 조건부터 가장 최근까지의 순서로 정렬됩니다. Xi{i,k}는 시간 ts = k - ID에서의 입력값 i입니다.

Xi도 선택 사항으로, 입력 또는 계층 지연이 있는 신경망에서만 사용해야 됩니다.

초기 계층 지연 조건으로, Nl×LD 셀형 배열 또는 (Si의 합)×(LD*Q) 행렬로 지정됩니다. 여기서 각각은 다음을 나타냅니다.

  • Nl = net.numLayers

  • LD = net.numLayerDelays

  • Si = net.layers{i}.size

  • Q는 배치 크기입니다.

셀형 배열 입력값의 경우, Ai의 열은 가장 오래된 지연 조건부터 가장 최근까지의 순서로 정렬됩니다. Ai{i,k}는 시간 ts = k - LD에서의 계층 출력값 i입니다.

오차 가중치로, No×TS 셀형 배열 또는 (Ui의 합)×Q 행렬로 지정됩니다. 여기서 각각은 다음을 나타냅니다.

  • No = net.numOutputs

  • TS는 시간 스텝의 개수입니다.

  • Ui = net.outputs{i}.size

  • Q는 배치 크기입니다.

셀형 배열 입력값의 경우, 각 요소 EW{i,ts}Ui×Q 행렬입니다. 여기서 각각은 다음을 나타냅니다.

  • Ui = net.outputs{i}.size

  • Q는 배치 크기입니다.

오차 가중치 EW에서 No, TS, Ui, Q의 값 전부 또는 일부가 1이 될 수 있습니다. 이 경우, EW의 차원은 목표값 T와 일치하도록 자동으로 확장됩니다. 이로 인해 임의의 차원에(예: 샘플당) 가중치를 적용하면 다른 차원에(예: TS=1인 경우의 시간) 동일한 중요도를 편리하게 줄 수 있습니다. 예를 들어 모든 차원이 1인 경우(EW = {1}), 모든 목표값의 중요도는 동일하게 취급됩니다. 이는 EW의 디폴트 값입니다.

위에서 설명한 바와 같이 오차 가중치 EW의 차원은 목표값 T의 차원과 같을 수도 있고 일부 차원이 1로 설정될 수도 있습니다. 예를 들어, EW가 1×Q라면 목표 샘플들은 서로 다른 중요도를 갖지만 하나의 샘플에 포함된 각 요소는 동일한 중요도를 갖습니다. EW가 (Ui의 합)×1이라면 각 출력 요소는 서로 다른 중요도를 갖고, 모든 샘플은 동일한 중요도로 취급됩니다.

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: 'useParallel','yes'

병렬 계산을 지정하는 옵션으로, 'yes' 또는 'no'로 지정됩니다.

  • 'no' – 계산이 일반적인 MATLAB 스레드에서 이루어집니다. 디폴트 'useParallel' 설정입니다.

  • 'yes' – 병렬 풀이 열려 있으면 계산이 병렬 워커에서 이루어집니다. 열려 있는 병렬 풀이 없는 경우 디폴트 클러스터 프로파일을 사용하여 병렬 풀이 시작됩니다.

GPU 계산을 지정하는 옵션으로, 'yes', 'no' 또는 'only'로 지정됩니다.

  • 'no' – 계산이 CPU에서 이루어집니다. 디폴트 'useGPU' 설정입니다.

  • 'yes' – 현재 gpuDevice가 지원되는 GPU이면 계산이 이 GPU 장치에서 이루어집니다(GPU 요구 사항은 Parallel Computing Toolbox를 참조하십시오). 현재 gpuDevice가 지원되지 않으면 계산이 CPU에서 이루어집니다. 'useParallel''yes'이고 병렬 풀이 열려 있으면, 고유한 GPU를 갖는 각 워커는 해당 GPU를 사용하고 나머지 워커는 각각의 CPU 코어에서 계산을 실행합니다.

  • 'only' – 열려 있는 병렬 풀이 없으면 이 설정은 'yes'와 같습니다. 병렬 풀이 열려 있으면 고유한 GPU를 갖는 워커만 사용됩니다. 그러나 병렬 풀이 열려 있는데 지원되는 GPU가 없으면 모든 워커 CPU에서 계산이 이루어집니다.

리소스를 표시하는 옵션으로, 'yes' 또는 'no'로 지정됩니다.

  • 'no' – 사용되는 연산 리소스를 명령줄에 표시하지 않습니다. 디폴트 설정입니다.

  • 'yes' – 실제 사용되는 연산 리소스의 요약을 명령줄에 표시합니다. 병렬 연산 또는 GPU 연산이 요청됐는데 병렬 풀이 열려 있지 않거나 지원되는 GPU가 없는 경우, 요청된 리소스와 실제 리소스가 다를 수 있습니다. 병렬 워커가 사용되는 경우, 각 워커의 계산 모드가 설명됩니다(풀에 있으나 사용되지 않는 워커 포함).

메모리 축소 배율로, 양의 정수로 지정됩니다.

대부분의 신경망에서 디폴트 CPU 훈련 계산 모드는 컴파일된 MEX 알고리즘입니다. 그러나 규모가 큰 신경망에서는 계산이 MATLAB® 계산 모드로 이루어질 수 있습니다. 계산 모드는 'showResources'를 사용하여 확인할 수 있습니다. MATLAB을 사용 중이고 메모리가 문제가 되는 경우, 축소 배율 옵션을 1보다 큰 값 N으로 설정하면 훈련 시간이 더 오래 걸리지만 훈련에 필요한 임시 저장 공간을 N배만큼 줄일 수 있습니다.

검사 지점 파일로, 문자형 벡터로 지정됩니다.

'CheckpointFile'의 값은 현재 작업 폴더에 저장할 파일 이름 또는 다른 폴더의 파일 경로로 설정할 수 있습니다. 혹은 빈 문자열로 설정하여 검사 지점 저장을 비활성화할 수 있습니다(디폴트 값).

검사 지점 지연으로, 음이 아닌 정수로 지정됩니다.

선택적 파라미터 'CheckpointDelay'는 저장이 일어나는 빈도를 제한합니다. 검사 지점의 빈도를 제한하면 계산에 소요되는 시간 대비 검사 지점 저장에 소요되는 시간을 짧게 하여 효율을 개선할 수 있습니다. 디폴트 값은 60으로, 검사 지정 저장이 1분에 두 번 이상 발생하지 않습니다. 검사 지점 저장이 Epoch 1회당 한 번만 발생하도록 하려면 'CheckpointDelay'의 값을 0으로 설정하십시오.

출력 인수

모두 축소

훈련된 신경망으로, network 객체로 반환됩니다.

훈련 기록(epochperf)로, 신경망 훈련 함수(net.NET.trainFcn)에 따라 필드가 결정되는 구조체로 반환됩니다. 다음과 같은 필드를 포함할 수 있습니다.

  • 훈련, 데이터 분할, 성능 함수와 파라미터

  • 훈련, 검증, 테스트 세트의 데이터 분할 인덱스

  • 훈련, 검증, 테스트 세트의 데이터 분할 마스크

  • Epoch 횟수(num_epochs) 및 최적의 Epoch(best_epoch).

  • 훈련 상태 이름 목록(states)

  • 훈련 전체에 걸쳐 기록된 각 상태 이름에 대한 필드

  • 각 Epoch에서 평가되는 최적의 신경망 성능: 훈련 세트에 대한 최적의 성능(best_perf), 검증 세트에 대한 최적의 성능(best_vperf), 테스트 세트에 대한 최적의 성능(best_tperf)

알고리즘

trainnet.trainParam으로 지정된 훈련 파라미터 값을 사용하여 net.trainFcn으로 지정된 함수를 호출합니다.

일반적으로 훈련에서 1회의 Epoch란 신경망에 모든 입력 벡터가 1회 입력되는 것으로 정의됩니다. 그런 다음 이러한 모든 입력 결과에 따라 신경망이 업데이트됩니다.

최대 Epoch 횟수에 도달하거나 성능 목표가 달성되거나 그 밖의 함수 net.trainFcn 중지 조건이 발생하면 훈련이 중지됩니다.

일부 훈련 함수는 이 기준에서 벗어나 Epoch 1회당 하나의 입력 벡터(또는 시퀀스)만 입력하기도 합니다. Epoch 1회당 모든 입력 벡터(또는 시퀀스) 중에서 하나의 입력 벡터(또는 시퀀스)가 무작위로 선택됩니다. competlayer는 이 동작을 수행하는 훈련 함수인 trainru를 사용하는 신경망을 반환합니다.

버전 내역

R2006a 이전에 개발됨

참고 항목

| | |