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

alexnet

사전 훈련된 AlexNet 컨벌루션 신경망

AlexNet은 ImageNet 데이터베이스의 1백만 개가 넘는 이미지에 대해 훈련된 컨벌루션 신경망입니다[1]. 이 네트워크에는 8개의 계층이 있으며, 이미지를 키보드, 마우스, 연필, 각종 동물 등 1,000가지 사물 범주로 분류할 수 있습니다. 그 결과 이 네트워크는 다양한 이미지를 대표하는 다양한 특징을 학습했습니다. 네트워크의 이미지 입력 크기는 227x227입니다. MATLAB®의 여타 훈련된 네트워크에 대한 자세한 내용은 Pretrained Deep Neural Networks 항목을 참조하십시오.

classify로 AlexNet 네트워크를 사용하여 새로운 이미지를 분류할 수 있습니다. GoogLeNet을 사용하여 이미지 분류하기 항목의 단계를 따르되 GoogLeNet을 AlexNet으로 바꾸어서 수행하십시오.

Deep Learning Onramp에서는 실용적인 심층 학습 기법들을 실습을 통해 무료로 소개합니다.

구문

net = alexnet

설명

예제

net = alexnet은 사전 훈련된 AlexNet 네트워크를 반환합니다.

이 함수를 사용하려면 Deep Learning Toolbox™ Model for AlexNet 지원 패키지가 필요합니다. 이 지원 패키지가 설치되어 있지 않으면 함수에서 다운로드 링크를 제공합니다. 또는 Deep Learning Toolbox Modelfor AlexNet을 참조하십시오.

MATLAB의 여타 훈련된 네트워크에 대한 자세한 내용은 Pretrained Deep Neural Networks 항목을 참조하십시오.

예제

모두 축소

Deep Learning Toolbox Model for AlexNet Network 지원 패키지를 다운로드하고 설치합니다.

명령줄에 alexnet을 입력합니다.

alexnet

Deep Learning Toolbox Model for AlexNet Network 지원 패키지가 설치되어 있지 않은 경우, 애드온 탐색기의 필요한 지원 패키지로 연결되는 링크를 함수에서 제공합니다. 지원 패키지를 설치하려면 링크를 클릭한 다음 설치(Install)를 클릭하십시오. 명령줄에 alexnet을 입력하여 설치가 성공적으로 완료되었는지 확인합니다.

alexnet
ans = 

  SeriesNetwork with properties:

    Layers: [25×1 nnet.cnn.layer.Layer]

필요한 지원 패키지가 설치되어 있는 경우, 함수가 SeriesNetwork 객체를 반환합니다.

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

사전 훈련된 네트워크 불러오기

사전 훈련된 AlexNet 네트워크를 불러옵니다. 네트워크를 다운로드해야 할 경우에는 다운로드 링크를 사용하십시오.

net = alexnet;

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

심층 네트워크 디자이너를 열려면 다음을 입력하십시오.

deepNetworkDesigner

가져오기를 클릭하고 작업 공간에서 네트워크를 선택합니다. 심층 네트워크 디자이너에 전체 네트워크의 축소된 형태가 표시됩니다. 네트워크 플롯을 살펴봅니다. 마우스를 사용하여 확대하려면 Ctrl+스크롤 휠을 사용하십시오.

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

사전 훈련된 네트워크가 새 이미지를 분류하도록 다시 훈련시키려면 마지막 계층들을 새로운 데이터 세트에 적응된 새로운 계층들로 교체하십시오. 데이터에 맞도록 클래스의 개수를 변경해야 합니다.

계층 팔레트에서 캔버스로 새 FullyConnectedLayer를 끌어서 놓습니다. OutputSize를 새 데이터의 클래스 개수(이 예제에서는 5)로 편집합니다.

전이된 계층보다 새 계층에서 학습이 더 빨리 이루어지도록 학습률을 편집합니다. WeightLearnRateFactorBiasLearnRateFactor를 10으로 설정합니다. 원래 계층을 삭제하고 대신 새 계층을 연결합니다.

출력 계층을 교체합니다. 계층 팔레트의 끝으로 스크롤한 다음, 캔버스로 새 ClassificationOutputLayer를 끌어서 놓습니다. 원래 output 계층을 삭제하고 대신 새 계층을 연결합니다.

네트워크 확인하기

편집한 네트워크가 훈련시킬 준비가 되었는지 확인하려면 분석을 클릭하고 심층 학습 네트워크 분석기에 보고되는 오류가 없는지 확인합니다.

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

심층 네트워크 디자이너로 돌아가서 내보내기를 클릭합니다. 심층 네트워크 디자이너가 편집된 네트워크 계층을 포함하는 새 변수 lgraph_1로 네트워크를 내보냅니다. 이제 trainNetwork 함수에 계층 변수를 입력할 수 있습니다.

