Main Content

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

squeezenet

SqueezeNet 컨벌루션 신경망

설명

SqueezeNet은 18개 계층으로 구성된 컨벌루션 신경망입니다. ImageNet 데이터베이스의 1백만 개가 넘는 영상에 대해 훈련된 신경망의 사전 훈련된 버전을 불러올 수 있습니다 [1]. 사전 훈련된 신경망은 영상을 키보드, 마우스, 연필, 각종 동물 등 1,000가지 사물 범주로 분류할 수 있습니다. 그 결과 이 신경망은 다양한 영상을 대표하는 다양한 특징을 학습했습니다. 이 함수는 SqueezeNet v1.1 신경망을 반환합니다. 이 신경망은 SqueezeNet v1.0과 비슷한 정확도를 가지면서도 예측당 수행해야 하는 부동소수점 연산이 적습니다[3]. 신경망의 영상 입력 크기는 227x227입니다. MATLAB®의 여타 훈련된 신경망에 대한 자세한 내용은 사전 훈련된 심층 신경망 항목을 참조하십시오.

SqueezeNet 신경망을 사용하여 classify로 새 영상을 분류할 수 있습니다. 예제는 SqueezeNet을 사용하여 영상 분류하기 항목을 참조하십시오.

전이 학습을 사용하여 SqueezeNet 신경망이 새로운 작업을 수행하도록 다시 훈련시킬 수 있습니다. 예제는 SqueezeNet을 사용한 대화형 방식 전이 학습 항목을 참조하십시오.

예제

net = squeezenet은 ImageNet 데이터 세트에서 훈련된 SqueezeNet 신경망을 반환합니다.

net = squeezenet('Weights','imagenet')은 ImageNet 데이터 세트에서 훈련된 SqueezeNet 신경망을 반환합니다. 이 구문은 net = squeezenet과 동일합니다.

lgraph = squeezenet('Weights','none')은 훈련되지 않은 SqueezeNet 신경망 아키텍처를 반환합니다.

예제

모두 축소

사전 훈련된 SqueezeNet 신경망을 불러옵니다.

net = squeezenet
net = 

  DAGNetwork with properties:

         Layers: [68×1 nnet.cnn.layer.Layer]
    Connections: [75×2 table]

이 함수는 DAGNetwork 객체를 반환합니다.

SqueezeNet은 Deep Learning Toolbox™에 포함되어 있습니다. 다른 신경망을 불러오려면 googlenet과 같은 함수를 사용하여 애드온 탐색기에서 사전 훈련된 신경망을 다운로드하는 링크를 가져옵니다.

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

데이터 추출하기

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

unzip("MerchData.zip");

심층 신경망 디자이너에서 SqueezeNet 열기

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

deepNetworkDesigner

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

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

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

데이터 가져오기

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

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

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

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

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

데이터 시각화하기

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

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

신경망의 컨벌루션 계층은 마지막 학습 가능한 계층과 마지막 분류 계층이 입력 영상을 분류하는 데 사용하는 영상 특징을 추출합니다. SqueezeNet의 이 두 개의 계층 'conv10''ClassificationLayer_predictions'는 신경망이 추출하는 특징을 클래스 확률, 손실 값 및 예측된 레이블로 조합하는 방법에 대한 정보를 포함합니다. 사전 훈련된 신경망을 새로운 영상을 분류하도록 다시 훈련시키려면 이 두 계층을 새 데이터 세트에 맞게 조정된 새로운 계층으로 바꾸십시오.

대부분의 신경망에서, 학습 가능한 가중치를 갖는 마지막 계층은 완전 연결 계층입니다. SqueezeNet과 같은 일부 신경망에서는 학습 가능한 마지막 계층은 마지막 컨벌루션 계층이 됩니다. 이 경우 컨벌루션 계층을 필터의 개수가 클래스 개수와 같은 새로운 컨벌루션 계층으로 바꿉니다.

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

전이된 계층보다 새 계층에서 학습이 더 빨리 이루어지도록 WeightLearnRateFactorBiasLearnRateFactor 세트를 10으로 설정하여 학습률을 변경합니다. 마지막 2차원 컨벌루션 계층을 삭제하고 새로 추가한 계층을 대신 연결합니다.

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

