이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

파라미터를 설정하고 컨벌루션 신경망 훈련시키기

컨벌루션 신경망의 계층 지정하기에서 설명하는 대로 신경망의 계층을 정의했다면 다음 단계는 네트워크의 훈련 옵션을 설정하는 것입니다. trainingOptions 함수를 사용하여 전역 훈련 파라미터를 정의합니다. 네트워크를 훈련시키려면 trainingOptions에서 반환되는 객체를 trainNetwork 함수의 입력 인수로 사용하십시오. 예를 들면 다음과 같이 합니다.

options = trainingOptions('adam');
trainedNet = trainNetwork(data,layers,options);

학습 가능한 파라미터가 있는 계층에도 학습 파라미터를 조정하기 위한 옵션이 있습니다. 자세한 내용은 컨벌루션 계층 및 완전 연결 계층에서 파라미터 설정하기 항목을 참조하십시오.

솔버와 최대 Epoch 횟수 지정하기

trainNetwork는 확률적 경사하강법의 다양한 변형을 사용하여 네트워크를 훈련시킬 수 있습니다. trainingOptionssolverName 인수를 사용하여 최적화 알고리즘을 지정합니다. 이러한 알고리즘은 손실 함수에 대한 음의 기울기 방향으로 작은 스텝을 취하여 손실을 최소화하도록 네트워크 파라미터를 업데이트합니다.

최초 시도에 사용하기 좋은 최적화 함수는 'adam'(Adaptive Moment Estimation에서 유래) 솔버입니다. 또는 'rmsprop'(RMS 전파) 및 'sgdm'(모멘텀을 사용한 확률적 경사하강법) 최적화 함수를 사용해 보고 훈련이 향상되는지 확인해 보십시오. 솔버마다 더 효과적인 결과를 얻을 수 있는 문제가 각각 다릅니다. 다양한 솔버에 대한 자세한 내용은 확률적 경사하강법 항목을 참조하십시오.

솔버는 각 스텝에서 데이터의 서브셋을 사용하여 파라미터를 업데이트합니다. 이러한 서브셋을 미니 배치라고 합니다. trainingOptions'MiniBatchSize' 이름-값 쌍 인수를 사용하여 미니 배치의 크기를 지정할 수 있습니다. 각 파라미터 업데이트를 반복이라고 합니다. 전체 데이터 세트를 완전히 한 번 통과하는 것을 Epoch라고 합니다. trainingOptions'MaxEpochs' 이름-값 쌍 인수를 사용하여 훈련을 실시할 최대 Epoch 횟수를 지정할 수 있습니다. 디폴트 값은 30입니다. 하지만 네트워크가 소규모이거나 대부분의 학습이 이미 완료되어 미세 조정 및 전이 학습을 하는 경우에는 Epoch 횟수를 더 적게 선택할 수 있습니다.

데이터는 기본적으로 훈련을 시작하기 전에 한 번 섞입니다. 'Shuffle' 이름-값 쌍 인수를 사용하여 이 설정을 변경할 수 있습니다.

학습률을 지정하고 수정하기

trainingOptions'InitialLearnRate' 이름-값 쌍 인수를 사용하여 전역 학습률을 지정할 수 있습니다. 기본적으로, trainNetwork는 전체 훈련을 실시하는 내내 이 값을 사용합니다. 원하는 경우 특정 Epoch 횟수마다 학습률에 인자를 곱하여 학습률을 수정할 수 있습니다. 훈련을 실시하는 내내 고정된 작은 학습률을 사용하는 대신, 훈련을 시작할 때는 좀더 큰 학습률을 선택하고 최적화를 하면서 이 값을 점진적으로 줄일 수 있습니다. 이렇게 하면 훈련 시간이 단축되고, 훈련이 진행됨에 따라 손실의 최솟값에 다가갈수록 더 작은 스텝을 취할 수 있습니다.

훈련 중에 미니 배치 손실이 NaN이 된다면 학습률이 너무 높은 것일 수 있습니다. 학습률을 예를 들어 3배 줄인 다음 네트워크 훈련을 다시 시작해 보십시오.

