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

심층 네트워크 디자이너 시작하기

이 예제에서는 사전 훈련된 GoogLeNet 네트워크가 새로운 영상의 모음을 분류하도록 미세 조정하는 방법을 보여줍니다. 이 절차는 전이 학습이라고 부르며, 학습된 특징을 적은 개수의 훈련 영상을 사용하여 새 작업에 적용할 수 있기 때문에 일반적으로 새로운 네트워크를 훈련시키는 것보다 훨씬 빠르고 쉽습니다. 전이 학습을 위해 네트워크를 대화형 방식으로 준비하려면 심층 네트워크 디자이너를 사용하십시오.

사전 훈련된 네트워크 불러오기

사전 훈련된 GoogLeNet 네트워크를 불러옵니다. 네트워크를 다운로드해야 할 경우에는 다운로드 링크를 사용하십시오.

net = googlenet;

심층 네트워크 디자이너로 네트워크 가져오기

심층 네트워크 디자이너를 엽니다.

deepNetworkDesigner

가져오기를 클릭하고 작업 공간에서 네트워크를 선택합니다. 심층 네트워크 디자이너에 전체 네트워크의 축소된 형태가 표시됩니다. 네트워크 플롯을 살펴봅니다. 마우스를 사용하여 확대하려면 Ctrl+스크롤 휠을 사용하십시오.

전이 학습을 위해 네트워크 편집하기

사전 훈련된 네트워크가 새 영상을 분류하도록 다시 훈련시키려면 마지막 계층들을 새로운 데이터 세트에 적응된 새로운 계층들로 교체하십시오. 데이터에 맞도록 클래스의 개수를 변경해야 합니다.

계층 라이브러리에서 캔버스로 새 fullyConnectedLayer를 끌어서 놓습니다. OutputSize를 새 데이터의 클래스 개수(이 예제에서는 5)로 편집합니다.

전이된 계층보다 새 계층에서 학습이 더 빨리 이루어지도록 학습률을 편집합니다. WeightLearnRateFactorBiasLearnRateFactor를 10으로 설정합니다. 마지막 완전 연결 계층을 삭제하고 새로 추가한 계층을 대신 연결합니다.

출력 계층을 교체합니다. 계층 라이브러리의 끝으로 스크롤한 다음, 캔버스로 새 classificationLayer를 끌어서 놓습니다. 원래 output 계층을 삭제하고 대신 새 계층을 연결합니다.

네트워크 확인하기

편집한 네트워크가 훈련시킬 준비가 되었는지 확인하려면 분석을 클릭하고 딥러닝 신경망 분석기에 보고되는 오류가 없는지 확인합니다.

훈련을 위해 네트워크 내보내기

심층 네트워크 디자이너로 돌아가서 내보내기를 클릭합니다. 심층 네트워크 디자이너가 편집된 네트워크 계층을 포함하는 새 변수 lgraph_1로 네트워크를 내보냅니다. 이제 trainNetwork 함수에 계층 변수를 입력할 수 있습니다. 네트워크 아키텍처를 다시 생성하고 이를 MATLAB 작업 공간에 layerGraph 객체 또는 Layer 배열로 반환하는 MATLAB® 코드를 생성할 수도 있습니다.

데이터를 불러오고 네트워크 훈련시키기

새 영상의 압축을 풀고 영상 데이터저장소로 불러옵니다. 데이터를 70%의 훈련 데이터와 30%의 검증 데이터로 나눕니다.

unzip('MerchData.zip');
imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames');
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

사전 훈련된 네트워크의 입력 크기와 일치하도록 영상의 크기를 조정합니다.

augimdsTrain = augmentedImageDatastore([224 224],imdsTrain);
augimdsValidation = augmentedImageDatastore([224 224],imdsValidation);

훈련 옵션을 지정합니다.

  • 미니 배치의 크기, 즉 각 반복당 사용할 영상의 개수를 지정합니다.

  • Epoch를 적은 횟수로 지정합니다. Epoch 1회는 전체 훈련 데이터 세트에 대한 하나의 완전한 훈련 주기를 의미합니다. 전이 학습에서는 그렇게 많은 Epoch 횟수만큼 훈련하지 않아도 됩니다. 매 Epoch마다 데이터를 섞습니다.

  • 전이된 계층의 학습을 늦추려면 InitialLearnRate를 작은 값으로 설정하십시오.

  • 검증 데이터와 작은 검증 빈도를 지정합니다.

  • 훈련 중에 진행 상황을 모니터링하기 위해 훈련 플롯을 켭니다.

options = trainingOptions('sgdm', ...
    'MiniBatchSize',10, ...
    'MaxEpochs',6, ...
    'Shuffle','every-epoch', ...
    'InitialLearnRate',1e-4, ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',6, ...
    'Verbose',false, ...
    'Plots','training-progress');

네트워크를 훈련시키려면 앱에서 내보낸 계층, lgraph_1, 훈련 영상과 옵션을 trainNetwork 함수에 입력합니다. 기본적으로 trainNetwork는 GPU를 사용할 수 있으면 GPU를 사용합니다(Parallel Computing Toolbox™ 필요). GPU를 사용할 수 없으면 CPU를 사용합니다. 데이터 세트의 크기가 매우 작기 때문에 훈련이 빠르게 진행됩니다.

netTransfer = trainNetwork(augimdsTrain,lgraph_1,options);

훈련된 네트워크 테스트하기

미세 조정된 네트워크를 사용하여 검증 영상을 분류한 다음 분류 정확도를 계산합니다.

[YPred,probs] = classify(netTransfer,augimdsValidation);
accuracy = mean(YPred == imdsValidation.Labels)
accuracy = 1

4개의 샘플 검증 영상을 예측 레이블 및 예측 확률과 함께 표시합니다.

idx = randperm(numel(augimdsValidation.Files),4);
figure
for i = 1:4
    subplot(2,2,i)
    I = readimage(imdsValidation,idx(i));
    imshow(I)
    label = YPred(idx(i));
    title(string(label) + ", " + num2str(100*max(probs(idx(i),:)),3) + "%");
end

다른 사전 훈련된 네트워크에 대해 알아보고 사용해 보려면 심층 네트워크 디자이너 항목을 참조하십시오.

참고 항목

관련 항목