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

심층 네트워크 디자이너를 사용한 전이 학습

이 예제에서는 심층 네트워크 디자이너 앱을 사용하여 전이 학습을 위해 네트워크를 대화형 방식으로 준비하는 방법을 보여줍니다. 전이 학습은 사전 훈련된 심층 학습 네트워크가 새로운 작업을 학습하도록 미세 조정하는 과정입니다. 학습된 특징을 적은 개수의 훈련 이미지를 사용해 새로운 작업에 빠르게 전이할 수 있기 때문에 일반적으로 전이 학습을 사용하는 것이 네트워크를 처음부터 훈련시키는 것보다 훨씬 빠르고 쉬운 방법입니다.

다음 단계에 따라 전이 학습을 수행합니다.

  1. 사전 훈련된 네트워크를 선택하고 앱으로 가져옵니다.

  2. 마지막 계층들을 새로운 데이터 세트에 적응된 새로운 계층들로 교체합니다.

    1. 훈련 이미지에 포함된 새 클래스 개수를 지정합니다.

    2. 전이된 계층보다 새 계층에서 학습이 더 빨리 이루어지도록 학습률을 설정합니다.

  3. 명령줄에서 훈련할 수 있도록 네트워크를 내보냅니다.

사전 훈련된 네트워크 선택하기

Deep Learning Toolbox™는 다양한 이미지에 알맞은 풍부한 특징 표현을 학습한 여러 사전 훈련된 이미지 분류 네트워크를 제공합니다. 전이 학습은 이미지가 네트워크를 훈련시키는 데 사용된 원래 이미지와 비슷한 경우에 가장 효과적입니다. 훈련 이미지가 ImageNet 데이터베이스의 이미지와 같은 자연 이미지라면 어떠한 사전 훈련된 네트워크라도 모두 적합합니다. 먼저 더 빠른 네트워크를 사용해 보려면 googlenet 또는 squeezenet을 사용하십시오. 사용 가능한 네트워크 목록과 이들을 비교하는 방법은 사전 훈련된 심층 신경망 항목을 참조하십시오.

데이터가 ImageNet 데이터와 매우 다르다면 새로운 네트워크를 훈련시키는 것이 나을 수 있습니다. 예를 들어, 아주 작은 이미지, 스펙트로그램 또는 이미지가 아닌 데이터가 있다면 대신 Build Networks with Deep Network Designer 항목을 참조하십시오.

사전 훈련된 GoogLeNet 네트워크를 불러옵니다. 네트워크를 다운로드해야 할 경우에는 함수가 애드온 탐색기로 연결되는 링크를 제공합니다.

net = googlenet;

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

심층 네트워크 디자이너를 열려면 앱(Apps) 탭의 기계 학습 및 심층 학습(Machine Learning and Deep Learning)에서 앱 아이콘을 클릭합니다. 또는 명령줄에서 앱을 열 수도 있습니다.

deepNetworkDesigner

가져오기(Import)를 클릭하고 작업 공간에서 불러올 네트워크를 선택합니다. 심층 네트워크 디자이너에 전체 네트워크의 축소된 형태가 표시됩니다.

네트워크 플롯을 살펴봅니다. 마우스를 사용하여 확대하려면 Ctrl+스크롤 휠을 사용하십시오. 패닝하려면 화살표 키를 사용하거나 스크롤 휠을 누르고 마우스를 끄십시오. 속성을 볼 계층을 하나 선택합니다. 속성(Properties) 창에서 네트워크 요약을 보려면 모든 계층을 선택 취소합니다.

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

네트워크는 마지막 학습 가능한 계층과 마지막 분류 계층을 사용하여 입력 이미지를 분류합니다. 사전 훈련된 네트워크가 새 이미지를 분류하도록 다시 훈련시키려면 이 마지막 계층들을 새로운 데이터 세트에 적응된 새로운 계층들로 교체하십시오.

클래스 개수 변경하기

사전 훈련된 네트워크를 전이 학습을 위해 사용하려면 클래스 개수가 새로운 데이터 세트와 일치하도록 변경해야 합니다. 먼저 네트워크에서 마지막 학습 가능한 계층을 찾습니다. GoogLeNet과 대부분의 사전 훈련된 네트워크의 경우 마지막 학습 가능한 계층은 완전 연결 계층입니다. 계층 loss3-classifier를 클릭하고 속성을 봅니다.

OutputSize 속성은 분류 문제에 대한 클래스 개수를 정의합니다. 속성(Properties) 창에서 사전 훈련된 네트워크가 이미지를 1000개 클래스로 분류할 수 있음을 볼 수 있습니다. OutputSize는 편집할 수 없습니다.

클래스 개수를 변경하려면 계층 라이브러리(Layer Library)에서 캔버스로 새 fullyConnectedLayer를 끌어서 놓습니다. OutputSize 속성을 데이터의 클래스 개수로 편집합니다. 이 예제에서는 5를 입력하십시오. 원래 loss3-classifier 계층을 삭제하고 대신 새 계층을 연결합니다.