학습률을 점진적으로 줄이려면 'LearnRateSchedule','piecewise' 이름-값 쌍 인수를 사용하십시오. 이 옵션을 선택하면 trainNetwork는 Epoch 10회마다 학습률에 0.1을 곱합니다. 'LearnRateDropFactor' 이름-값 쌍 인수를 사용하여 초기 학습률을 줄일 인자를 지정하고 'LearnRateDropPeriod' 이름-값 쌍 인수를 사용하여 얼마의 Epoch 횟수 후에 초기 학습률을 줄일지 지정할 수 있습니다.

검증 데이터 지정하기

훈련 중에 네트워크 검증을 수행하려면 trainingOptions'ValidationData' 이름-값 쌍 인수를 사용하여 검증 데이터를 지정하십시오. 기본적으로, trainNetwork는 50회 반복마다 검증 데이터의 응답 변수를 예측하고 검증 손실 및 정확도(회귀 네트워크의 경우 RMS 오차)를 계산하여 네트워크를 검증합니다. 'ValidationFrequency' 이름-값 쌍 인수를 사용하여 검증 빈도를 변경할 수 있습니다. 네트워크에 훈련 중 동작과 예측 중 동작이 다른 계층(예: 드롭아웃 계층)이 있는 경우, 검증 정확도가 훈련(미니 배치) 정확도보다 높을 수 있습니다. 검증의 손실이 더 이상 감소하지 않으면 자동으로 훈련을 중지하도록 검증 데이터를 사용할 수 있습니다. 자동 검증 중지 기능을 켜려면 'ValidationPatience' 이름-값 쌍 인수를 사용하십시오.

훈련을 진행하는 동안 일정 간격으로 검증을 수행하면 네트워크가 훈련 데이터에 대해 과적합되고 있는지 판단할 수 있습니다. 흔히 발생하는 문제는 네트워크가 새로운 데이터에 대해 정확한 예측을 가능하게 해주는 일반적인 특징을 학습하는 것이 아니라 단순하 훈련 데이터를 "기억"해 버리는 것입니다. 네트워크가 과적합되고 있는지 확인하려면 훈련 손실과 정확도를 그에 대응하는 검증 메트릭과 비교해 보십시오. 훈련 손실이 검증 손실보다 크게 낮거나 훈련 정확도가 검증 정확도보다 크게 높다면 네트워크가 과적합되고 있는 것입니다.

과적합을 줄이려면 데이터 증대를 추가해 볼 수 있습니다. augmentedImageDatastore를 사용하여 입력 영상에 대해 무작위 변환을 수행하십시오. 이렇게 하면 네트워크가 사물의 정확한 위치와 방향을 기억하는 것을 방지하는 데 도움이 됩니다. 또는 'L2Regularization' 이름-값 쌍 인수를 사용하여 L2 정규화를 늘리고, 컨벌루션 계층 뒤에 배치 정규화 계층을 사용하고, 드롭아웃 계층을 추가해 볼 수도 있습니다.

하드웨어 리소스 선택하기

사용 가능한 경우 trainNetwork는 기본적으로 훈련에 GPU를 사용합니다. GPU를 사용할 수 없으면 trainNetwork는 CPU를 사용합니다. 또는 'ExecutionEnvironment' 이름-값 쌍 인수를 사용하여 사용하려는 실행 환경을 지정할 수도 있습니다. 단일 CPU('cpu'), 단일 GPU('gpu'), 복수의 GPU('multi-gpu') 또는 로컬 병렬 풀이나 계산 클러스터('parallel')를 지정할 수 있습니다. 'cpu'를 제외한 모든 옵션에는 Parallel Computing Toolbox™가 필요합니다. GPU에서 훈련시키려면 CUDA® 지원 GPU(Compute Capability 3.0 이상)가 필요합니다.

검사 지점 네트워크를 저장하고 훈련 재개하기

