딥러닝 신경망 훈련 중의 출력값 사용자 지정하기
이 예제에서는 딥러닝 신경망 훈련 중에 각 반복에서 실행되는 출력 함수를 정의하는 방법을 보여줍니다. trainingOptions
의 'OutputFcn'
이름-값 쌍 인수를 사용하여 출력 함수를 지정하면 trainNetwork
가 훈련을 시작하기 전에 한 번, 각 훈련 반복이 실행된 뒤에 한 번, 그리고 훈련이 완료된 뒤에 한 번 이러한 함수를 호출합니다. 출력 함수가 호출될 때마다 trainNetwork
는 현재 반복 횟수, 손실, 정확도와 같은 정보를 포함하는 구조체를 전달합니다. 출력 함수를 사용하여 진행 상황 정보를 표시하거나 플로팅할 수도 있고 훈련을 중단할 수도 있습니다. 훈련을 조기에 중단하려면 출력 함수가 true
를 반환하도록 하십시오. 출력 함수가 true
를 반환하면 훈련이 완료되고 trainNetwork
가 마지막 신경망을 반환합니다.
검증 세트에서 손실이 더 이상 감소하지 않을 때 훈련을 중단하려면 각각 trainingOptions
의 'ValidationData'
이름-값 쌍 인수와 'ValidationPatience'
이름-값 쌍 인수를 사용하여 검증 데이터와 검증 인내도를 지정하십시오. 검증 인내도(validation patience)는 신경망 훈련이 중단되기 전까지 검증 세트에서의 손실이 그전까지의 가장 작은 손실보다 크거나 같아도 되는 횟수입니다. 출력 함수를 사용하여 더 많은 중지 기준을 추가할 수 있습니다. 이 예제에서는 검증 데이터의 분류 정확도가 더 이상 향상되지 않을 때 훈련을 중단하는 출력 함수를 만드는 방법을 설명합니다. 출력 함수는 스크립트의 끝에서 정의됩니다.
숫자 영상 5,000개를 포함하는 훈련 데이터를 불러옵니다. 신경망 검증을 위해 영상 1,000개를 남겨 둡니다.
[XTrain,YTrain] = digitTrain4DArrayData; idx = randperm(size(XTrain,4),1000); XValidation = XTrain(:,:,:,idx); XTrain(:,:,:,idx) = []; YValidation = YTrain(idx); YTrain(idx) = [];
숫자 영상 데이터를 분류할 신경망을 구성합니다.
layers = [ imageInputLayer([28 28 1]) convolution2dLayer(3,8,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) convolution2dLayer(3,16,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) convolution2dLayer(3,32,'Padding','same') batchNormalizationLayer reluLayer fullyConnectedLayer(10) softmaxLayer classificationLayer];
신경망 훈련 옵션을 지정합니다. 훈련 중에 규칙적인 간격으로 신경망을 검증하려면 검증 데이터를 지정하십시오. Epoch당 한 번씩 신경망 검증이 실시되도록 'ValidationFrequency'
값을 선택합니다.
검증 세트에 대한 분류 정확도가 더 이상 향상되지 않을 때 훈련을 중단하려면 stopIfAccuracyNotImproving
을 출력 함수로 지정하십시오. stopIfAccuracyNotImproving
의 두 번째 입력 인수는 신경망 훈련이 중단되기 전까지 검증 세트에 대한 정확도가 그전까지의 가장 높은 정확도보다 작거나 같아도 되는 횟수입니다. 훈련시킬 최대 Epoch 횟수로 임의의 큰 값을 선택합니다. 훈련이 자동으로 중단되므로 마지막 Epoch까지 훈련이 진행되지 않습니다.
miniBatchSize = 128; validationFrequency = floor(numel(YTrain)/miniBatchSize); options = trainingOptions('sgdm', ... 'InitialLearnRate',0.01, ... 'MaxEpochs',100, ... 'MiniBatchSize',miniBatchSize, ... 'VerboseFrequency',validationFrequency, ... 'ValidationData',{XValidation,YValidation}, ... 'ValidationFrequency',validationFrequency, ... 'Plots','training-progress', ... 'OutputFcn',@(info)stopIfAccuracyNotImproving(info,3));
신경망을 훈련시킵니다. 검증의 정확도가 더 이상 증가하지 않으면 훈련이 중단됩니다.
net = trainNetwork(XTrain,YTrain,layers,options);
Training on single CPU. Initializing input data normalization. |======================================================================================================================| | Epoch | Iteration | Time Elapsed | Mini-batch | Validation | Mini-batch | Validation | Base Learning | | | | (hh:mm:ss) | Accuracy | Accuracy | Loss | Loss | Rate | |======================================================================================================================| | 1 | 1 | 00:00:02 | 7.81% | 12.70% | 2.7155 | 2.5169 | 0.0100 | | 1 | 31 | 00:00:07 | 71.88% | 74.70% | 0.8805 | 0.8124 | 0.0100 | | 2 | 62 | 00:00:12 | 87.50% | 88.00% | 0.3855 | 0.4426 | 0.0100 | | 3 | 93 | 00:00:18 | 94.53% | 94.00% | 0.2198 | 0.2544 | 0.0100 | | 4 | 124 | 00:00:25 | 96.09% | 96.40% | 0.1454 | 0.1754 | 0.0100 | | 5 | 155 | 00:00:31 | 98.44% | 97.70% | 0.0982 | 0.1298 | 0.0100 | | 6 | 186 | 00:00:35 | 99.22% | 97.90% | 0.0788 | 0.1132 | 0.0100 | | 7 | 217 | 00:00:39 | 100.00% | 98.00% | 0.0554 | 0.0937 | 0.0100 | | 8 | 248 | 00:00:42 | 100.00% | 97.90% | 0.0430 | 0.0863 | 0.0100 | | 9 | 279 | 00:00:46 | 100.00% | 98.10% | 0.0336 | 0.0787 | 0.0100 | | 10 | 310 | 00:00:49 | 100.00% | 98.40% | 0.0269 | 0.0685 | 0.0100 | | 11 | 341 | 00:00:52 | 100.00% | 98.40% | 0.0233 | 0.0621 | 0.0100 | | 12 | 372 | 00:00:55 | 100.00% | 98.70% | 0.0210 | 0.0572 | 0.0100 | | 13 | 403 | 00:00:58 | 100.00% | 98.80% | 0.0185 | 0.0538 | 0.0100 | | 14 | 434 | 00:01:01 | 100.00% | 98.90% | 0.0161 | 0.0512 | 0.0100 | | 15 | 465 | 00:01:04 | 100.00% | 98.80% | 0.0140 | 0.0491 | 0.0100 | | 16 | 496 | 00:01:07 | 100.00% | 98.70% | 0.0124 | 0.0466 | 0.0100 | | 17 | 527 | 00:01:10 | 100.00% | 98.90% | 0.0110 | 0.0444 | 0.0100 | |======================================================================================================================| Training finished: Stopped by OutputFcn.
출력 함수 정의하기
검증 데이터에 대한 가장 높은 분류 정확도가 신경망 검증에서 N
번 연속으로 향상되지 않으면 신경망 훈련을 중지하는 출력 함수 stopIfAccuracyNotImproving(info,N)
을 정의합니다. 이 조건은 손실이 아닌 분류 정확도에 적용된다는 점만 제외하면 검증 손실을 사용하는 내장된 중지 기준과 비슷합니다.
function stop = stopIfAccuracyNotImproving(info,N) stop = false; % Keep track of the best validation accuracy and the number of validations for which % there has not been an improvement of the accuracy. persistent bestValAccuracy persistent valLag % Clear the variables when training starts. if info.State == "start" bestValAccuracy = 0; valLag = 0; elseif ~isempty(info.ValidationLoss) % Compare the current validation accuracy to the best accuracy so far, % and either set the best accuracy to the current accuracy, or increase % the number of validations for which there has not been an improvement. if info.ValidationAccuracy > bestValAccuracy valLag = 0; bestValAccuracy = info.ValidationAccuracy; else valLag = valLag + 1; end % If the validation lag is at least N, that is, the validation accuracy % has not improved for at least N validations, then return true and % stop training. if valLag >= N stop = true; end end end
참고 항목
trainNetwork
| trainingOptions