마지막 계층인 분류 계층을 선택합니다. 속성 창에서 OutputSize가 1000개 클래스라는 사실과 처음 몇 개의 클래스 이름을 볼 수 있습니다.

전이 학습에서는 출력 계층을 교체해야 합니다. 계층 라이브러리(Layer Library)의 끝으로 스크롤한 다음, 캔버스로 새 classificationLayer를 끌어서 놓습니다. 원래 output 계층을 삭제하고 대신 새 계층을 연결합니다. 새 출력 계층에 대해 OutputSize를 설정할 필요는 없습니다. trainNetwork는 훈련 시점에 자동으로 데이터로부터 계층의 출력 클래스를 설정합니다.

새 계층이 더 빨리 학습하도록 만들기

전이된 계층보다 새 계층에서 학습이 더 빨리 이루어지도록 학습률을 편집합니다. 새 fullyConnectedLayer 계층에서 WeightLearnRateFactorBiasLearnRateFactor를 10으로 설정합니다.

네트워크 확인하기

네트워크를 확인하고 계층의 더 많은 세부 정보를 살펴보려면 분석(Analyze)을 클릭하십시오. 심층 학습 네트워크 분석기에 보고되는 오류가 없으면 편집한 네트워크가 훈련시킬 준비가 된 것입니다.

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

네트워크를 작업 공간으로 내보내려면 심층 네트워크 디자이너로 돌아가서 내보내기(Export)를 클릭하십시오. 심층 네트워크 디자이너가 편집된 네트워크 계층을 포함하는 새 변수 lgraph_1로 네트워크를 내보냅니다. 내보내기가 완료되면 trainNetwork 함수에 계층 변수를 입력할 수 있습니다. 네트워크 아키텍처를 다시 생성하고 이를 작업 공간에 변수로 반환하는 MATLAB® 코드를 생성할 수도 있습니다. 자세한 내용은 Generate MATLAB Code from Deep Network Designer 항목을 참조하십시오.

심층 네트워크 디자이너에서 내보낸 네트워크 훈련시키기

이 예제에서는 심층 네트워크 디자이너에서 내보낸 네트워크를 전이 학습을 위해 사용하는 방법을 보여줍니다. 앱에서 네트워크를 준비한 후에는 다음을 수행해야 합니다.

  • 이미지 크기를 조정합니다.

  • 훈련 옵션을 지정합니다.

  • 네트워크를 훈련시킵니다.

전이 학습을 위해 이미지 크기 조정하기

전이 학습을 위해, 사전 훈련된 네트워크의 입력 크기와 일치하도록 이미지의 크기를 조정합니다. 네트워크의 이미지 입력 크기를 구하려면 심층 네트워크 디자이너에서 imageInputLayer를 살펴봅니다. GoogLeNet의 경우 InputSize224x224입니다.

이미지의 압축을 풀고 이미지 데이터저장소로 불러옵니다. 이 데이터 세트는 5개 클래스에서 75개의 이미지만을 갖는 매우 작은 데이터 세트입니다. 데이터를 훈련 데이터 70%와 검증 데이터 30%로 분할합니다.

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

훈련 이미지가 각 클래스별 하위 폴더를 갖는 폴더에 있는 경우, MerchData를 폴더 위치로 바꿔서 데이터를 위한 데이터저장소를 만들 수 있습니다. 클래스 개수를 확인하십시오. 전이 학습을 위한 네트워크가 데이터와 일치하는 클래스 개수를 갖도록 준비해야 합니다.

이미지 데이터저장소의 이미지가 사전 훈련된 네트워크 GoogLeNet과 일치하도록 크기를 조정합니다.

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

네트워크가 과적합되지 않도록 이미지에 변환을 적용할 수도 있습니다. 자세한 내용은 imageDataAugmenter를 참조하십시오.

전이 학습을 위한 훈련 옵션 설정하기

훈련을 시작하기 전에 훈련 옵션을 지정합니다.

  • 전이 학습의 경우, 전이된 계층의 학습을 늦추려면 InitialLearnRate를 작은 값으로 설정하십시오. 앱에서 새로운 마지막 계층의 학습 속도를 높이기 위해 완전 연결 계층의 학습률 인자를 증가시켰습니다. 이러한 조합으로 학습률을 설정하면 새로운 계층에서는 학습이 빨라지고 나머지 계층에서는 학습이 느려집니다.

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

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

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

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

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

네트워크 훈련시키기

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

net = trainNetwork(augimdsTrain,lgraph_1,options);

검증 이미지를 분류하여 훈련된 네트워크 테스트하기

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

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

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

idx = randperm(numel(imdsValidation.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

참고 항목

관련 항목