Deep Learning Toolbox™를 사용하면 훈련 중에 매 Epoch 후에 네트워크를 .mat 파일로 저장할 수 있습니다. 네트워크 또는 데이터 세트의 규모가 커서 훈련시키는 데 오래 걸리는 경우에는 이와 같이 주기적으로 저장하는 것이 특히 유용합니다. 어떤 이유로 훈련이 중단된 경우, 마지막으로 저장된 검사 지점 네트워크에서부터 훈련을 재개할 수 있습니다. trainNetwork가 검사 지점 네트워크를 저장하도록 하려면 trainingOptions'CheckpointPath' 이름-값 쌍 인수를 사용하여 경로의 이름을 지정해야 합니다. 지정한 경로가 존재하지 않는 경우, trainingOptions는 오류를 반환합니다.

trainNetwork는 검사 지점 네트워크 파일에 자동으로 고유한 이름을 할당합니다. net_checkpoint__351__2018_04_12__18_09_52.mat라는 예제 이름에서 351은 반복 횟수이고, 2018_04_12는 날짜이고, 18_09_52trainNetwork가 네트워크를 저장한 시간입니다. 검사 지점 네트워크 파일은 파일을 더블 클릭하거나 명령줄에서 load 명령을 사용하여 불러올 수 있습니다. 예를 들면 다음과 같습니다.

load net_checkpoint__351__2018_04_12__18_09_52.mat
그런 다음 trainNetwork에 대한 입력 인수로 네트워크의 계층을 사용하여 훈련을 재개할 수 있습니다. 예를 들면 다음과 같습니다.

trainNetwork(XTrain,YTrain,net.Layers,options)
검사 지점 네트워크에는 훈련 옵션과 입력 데이터가 없으므로, 훈련 옵션 및 입력 데이터는 직접 지정해야 합니다. 예제는 검사 지점 네트워크에서 훈련 재개하기 항목을 참조하십시오.

컨벌루션 계층 및 완전 연결 계층에서 파라미터 설정하기

컨벌루션 계층 및 완전 연결 계층과 같이 학습 가능한 파라미터가 있는 계층에서, 학습 파라미터를 trainingOptions로 지정된 전역 값과 다르게 설정할 수 있습니다. 예를 들어, 편향이나 가중치에 대한 학습률을 조정하기 위해 각각 계층의 BiasLearnRateFactor 속성이나 WeightLearnRateFactor 속성에 대해 값을 지정할 수 있습니다. trainNetwork 함수는 trainingOptions를 이러한 인자와 함께 사용하여, 지정한 학습률을 곱합니다. 마찬가지로, 각각 BiasL2Factor 속성과 WeightL2Factor 속성을 지정하여 이러한 계층의 가중치와 편향에 대한 L2 정규화 인자를 지정할 수도 있습니다. trainNetworktrainingOptions를 이러한 인자와 함께 사용하여, 지정한 L2 인자를 곱합니다.

컨벌루션 계층 및 완전 연결 계층의 가중치 초기화하기

계층 가중치는 학습 가능한 파라미터입니다. 계층의 Weights 속성을 사용하여 가중치에 대한 초기값을 직접 지정할 수 있습니다. 네트워크를 훈련시킬 때 계층의 Weights 속성이 비어 있지 않으면 trainNetworkWeights 속성을 초기값으로 사용합니다. Weights 속성이 비어 있으면 trainNetwork는 계층의 WeightsInitializer 속성으로 지정된 이니셜라이저를 사용합니다.

네트워크 훈련시키기

네트워크의 계층과 훈련 파라미터를 지정한 후에는 훈련 데이터를 사용하여 네트워크를 훈련시킬 수 있습니다. 데이터, 계층 및 훈련 옵션은 모두 아래 예제에서처럼 trainNetwork 함수의 입력 인수가 됩니다.

layers = [imageInputLayer([28 28 1])
          convolution2dLayer(5,20)
          reluLayer
          maxPooling2dLayer(2,'Stride',2)
          fullyConnectedLayer(10)
          softmaxLayer
          classificationLayer];
options = trainingOptions('adam');
convnet = trainNetwork(data,layers,options);

훈련 데이터는 배열, 테이블 또는 ImageDatastore 객체일 수 있습니다. 자세한 내용은 trainNetwork 함수 도움말 페이지를 참조하십시오.

참고 항목

| | |

관련 항목