신경망 확인하기

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

신경망 훈련시키기

훈련 옵션을 지정합니다. 훈련 탭을 선택하고 훈련 옵션을 클릭합니다.

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

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

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

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

이 예제에서는 InitialLearnRate0.0001로 설정하고 ValidationFrequency5로 설정하고 MaxEpochs8로 설정합니다. 55개의 관측값이 있으므로 MiniBatchSize를 11로 설정합니다.

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

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

결과를 내보내고 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) + "%");

이 예제에서는 사전 훈련된 SqueezeNet 컨벌루션 신경망이 새로운 영상 모음에 대해 분류를 수행하도록 미세 조정하는 방법을 보여줍니다.

1백만 개가 넘는 영상에 대해 훈련된 SqueezeNet은 영상을 키보드, 커피 머그잔, 연필, 각종 동물 등 1,000가지 사물 범주로 분류할 수 있습니다. 이 신경망은 다양한 영상을 대표하는 다양한 특징을 학습했습니다. 이 신경망은 영상을 입력값으로 받아서 영상에 있는 사물에 대한 레이블과 각 사물 범주의 확률을 출력합니다.

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

데이터 불러오기

새 영상의 압축을 풀고 영상 데이터저장소로 불러옵니다. imageDatastore는 폴더 이름을 기준으로 영상에 자동으로 레이블을 지정하고 데이터를 ImageDatastore 객체로 저장합니다. 영상 데이터저장소를 사용하면 메모리에 담을 수 없는 데이터를 포함하여 다량의 영상 데이터를 저장할 수 있고 컨벌루션 신경망 훈련 중에 영상 배치를 효율적으로 읽어 들일 수 있습니다.

unzip('MerchData.zip');
imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

데이터를 훈련 데이터 세트와 검증 데이터 세트로 나눕니다. 영상의 70%를 훈련용으로 사용하고 30%를 검증용으로 사용합니다. splitEachLabelimages 데이터저장소를 2개의 새로운 데이터저장소로 분할합니다.

[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

이 매우 작은 데이터 세트에는 이제 55개의 훈련 영상과 20개의 검증 영상이 포함됩니다. 샘플 영상 몇 개를 표시합니다.

numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);

I = imtile(imds, 'Frames', idx);

figure
imshow(I)

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

사전 훈련된 SqueezeNet 신경망을 불러옵니다.

net = squeezenet;

analyzeNetwork를 사용하여 신경망 아키텍처에 대한 대화형 방식 시각화와 신경망 계층에 대한 상세한 정보를 표시합니다.

analyzeNetwork(net)

첫 번째 계층인 영상 입력 계층에 입력되는 영상은 크기가 227x227x3이어야 합니다. 여기서 3은 색 채널의 개수입니다.

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   227   227     3

마지막 계층 바꾸기

신경망의 컨벌루션 계층은 마지막 학습 가능한 계층과 마지막 분류 계층이 입력 영상을 분류하는 데 사용하는 영상 특징을 추출합니다. SqueezeNet의 이 두 개의 계층 'conv10''ClassificationLayer_predictions'는 신경망이 추출하는 특징을 클래스 확률, 손실 값 및 예측된 레이블로 조합하는 방법에 대한 정보를 포함합니다. 사전 훈련된 신경망을 새로운 영상을 분류하도록 다시 훈련시키려면 이 두 계층을 새 데이터 세트에 맞게 조정된 새로운 계층으로 바꾸십시오.

훈련된 신경망에서 계층 그래프를 추출합니다.

lgraph = layerGraph(net); 

바꿀 두 계층의 이름을 찾습니다. 이 작업은 수동으로 할 수도 있고 지원 함수 findLayersToReplace를 사용하여 계층을 자동으로 찾을 수도 있습니다.