데이터를 불러오고 네트워크 훈련시키기

새 이미지의 압축을 풀고 이미지 데이터저장소로 불러옵니다. 데이터를 70%의 훈련 데이터와 30%의 검증 데이터로 나눕니다.

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

사전 훈련된 네트워크의 입력 크기와 일치하도록 이미지의 크기를 조정합니다.

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

훈련 옵션을 지정합니다.

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

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

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

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

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

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

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

netTransfer = trainNetwork(imdsTrain,lgraph_1,options);

훈련된 네트워크 테스트하기

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

[YPred,probs] = classify(netTransfer,imdsValidation);
accuracy = mean(YPred == imdsValidation.Labels)
accuracy = 1

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

다른 사전 훈련된 네트워크에 대해 알아보고 사용해 보려면 심층 네트워크 디자이너 항목을 참조하십시오.

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

1백만 개가 넘는 이미지에 대해 훈련된 AlexNet은 이미지를 키보드, 커피 머그잔, 연필, 각종 동물 등 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);
figure
for i = 1:16
    subplot(4,4,i)
    I = readimage(imdsTrain,idx(i));
    imshow(I)
end

사전 훈련된 네트워크 불러오기

사전 훈련된 AlexNet 신경망을 불러옵니다. Deep Learning Toolbox™ Model for AlexNet Network가 설치되어 있지 않으면 이를 다운로드할 수 있는 링크가 제공됩니다. 1백만 개가 넘는 이미지에 대해 훈련된 AlexNet은 이미지를 키보드, 마우스, 연필, 각종 동물 등 1,000가지 사물 범주로 분류할 수 있습니다. 그 결과 이 모델은 다양한 이미지를 대표하는 다양한 특징을 학습했습니다.

net = alexnet;

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

analyzeNetwork(net)

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

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

   227   227     3

마지막 계층 바꾸기

사전 훈련된 네트워크 net의 마지막 세 계층은 1,000개의 클래스에 대해 구성되어 있습니다. 이 세 계층을 새로운 분류 문제에 맞게 미세 조정해야 합니다. 사전 훈련된 네트워크에서 마지막 3개를 제외한 모든 계층을 추출합니다.

layersTransfer = net.Layers(1:end-3);

마지막 세 계층을 완전 연결 계층, 소프트맥스 계층, 분류 출력 계층으로 바꾸어 계층을 새로운 분류 작업으로 전이합니다. 새로운 데이터에 따라 새로운 완전 연결 계층의 옵션을 지정합니다. 완전 연결 계층이 새로운 데이터의 클래스 개수와 동일한 크기를 갖도록 설정합니다. 전이된 계층보다 새로운 계층에서 학습이 빠르게 이루어지도록 하려면 완전 연결 계층의 WeightLearnRateFactor 값과BiasLearnRateFactor 값을 높이십시오.

numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
layers = [
    layersTransfer
    fullyConnectedLayer(numClasses,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20)
    softmaxLayer
    classificationLayer];

네트워크 훈련시키기

이 네트워크의 입력 이미지는 크기가 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회는 전체 훈련 데이터 세트에 대한 하나의 완전한 훈련 주기를 의미합니다. 미니 배치 크기와 검증 데이터를 지정합니다. 훈련 중에 ValidationFrequency번의 반복마다 네트워크가 검증됩니다.

options = trainingOptions('sgdm', ...
    'MiniBatchSize',10, ...
    'MaxEpochs',6, ...
    'InitialLearnRate',1e-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,layers,options);

검증 이미지 분류하기

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

[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)
accuracy = 1

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

AlexNet을 사용하여 이미지를 읽어 들이고, 크기를 조정하고, 분류합니다. 먼저 사전 훈련된 AlexNet 모델을 불러옵니다.

net = alexnet;

imread를 사용하여 이미지를 읽어 들입니다.

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

