Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

전이 학습 시작하기

이 예제에서는 사전 훈련된 컨벌루션 신경망인 SqueezeNet이 새로운 영상 세트를 분류하도록 전이 학습을 사용하여 다시 훈련시키는 방법을 보여줍니다. 이 예제를 통해 MATLAB®에서 딥러닝을 사용하는 것이 얼마나 간단한지 알 수 있습니다.

전이 학습은 딥러닝 응용 분야에서 널리 사용됩니다. 사전 훈련된 신경망을 새로운 작업을 학습하기 위한 출발점으로 사용할 수 있습니다. 전이 학습으로 신경망을 미세 조정하는 것은 무작위로 초기화된 가중치를 사용하여 신경망을 처음부터 훈련시키는 것보다 일반적으로 훨씬 더 빠르고 쉽습니다. 학습된 특징을 보다 적은 개수의 훈련 영상을 사용하여 새로운 작업으로 빠르게 전이할 수 있습니다.

데이터 추출하기

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

unzip("MerchData.zip");

사전 훈련된 신경망 불러오기

심층 신경망 디자이너를 엽니다.

deepNetworkDesigner

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

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

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

데이터 가져오기

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

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

데이터를 70%의 훈련 데이터와 30%의 검증 데이터로 나눕니다.

훈련 영상에 대해 수행할 증대 연산을 지정합니다. 데이터 증대는 신경망이 과적합되는 것을 방지하고 훈련 영상의 정확한 세부 정보가 기억되지 않도록 하는 데 도움이 됩니다. 이 예제에서는 x축에서 무작위 반사를 적용하고, [-90,90]도에서 무작위 회전을 적용하고, [1,2] 범위에서 무작위 재스케일링을 적용합니다.

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

전이 학습을 위해 신경망 편집하기

SqueezeNet이 새 영상을 분류하도록 다시 훈련시키려면 신경망의 마지막 2차원 컨벌루션 계층과 마지막 분류 계층을 바꾸십시오. SqueezeNet에서 이러한 계층의 이름은 각각 'conv10''ClassificationLayer_predictions'입니다.

디자이너 창에서 새 convolution2dLayer를 캔버스로 끌어서 놓습니다. 원래 컨벌루션 계층과 일치하도록 FilterSize1,1로 설정합니다. NumFilters를 새 데이터의 클래스 개수(이 예제에서는 5)로 편집합니다.

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

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

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

신경망 훈련시키기

훈련 옵션을 선택하려면 훈련 탭을 선택하고 훈련 옵션을 클릭하십시오. 전이된 계층의 학습을 늦추려면 초기 학습률을 작은 값으로 설정하십시오. 이전 단계에서는 새로운 마지막 계층의 학습 속도를 높이기 위해 2차원 컨벌루션 계층의 학습률 인자를 증가시켰습니다. 이러한 조합으로 학습률을 설정하면 새로운 계층에서는 학습이 빨라지고 나머지 계층에서는 학습이 느려집니다.

이 예제에서는 InitialLearnRate0.0001로, ValidationFrequency5로, MaxEpochs8로 설정합니다. 55개의 관측값이 있으므로 매 Epoch마다 데이터 세트 전체가 사용되도록 MiniBatchSize11로 설정하여 훈련 데이터를 균등하게 나눕니다.

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

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

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

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

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

새 영상 분류하기

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

I = imread("MerchDataTest.jpg");

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

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

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

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

참고 문헌

[1] ImageNet. http://www.image-net.org

[2] Iandola, Forrest N., Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, and Kurt Keutzer. "SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5 MB model size." Preprint, submitted November 4, 2016. https://arxiv.org/abs/1602.07360.

[3] Iandola, Forrest N. "SqueezeNet." https://github.com/forresti/SqueezeNet.

참고 항목

| | |

관련 항목