[learnableLayer,classLayer] = findLayersToReplace(lgraph);
[learnableLayer,classLayer] 
ans = 
  1x2 Layer array with layers:

     1   'conv10'                            Convolution             1000 1x1x512 convolutions with stride [1  1] and padding [0  0  0  0]
     2   'ClassificationLayer_predictions'   Classification Output   crossentropyex with 'tench' and 999 other classes

대부분의 신경망에서, 학습 가능한 가중치를 갖는 마지막 계층은 완전 연결 계층입니다. SqueezeNet과 같은 일부 신경망에서는 학습 가능한 마지막 계층은 1x1 컨벌루션 계층이 됩니다. 이 경우 컨벌루션 계층을 필터의 개수가 클래스 개수와 같은 새로운 컨벌루션 계층으로 바꿉니다. 전이된 계층보다 새로운 계층에서 학습이 빠르게 이루어지도록 하려면 컨벌루션 계층의 WeightLearnRateFactor 값과 BiasLearnRateFactor 값을 높이십시오.

numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
newConvLayer =  convolution2dLayer([1, 1],numClasses,'WeightLearnRateFactor',10,'BiasLearnRateFactor',10,"Name",'new_conv');
lgraph = replaceLayer(lgraph,'conv10',newConvLayer);

분류 계층은 신경망의 출력 클래스를 지정합니다. 분류 계층을 클래스 레이블이 없는 새로운 계층으로 바꿉니다. trainNetwork는 훈련을 진행할 때 계층의 출력 클래스를 자동으로 설정합니다.

newClassificatonLayer = classificationLayer('Name','new_classoutput');
lgraph = replaceLayer(lgraph,'ClassificationLayer_predictions',newClassificatonLayer);

신경망 훈련시키기

이 신경망의 입력 영상은 크기가 227x227x3이 되어야 하는데 영상 데이터저장소의 영상은 이와 다른 크기를 갖습니다. 증대 영상 데이터저장소를 사용하여 훈련 영상의 크기를 자동으로 조정합니다. 훈련 영상에 대해 추가로 수행할 증대 연산을 지정합니다. 즉, 세로 축을 따라 훈련 영상을 무작위로 뒤집고, 최대 30개의 픽셀을 가로와 세로 방향으로 무작위로 평행 이동합니다. 데이터 증대는 신경망이 과적합되는 것을 방지하고 훈련 영상의 정확한 세부 정보가 기억되지 않도록 하는 데 도움이 됩니다.

pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...
    'DataAugmentation',imageAugmenter);

추가적인 데이터 증대를 수행하지 않고 검증 영상의 크기를 자동으로 조정하려면 증대 영상 데이터저장소를 추가적인 전처리 연산 지정 없이 사용하십시오.

augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

훈련 옵션을 지정합니다. 전이 학습을 위해, 사전 훈련된 신경망의 앞쪽 계층의 특징(전이된 계층 가중치)을 유지합니다. 전이된 계층의 학습을 늦추려면 초기 학습률을 작은 값으로 설정하십시오. 이전 단계에서는 새로운 마지막 계층의 학습 속도를 높이기 위해 컨벌루션 계층의 학습률 인자를 증가시켰습니다. 이러한 조합으로 학습률을 설정하면 새로운 계층에서는 학습이 빨라지고 나머지 계층에서는 학습이 느려집니다. 전이 학습을 수행할 때는 많은 횟수의 Epoch에 대해 훈련을 진행하지 않아도 됩니다. Epoch 1회는 전체 훈련 데이터 세트에 대한 하나의 완전한 훈련 주기를 의미합니다. 매 Epoch에서 모든 데이터가 고려되도록 미니 배치 크기를 11로 지정합니다. 훈련 중에 ValidationFrequency번의 반복마다 신경망이 검증됩니다.

options = trainingOptions('sgdm', ...
    'MiniBatchSize',11, ...
    'MaxEpochs',7, ...
    'InitialLearnRate',2e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose',false, ...
    'Plots','training-progress');

