Main Content

전이 학습 시작하기

이 예제에서는 심층 신경망 디자이너를 사용하여 전이 학습을 위한 신경망을 준비하는 방법을 보여줍니다.

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

영상 데이터 불러오기

작업 공간에서 MathWorks® Merch 데이터 세트를 추출합니다. 이 데이터에 액세스하려면 예제를 라이브 스크립트로 여십시오. 이 소규모 데이터 세트에는 5개의 클래스(cap, cube, playing cards, screwdriver, torch)에 속하는 MathWorks 기념품 75개의 영상이 포함되어 있습니다.

folderName = "MerchData";
unzip("MerchData.zip",folderName);

영상 데이터저장소를 만듭니다. 영상 데이터저장소를 사용하면 메모리에 담을 수 없는 데이터를 포함하여 다량의 영상 데이터 모음을 저장할 수 있고 신경망 훈련 중에 영상 배치를 효율적으로 읽어 들일 수 있습니다. 추출된 영상이 있는 폴더를 지정하고 하위 폴더 이름이 영상 레이블에 대응됨을 표시합니다.

imds = imageDatastore(folderName, ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

샘플 영상 몇 개를 표시합니다.

numImages = numel(imds.Labels);
idx = randperm(numImages,16);
I = imtile(imds,Frames=idx);
figure
imshow(I)

클래스 이름과 클래스 개수를 추출합니다.

classNames = categories(imds.Labels);
numClasses = numel(classNames);

데이터를 훈련 데이터 세트, 검증 데이터 세트, 테스트 데이터 세트로 분할합니다. 영상의 70%는 훈련용, 15%는 검증용, 15%는 테스트용으로 사용합니다. splitEachLabel 함수는 영상 데이터저장소를 3개의 새로운 데이터저장소로 분할합니다.

[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,0.7,0.15,0.15,"randomized");

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

사전 훈련된 신경망을 새로운 작업에 맞게 조정하려면 심층 신경망 디자이너 앱을 사용하십시오.

deepNetworkDesigner

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

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

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

SqueezeNet이 새 영상을 분류하도록 다시 훈련시키려면 신경망의 마지막 2차원 컨벌루션 계층인 conv10을 편집하십시오.

디자이너 창에서 conv10 계층을 선택합니다. 속성 창 하단에서 계층 잠금 해제를 클릭합니다. 나타나는 경고 대화 상자에서 무시하고 잠금 해제를 클릭합니다. 이렇게 하면 계층 속성의 잠금이 해제되어 새 작업에 맞게 계층 속성을 조정할 수 있습니다.

NumFilters 속성에서 클래스 개수를 새로 설정합니다(이 예제에서는 5). 전이된 계층보다 새 계층에서 학습이 더 빨리 이루어지도록 WeightLearnRateFactorBiasLearnRateFactor10으로 설정하여 학습률을 변경합니다.

신경망이 훈련 준비가 되었는지 확인하려면 분석을 클릭하십시오. 딥러닝 신경망 분석기에 보고되는 오류나 경고가 없으므로 신경망이 훈련할 준비가 된 것입니다. 신경망을 내보내기 위해 내보내기를 클릭합니다. 앱은 신경망을 변수 net_1에 저장합니다.

훈련 옵션 지정하기

훈련 옵션을 지정합니다. 옵션 중에서 선택하려면 경험적 분석이 필요합니다. 실험을 실행하여 다양한 훈련 옵션 구성을 살펴보려면 실험 관리자 앱을 사용합니다.

options = trainingOptions("adam", ...
    ValidationData=imdsValidation, ...
    ValidationFrequency=5, ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=false);

신경망 훈련시키기

trainnet 함수를 사용하여 신경망을 훈련시킵니다. 분류가 목적이므로 교차 엔트로피 손실을 사용합니다.

net = trainnet(imdsTrain,net_1,"crossentropy",options);

신경망 테스트하기

테스트 영상을 분류합니다. 여러 개의 관측값을 사용하여 예측을 수행하려면 minibatchpredict 함수를 사용합니다. 예측 점수를 레이블로 변환하려면 scores2label 함수를 사용합니다. minibatchpredict 함수는 GPU를 사용할 수 있으면 자동으로 GPU를 사용합니다.

inputSize = net.Layers(1).InputSize(1:2);

augimdsTrain = augmentedImageDatastore(inputSize,imdsTest);

YTest = minibatchpredict(net,imdsTest);
YTest = scores2label(YTest,classNames);

분류 정확도를 혼동 차트로 시각화합니다.

TTest = imdsTest.Labels;
figure
confusionchart(TTest,YTest);

새 영상 분류하기

테스트 영상을 분류합니다. JPEG 파일에서 영상을 읽어 들이고 크기를 조정한 다음 single 데이터형으로 변환합니다.

im = imread("MerchDataTest.jpg");

im = imresize(im,inputSize(1:2));
X = single(im);

영상을 분류합니다. 하나의 관측값을 사용하여 예측을 수행하려면 predict 함수를 사용하십시오.

scores = predict(net,X);
[label,score] = scores2label(scores,classNames);

영상을 예측 레이블 및 그에 대응되는 점수와 함께 표시합니다.

figure
imshow(im)
title(string(label) + " (Score: " + gather(score) + ")")

전이 학습과 신경망의 성능을 향상시키는 방법에 대한 자세한 내용은 Retrain Neural Network to Classify New Images 항목을 참조하십시오.

참고 문헌

[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.

참고 항목

| | | |

관련 항목