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

심층 신경망 디자이너를 사용한 전이 학습

이 예제에서는 심층 신경망 디자이너 앱을 사용하여 전이 학습을 대화형 방식으로 수행하는 방법을 보여줍니다.

전이 학습은 사전 훈련된 딥러닝 신경망이 새로운 작업을 학습하도록 미세 조정하는 과정입니다. 전이 학습을 사용하는 것은 신경망을 처음부터 훈련시키는 것보다 일반적으로 더 빠르고 쉽습니다. 학습된 특징을 보다 적은 양의 데이터를 사용하여 새로운 작업으로 빠르게 전이할 수 있습니다.

다음 단계에 따라 심층 신경망 디자이너를 사용하여 영상 분류를 위한 전이 학습을 수행합니다.

  1. 심층 신경망 디자이너 앱을 열고 사전 훈련된 신경망을 선택합니다.

  2. 새 데이터 세트를 가져옵니다.

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

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

  5. 심층 신경망 디자이너를 사용하여 신경망을 훈련시키거나 명령줄에서 훈련시키기 위해 신경망을 내보냅니다.

데이터 추출하기

작업 공간에서 MathWorks Merch 데이터 세트를 추출합니다. MathWorks Merch 데이터 세트는 5개의 클래스(cap, cube, playing cards, screwdriver, torch)에 속하는 MathWorks 기념품 75개의 영상을 포함하는 소규모 데이터 세트입니다.

unzip("MerchData.zip");

사전 훈련된 신경망 선택하기

심층 신경망 디자이너를 열려면 탭의 머신러닝 및 딥러닝에서 앱 아이콘을 클릭합니다. 또는 명령줄에서 앱을 열 수도 있습니다.

deepNetworkDesigner

심층 신경망 디자이너는 다양한 영상에 알맞은 풍부한 특징 표현을 학습한 여러 사전 훈련된 영상 분류 신경망을 제공합니다. 전이 학습은 영상이 신경망을 훈련시키는 데 사용된 원래 영상과 비슷한 경우에 가장 효과적입니다. 훈련 영상이 ImageNet 데이터베이스의 영상과 같은 자연 영상이라면 어떠한 사전 훈련된 신경망이라도 모두 적합합니다. 사용 가능한 신경망 목록과 이들을 비교하는 방법은 사전 훈련된 심층 신경망 항목을 참조하십시오.

데이터가 ImageNet 데이터와 매우 다르다면, 예를 들어 아주 작은 영상, 스펙트로그램 또는 영상이 아닌 데이터가 있다면 새로운 신경망을 훈련시키는 것이 나을 수 있습니다. 영상이 아닌 데이터를 사용하여 신경망을 훈련시키는 방법을 보여주는 예제는 Create Simple Sequence Classification Network Using Deep Network Designer 항목을 참조하십시오.

SqueezeNet에는 추가 지원 패키지가 필요하지 않습니다. 다른 사전 훈련된 신경망의 경우, 필수 지원 패키지가 설치되어 있지 않으면 앱에서 설치 옵션이 제공됩니다.

사전 훈련된 신경망 목록에서 SqueezeNet을 선택하고 열기를 클릭합니다.

신경망 탐색하기

심층 신경망 디자이너의 디자이너 창에 전체 신경망의 축소된 형태가 표시됩니다.

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

데이터 가져오기

심층 신경망 디자이너로 데이터를 불러오려면 데이터 탭에서 데이터 가져오기를 클릭하십시오. 데이터 가져오기 대화 상자가 열립니다.

데이터 소스 목록에서 폴더를 선택합니다. 찾아보기를 클릭하고 추출된 MerchData 폴더를 선택합니다.

영상 증대하기

훈련 데이터에 영상 증대를 적용하도록 선택할 수 있습니다. 심층 신경망 디자이너 앱은 다음과 같은 증대 옵션을 제공합니다.

  • x축에서의 무작위 반사

  • y축에서의 무작위 반사

  • 무작위 회전

  • 무작위 재스케일링

  • 무작위 가로 평행 이동

  • 무작위 세로 평행 이동