사전 훈련된 모델을 사용하려면 이미지 크기가 네트워크의 입력 크기와 같아야 합니다. 네트워크의 첫 번째 계층의 InputSize 속성을 사용하여 네트워크의 입력 크기를 확인합니다.

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

   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(char(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개의 검증 이미지가 있습니다. 샘플 이미지 몇 개를 표시합니다.

numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);
figure
for i = 1:16
    subplot(4,4,i)
    I = readimage(imdsTrain,idx(i));
    imshow(I)
end

사전 훈련된 네트워크 불러오기

사전 훈련된 AlexNet 네트워크를 불러옵니다. Deep Learning Toolbox Model for AlexNet Network 지원 패키지가 설치되어 있지 않으면 이를 다운로드할 수 있는 링크가 제공됩니다. 1백만 개가 넘는 이미지에 대해 훈련된 AlexNet은 이미지를 1,000가지 사물 범주로 분류할 수 있습니다. 키보드, 마우스, 연필, 각종 동물 등을 예로 들 수 있습니다. 그 결과 이 모델은 다양한 이미지를 대표하는 다양한 특징을 학습했습니다.

net = alexnet;

네트워크 아키텍처를 표시합니다. 이 네트워크는 5개의 컨벌루션 계층과 3개의 완전 연결 계층을 갖습니다.

net.Layers
ans = 
  25x1 Layer array with layers:

     1   'data'     Image Input                   227x227x3 images with 'zerocenter' normalization
     2   'conv1'    Convolution                   96 11x11x3 convolutions with stride [4  4], dilation factor [1  1] and padding [0  0  0  0]
     3   'relu1'    ReLU                          ReLU
     4   'norm1'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     5   'pool1'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     6   'conv2'    Convolution                   256 5x5x48 convolutions with stride [1  1], dilation factor [1  1] and padding [2  2  2  2]
     7   'relu2'    ReLU                          ReLU
     8   'norm2'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     9   'pool2'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    10   'conv3'    Convolution                   384 3x3x256 convolutions with stride [1  1], dilation factor [1  1] and padding [1  1  1  1]
    11   'relu3'    ReLU                          ReLU
    12   'conv4'    Convolution                   384 3x3x192 convolutions with stride [1  1], dilation factor [1  1] and padding [1  1  1  1]
    13   'relu4'    ReLU                          ReLU
    14   'conv5'    Convolution                   256 3x3x192 convolutions with stride [1  1], dilation factor [1  1] and padding [1  1  1  1]
    15   'relu5'    ReLU                          ReLU
    16   'pool5'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    17   'fc6'      Fully Connected               4096 fully connected layer
    18   'relu6'    ReLU                          ReLU
    19   'drop6'    Dropout                       50% dropout
    20   'fc7'      Fully Connected               4096 fully connected layer
    21   'relu7'    ReLU                          ReLU
    22   'drop7'    Dropout                       50% dropout
    23   'fc8'      Fully Connected               1000 fully connected layer
    24   'prob'     Softmax                       softmax
    25   'output'   Classification Output         crossentropyex with 'tench' and 999 other classes

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

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

   227   227     3

이미지 특징 추출하기

네트워크는 입력 이미지에 대한 계층 표현을 생성합니다. 보다 심층의 계층에는 앞쪽 계층의 하위 수준 특징을 사용하여 생성한 상위 수준의 특징이 포함됩니다. 훈련 이미지와 테스트 이미지의 특징 표현을 가져오려면 완전 연결 계층 'fc7'에서 activations를 사용하십시오. 이미지의 하위 수준 표현을 가져오려면 네트워크의 앞쪽 계층을 사용하십시오.

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

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

layer = 'fc7';
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)을 피팅합니다.

classifier = fitcecoc(featuresTrain,YTrain);

테스트 이미지 분류하기

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

YPred = predict(classifier,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(char(label))
end

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

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

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

출력 인수

모두 축소

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

세부 정보

모두 축소

필터 그룹

AlexNet의 원래 구현에서는 메모리가 제한된 GPU 2개에 걸쳐 네트워크를 분할하여 훈련시키기 위해 일부 컨벌루션 계층이 필터 그룹을 사용합니다.

이러한 계층에서는 필터가 두 그룹으로 분할됩니다. 계층은 채널 차원을 따라 입력값을 두 섹션으로 분할한 다음 각 섹션에 각 필터 그룹을 적용합니다. 그런 다음 결과로 나타나는 두 개의 섹션을 결합하여 출력값을 생성합니다.

예를 들어, AlexNet의 두 번째 컨벌루션 계층에서 계층은 가중치를 128개의 필터로 구성된 두 그룹으로 분할합니다. 각 필터는 48개의 채널을 갖습니다. 계층의 입력값은 96개의 채널을 가지며, 각각 48개의 채널을 갖는 두 개의 섹션으로 분할됩니다. 계층은 각 필터 그룹을 서로 다른 섹션에 적용하여 128개의 채널을 갖는 두 개의 출력값을 생성합니다. 그런 다음 두 개의 출력값을 결합하여 256개의 채널을 갖는 최종 출력값을 얻습니다.

최신 하드웨어에서 훈련된 네트워크(예: googlenetresnet50)에는 훈련 시 필터 그룹이 필요하지 않습니다.

  • Deep Learning Onramp에서는 실용적인 심층 학습 기법들을 실습을 통해 무료로 소개합니다.

참고 문헌

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

[2] Russakovsky, O., Deng, J., Su, H., et al. "ImageNet Large Scale Visual Recognition Challenge." International Journal of Computer Vision (IJCV). Vol 115, Issue 3, 2015, pp. 211–252

[3] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Advances in neural information processing systems. 2012.

[4] BVLC AlexNet Model. https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet

확장 기능

R2017a에 개발됨