전이된 계층과 새로운 계층으로 구성된 신경망을 훈련시킵니다. 기본적으로 trainNetwork는 GPU를 사용할 수 있으면 GPU를 사용합니다(Parallel Computing Toolbox™와 Compute Capability 3.0 이상의 CUDA® 지원 GPU 필요). GPU를 사용할 수 없으면 CPU를 사용합니다. trainingOptions'ExecutionEnvironment' 이름-값 쌍 인수를 사용하여 실행 환경을 지정할 수도 있습니다.

netTransfer = trainNetwork(augimdsTrain,lgraph,options);
Warning: While copying object of class 'gpuArray':
'Out of memory on device. To view more detail about available memory on the GPU, use 'gpuDevice()'. If the problem persists, reset the GPU by calling 'gpuDevice(1)'.'
Warning: While copying object of class 'gpuArray':
'Out of memory on device. To view more detail about available memory on the GPU, use 'gpuDevice()'. If the problem persists, reset the GPU by calling 'gpuDevice(1)'.'
Warning: While copying object of class 'gpuArray':
'Out of memory on device. To view more detail about available memory on the GPU, use 'gpuDevice()'. If the problem persists, reset the GPU by calling 'gpuDevice(1)'.'
Warning: While copying object of class 'gpuArray':
'Out of memory on device. To view more detail about available memory on the GPU, use 'gpuDevice()'. If the problem persists, reset the GPU by calling 'gpuDevice(1)'.'

검증 영상 분류하기

미세 조정한 신경망을 사용하여 검증 영상을 분류합니다.

[YPred,scores] = classify(netTransfer,augimdsValidation);

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));
end

검증 세트에 대한 분류 정확도를 계산합니다. 정확도는 신경망이 올바르게 예측하는 레이블의 비율입니다.

YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)

분류 정확도를 높이기 위한 팁을 보려면 딥러닝 팁과 요령 항목을 참조하십시오.

SqueezeNet을 사용하여 영상을 읽어 들이고, 크기를 조정하고, 분류합니다.

먼저 사전 훈련된 SqueezeNet 모델을 불러옵니다.

net = squeezenet;

imread를 사용하여 영상을 읽어 들입니다.

I = imread('peppers.png');
figure
imshow(I)

사전 훈련된 모델을 사용하려면 영상 크기가 신경망의 입력 크기와 같아야 합니다. 신경망의 첫 번째 계층의 InputSize 속성을 사용하여 신경망의 입력 크기를 확인합니다.

sz = net.Layers(1).InputSize
sz = 1×3

   227   227     3

영상을 신경망의 입력 크기에 맞게 자릅니다. 또는 imresize를 사용하여 영상의 크기를 조정할 수도 있습니다.

I = I(1:sz(1),1:sz(2),1:sz(3));
figure
imshow(I)

classify를 사용하여 영상을 분류합니다.

label = classify(net,I)
label = categorical
     bell pepper 

영상을 분류 결과와 함께 표시합니다.

figure
imshow(I)
title(label)

이 예제에서는 사전 훈련된 컨벌루션 신경망에서 학습된 영상 특징을 추출한 다음 추출한 특징을 사용하여 영상 분류기를 훈련시키는 방법을 보여줍니다. 특징 추출은 사전 훈련된 심층 신경망의 강력한 표현 기능을 가장 쉽고 빠르게 사용하는 방법입니다. 예를 들어, 추출된 특징에 대해 fitcecoc(Statistics and Machine Learning Toolbox™)를 사용하여 서포트 벡터 머신(SVM)을 훈련시킬 수 있습니다. 특징 추출은 데이터를 한 번만 통과하면 되기 때문에 신경망 훈련을 가속할 GPU가 없을 때 시도할 수 있는 좋은 시작점이 됩니다.

데이터 불러오기

샘플 영상의 압축을 풀고 영상 데이터저장소로서 불러옵니다. imageDatastore는 폴더 이름을 기준으로 영상에 자동으로 레이블을 지정하고 데이터를 ImageDatastore 객체로 저장합니다. 영상 데이터저장소를 사용하면 메모리에 담을 수 없는 데이터를 포함하여 다량의 영상 데이터를 저장할 수 있습니다. 데이터를 훈련 데이터 70%와 테스트 데이터 30%로 분할합니다.

unzip('MerchData.zip');

imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

[imdsTrain,imdsTest] = splitEachLabel(imds,0.7,'randomized');

이 매우 작은 데이터 세트에는 이제 55개의 훈련 영상과 20개의 검증 영상이 있습니다. 샘플 영상 몇 개를 표시합니다.

numImagesTrain = numel(imdsTrain.Labels);
idx = randperm(numImagesTrain,16);

I = imtile(imds, 'Frames', idx);

figure
imshow(I)

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

사전 훈련된 SqueezeNet 신경망을 불러옵니다. 1백만 개가 넘는 영상에 대해 훈련된 SqueezeNet은 영상을 키보드, 마우스, 연필, 각종 동물 등 1,000가지 사물 범주로 분류할 수 있습니다. 그 결과 이 모델은 다양한 영상을 대표하는 다양한 특징을 학습했습니다.

net = squeezenet;

신경망 아키텍처를 분석합니다.

analyzeNetwork(net)

첫 번째 계층인 영상 입력 계층에 입력되는 영상은 크기가 227x227x3이어야 합니다. 여기서 3은 색 채널의 개수입니다.

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   227   227     3

영상 특징 추출하기

신경망은 입력 영상에 대한 계층 표현을 생성합니다. 보다 심층의 계층에는 앞쪽 계층의 하위 수준 특징을 사용하여 생성한 상위 수준의 특징이 포함됩니다. 훈련 영상과 테스트 영상의 특징 표현을 가져오려면 전역 평균값 풀링 계층 'pool10'에서 activations를 사용하십시오. 영상의 하위 수준 표현을 가져오려면 신경망의 앞쪽 계층을 사용하십시오.

이 신경망의 입력 영상은 크기가 227x227x3이 되어야 하는데 영상 데이터저장소의 영상은 이와 다른 크기를 갖습니다. 신경망에 입력하기 전에 훈련 영상과 테스트 영상의 크기를 자동으로 조정하려면 증대 영상 데이터저장소를 만들고 원하는 영상 크기를 지정한 다음 이러한 데이터저장소를 activations에 대한 입력 인수로 사용하십시오.

augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);

layer = 'pool10';
featuresTrain = activations(net,augimdsTrain,layer,'OutputAs','rows');
featuresTest = activations(net,augimdsTest,layer,'OutputAs','rows');

훈련 데이터와 테스트 데이터로부터 클래스 레이블을 추출합니다.

YTrain = imdsTrain.Labels;
YTest = imdsTest.Labels;

영상 분류기 피팅하기

훈련 영상으로부터 추출한 특징을 예측 변수로 사용하고 fitcecoc(Statistics and Machine Learning Toolbox)를 사용하여 다중클래스 서포트 벡터 머신(SVM)을 피팅합니다.

mdl = fitcecoc(featuresTrain,YTrain);

테스트 영상 분류하기

훈련된 SVM 모델과 테스트 영상으로부터 추출한 특징을 사용하여 테스트 영상을 분류합니다.

YPred = predict(mdl,featuresTest);

4개의 샘플 테스트 영상을 예측된 레이블과 함께 표시합니다.

idx = [1 5 10 15];
figure
for i = 1:numel(idx)
    subplot(2,2,i)
    I = readimage(imdsTest,idx(i));
    label = YPred(idx(i));
    
    imshow(I)
    title(label)
end

테스트 세트에 대한 분류 정확도를 계산합니다. 정확도는 신경망이 올바르게 예측하는 레이블의 비율입니다.

accuracy = mean(YPred == YTest)
accuracy = 1

이 SVM은 높은 정확도를 갖습니다. 특징 추출을 사용했을 때의 정확도가 충분히 높지 않다면 그 대신 전이 학습을 사용해 보십시오.

출력 인수

모두 축소

사전 훈련된 SqueezeNet 컨벌루션 신경망으로, DAGNetwork 객체로 반환됩니다.

훈련되지 않은 SqueezeNet 컨벌루션 신경망 아키텍처로, LayerGraph 객체로 반환됩니다.

참고 문헌

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

확장 기능

R2018a에 개발됨