데이터에 무작위 방식의 증대를 적용하여 훈련 데이터의 양을 효과적으로 늘릴 수 있습니다. 또한 증대를 사용하면 신경망이 왜곡된 영상 데이터에 대해 일관된 결과를 도출하도록 훈련시킬 수 있습니다. 예를 들어, 신경망이 회전된 입력 영상에 대해서도 일관된 결과를 도출하도록 하려면 입력 영상에 무작위 방식의 회전을 가할 수 있습니다.

이 예제에서는 x축에서 무작위 반사를 적용하고, [-90,90]도에서 무작위 회전을 적용하고, [1,2] 범위에서 무작위 재스케일링을 적용합니다.

검증 데이터

훈련 데이터에서 검증 데이터를 분할하거나 다른 소스에서 가져오는 방법으로 검증 데이터를 가져오도록 선택할 수도 있습니다. 검증은 훈련 데이터를 기준으로 새 데이터에서의 모델 성능을 비교하여 추정하며, 성능을 모니터링하고 과적합을 방지하는 데 도움을 줍니다.

이 예제에서는 영상의 30%를 검증용으로 사용합니다.

가져오기를 클릭하여 데이터를 심층 신경망 디자이너로 가져옵니다.

데이터 시각화하기

심층 신경망 디자이너를 사용하여 데이터 창에서 훈련 데이터와 검증 데이터의 분포를 시각적으로 조사할 수 있습니다. 이 예제에는 데이터 세트에 5개의 클래스가 있는 것을 볼 수 있습니다.

훈련을 위해 신경망 준비하기

디자이너 창에서 신경망을 편집하여 데이터에서 클래스 개수를 새로 지정합니다. 전이 학습을 위해 신경망을 준비하려면 마지막 학습 가능한 계층과 마지막 분류 계층을 바꾸십시오.

마지막 학습 가능한 계층 바꾸기

사전 훈련된 신경망을 전이 학습을 위해 사용하려면 클래스 개수가 새로운 데이터 세트와 일치하도록 변경해야 합니다. 먼저 신경망에서 마지막 학습 가능한 계층을 찾습니다. SqueezeNet의 마지막 학습 가능한 계층은 마지막 컨벌루션 계층인 'conv10'입니다. 이 경우 컨벌루션 계층을 필터의 개수가 클래스 개수와 같은 새로운 컨벌루션 계층으로 바꿉니다.

캔버스에 새 convolutional2dLayer를 끌어서 놓습니다. 원래 컨벌루션 계층과 일치하도록 FilterSize1,1로 설정합니다.

NumFilters 속성은 분류 문제에 대한 클래스 개수를 정의합니다. NumFilters를 새 데이터의 클래스 개수(이 예제에서는 5)로 변경합니다.

전이된 계층보다 새 계층에서 학습이 더 빨리 이루어지도록 WeightLearnRateFactorBiasLearnRateFactor 세트를 10으로 설정하여 학습률을 변경합니다.

마지막 2차원 컨벌루션 계층을 삭제하고 새로 추가한 계층을 대신 연결합니다.

출력 계층 바꾸기

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

새 출력 계층에 대해 OutputSize를 설정할 필요는 없습니다. 심층 신경망 디자이너는 훈련 시점에 자동으로 데이터로부터 계층의 출력 클래스를 설정합니다.

신경망 확인하기

신경망이 훈련 준비가 되었는지 확인하려면 분석을 클릭하십시오. 딥러닝 신경망 분석기에 보고되는 오류가 없으면 편집한 신경망이 훈련시킬 준비가 된 것입니다.

신경망 훈련시키기

심층 신경망 디자이너 앱을 사용하여 앱에서 가져왔거나 만든 영상 분류 신경망을 훈련시킬 수 있습니다. 다른 유형의 데이터의 경우 심층 신경망 디자이너에서 신경망을 생성한 후 훈련을 위해 내보낼 수 있습니다. 심층 신경망 디자이너를 사용하여 시퀀스 신경망을 만들고 훈련을 위해 결과를 내보내는 방법을 보여주는 예제는 Create Simple Sequence Classification Network Using Deep Network Designer 항목을 참조하십시오.

디폴트 설정을 사용하여 신경망을 훈련시키려면 훈련 탭에서 훈련을 클릭하십시오. 디폴트 훈련 옵션은 대규모 데이터 세트에 더 적합합니다. 소규모 데이터 세트의 경우 MiniBatchSizeValidationFrequency에 더 작은 값을 사용하십시오.

훈련을 보다 세부적으로 제어하려면 훈련 옵션을 클릭하고 훈련에 사용할 설정을 선택합니다.

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

  • 검증 데이터에 대한 정확도가 Epoch 1회마다 한 번씩 계산되도록 ValidationFrequency를 지정합니다.

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

  • 미니 배치의 크기, 즉 각 반복당 사용할 영상의 개수를 지정합니다. 매 Epoch마다 데이터 세트 전체가 사용되도록 하려면 미니 배치 크기가 훈련 샘플 개수를 균등하게 나누도록 설정하십시오.

이 예제에서는 InitialLearnRate0.0001로 설정하고 ValidationFrequency5로 설정하고 MaxEpochs8로 설정합니다. 55개의 관측값이 있으므로 훈련 데이터를 균등하게 나누고 매 Epoch마다 데이터 세트 전체가 사용되도록 MiniBatchSize를 11로 설정합니다. 훈련 옵션 선택에 대한 자세한 내용은 trainingOptions 항목을 참조하십시오.

지정된 훈련 옵션을 사용하여 신경망을 훈련시키려면 닫기를 클릭하고 훈련을 클릭하십시오.

심층 신경망 디자이너에서는 훈련 진행 상황을 시각화하고 모니터링할 수 있습니다. 그런 다음 필요한 경우 훈련 옵션을 편집하여 신경망을 다시 훈련시킬 수 있습니다.

결과를 내보내고 MATLAB 코드 생성하기

훈련된 가중치와 함께 신경망 아키텍처를 내보내려면 훈련 탭에서 내보내기 > 훈련된 신경망 및 결과 내보내기를 선택하십시오. 심층 신경망 디자이너가 훈련된 신경망을 변수 trainedNetwork_1로 내보내고 훈련 정보를 변수 trainInfoStruct_1로 내보냅니다.

trainInfoStruct_1
trainInfoStruct_1 = struct with fields:
               TrainingLoss: [1×40 double]
           TrainingAccuracy: [1×40 double]
             ValidationLoss: [4.8267 NaN NaN NaN 2.1034 NaN NaN NaN NaN 1.2332 NaN NaN NaN NaN 0.6614 NaN NaN NaN NaN 0.4312 NaN NaN NaN NaN 0.2878 NaN NaN NaN NaN 0.2472 NaN NaN NaN NaN 0.2647 NaN NaN NaN NaN 0.2893]
         ValidationAccuracy: [10 NaN NaN NaN 10 NaN NaN NaN NaN 40 NaN NaN NaN NaN 80 NaN NaN NaN NaN 90 NaN NaN NaN NaN 95 NaN NaN NaN NaN 95 NaN NaN NaN NaN 95 NaN NaN NaN NaN 95]
              BaseLearnRate: [1×40 double]
        FinalValidationLoss: 0.2893
    FinalValidationAccuracy: 95

신경망과 사용된 훈련 옵션을 다시 만들어 주는 MATLAB 코드를 생성할 수도 있습니다. 훈련 탭에서 내보내기 > 훈련에 사용할 코드 생성을 선택합니다. MATLAB 코드를 검토하여 훈련을 위해 프로그래밍 방식으로 데이터를 준비하고 신경망 아키텍처를 만들고 신경망을 훈련시키는 방법을 살펴봅니다.

새 영상 분류하기

훈련된 신경망을 사용하여 분류할 새 영상을 불러옵니다.

I = imread("MerchDataTest.jpg");

심층 신경망 디자이너가 신경망 입력 크기와 일치하도록 훈련 중에 영상의 크기를 조정합니다. 신경망 입력 크기를 보려면 디자이너 창에서 imageInputLayer(첫 번째 계층)를 선택하십시오. 이 신경망의 입력 크기는 227x227입니다.

신경망 입력 크기와 일치하도록 테스트 영상의 크기를 조정합니다.

I = imresize(I, [227 227]);

훈련된 신경망을 사용하여 테스트 영상을 분류합니다.

[YPred,probs] = classify(trainedNetwork_1,I);
imshow(I)
label = YPred;
title(string(label) + ", " + num2str(100*max(probs),3) + "%");

참고 항목

관련 항목