alexnet
AlexNet 컨벌루션 신경망

설명
AlexNet은 8개 계층으로 구성된 컨벌루션 신경망입니다. ImageNet 데이터베이스의 1백만 개가 넘는 영상에 대해 훈련된 신경망의 사전 훈련된 버전을 불러올 수 있습니다 [1]. 사전 훈련된 신경망은 영상을 키보드, 마우스, 연필, 각종 동물 등 1,000가지 사물 범주로 분류할 수 있습니다. 그 결과 이 신경망은 다양한 영상을 대표하는 다양한 특징을 학습했습니다. 신경망의 영상 입력 크기는 227×227입니다. MATLAB®의 여타 훈련된 신경망에 대한 자세한 내용은 사전 훈련된 심층 신경망 항목을 참조하십시오.
AlexNet 신경망을 사용하여 classify
로 새 영상을 분류할 수 있습니다. GoogLeNet을 사용하여 영상 분류하기 항목의 단계를 따르되 GoogLeNet을 AlexNet으로 바꾸어서 수행하십시오.
Deep Learning Onramp에서는 실용적인 딥러닝 기법들을 실습을 통해 무료로 소개합니다.
은 ImageNet 데이터 세트에서 훈련된 AlexNet 신경망을 반환합니다.net
= alexnet
이 함수를 사용하려면 Deep Learning Toolbox™ Model for AlexNet Network 지원 패키지가 필요합니다. 이 지원 패키지가 설치되어 있지 않으면 함수에서 다운로드 링크를 제공합니다. 또는 Deep Learning Toolbox Model for AlexNet Network를 참조하십시오.
MATLAB의 여타 훈련된 신경망에 대한 자세한 내용은 사전 훈련된 심층 신경망 항목을 참조하십시오.
은 ImageNet 데이터 세트에서 훈련된 AlexNet 신경망을 반환합니다. 이 구문은 net
= alexnet('Weights','imagenet'
)net = alexnet
과 동일합니다.
은 훈련되지 않은 AlexNet 신경망 아키텍처를 반환합니다. 훈련되지 않은 모델에는 지원 패키지가 필요하지 않습니다.layers
= alexnet('Weights','none'
)
예제
AlexNet 지원 패키지 다운로드하기
Deep Learning Toolbox Model for AlexNet Network 지원 패키지를 다운로드하고 설치합니다.
명령줄에 alexnet
을 입력합니다.
alexnet
Deep Learning Toolbox Model for AlexNet Network 지원 패키지가 설치되어 있지 않은 경우, 필요한 지원 패키지로 연결되는 애드온 탐색기 링크를 함수에서 제공합니다. 지원 패키지를 설치하려면 링크를 클릭한 다음 설치를 클릭하십시오. 명령줄에 alexnet
을 입력하여 설치가 성공적으로 완료되었는지 확인하십시오.
alexnet
ans = SeriesNetwork with properties: Layers: [25×1 nnet.cnn.layer.Layer]
필요한 지원 패키지가 설치되어 있는 경우, 함수가 SeriesNetwork
객체를 반환합니다.
심층 신경망 디자이너를 사용하여 신경망을 시각화합니다.
deepNetworkDesigner(alexnet)
새로 만들기를 클릭하여 심층 신경망 디자이너에서 사전 훈련된 다른 신경망을 살펴봅니다.
신경망을 다운로드해야 할 경우에는 원하는 신경망에서 잠시 멈추고 설치를 클릭하여 애드온 탐색기를 엽니다.
AlexNet을 사용한 전이 학습
이 예제에서는 사전 훈련된 AlexNet 컨벌루션 신경망이 새로운 영상 모음에 대해 분류를 수행하도록 미세 조정하는 방법을 보여줍니다.
1백만 개가 넘는 영상에 대해 훈련된 AlexNet은 영상을 키보드, 커피 머그잔, 연필, 각종 동물 등 1,000가지 사물 범주로 분류할 수 있습니다. 이 신경망은 다양한 영상을 대표하는 다양한 특징을 학습했습니다. 이 신경망은 영상을 입력값으로 받아서 영상에 있는 사물에 대한 레이블과 각 사물 범주의 확률을 출력합니다.
전이 학습은 딥러닝 응용 분야에서 널리 사용됩니다. 사전 훈련된 신경망을 새로운 작업을 학습하기 위한 출발점으로 사용할 수 있습니다. 전이 학습으로 신경망을 미세 조정하는 것은 무작위로 초기화된 가중치를 사용하여 신경망을 처음부터 훈련시키는 것보다 일반적으로 훨씬 더 빠르고 쉽습니다. 학습된 특징을 보다 적은 개수의 훈련 영상을 사용하여 새로운 작업으로 빠르게 전이할 수 있습니다.
데이터 불러오기
새 영상의 압축을 풀고 영상 데이터저장소로 불러옵니다. imageDatastore
는 폴더 이름을 기준으로 영상에 자동으로 레이블을 지정하고 데이터를 ImageDatastore
객체로 저장합니다. 영상 데이터저장소를 사용하면 메모리에 담을 수 없는 데이터를 포함하여 다량의 영상 데이터를 저장할 수 있고 컨벌루션 신경망 훈련 중에 영상 배치를 효율적으로 읽어 들일 수 있습니다.
unzip('MerchData.zip'); imds = imageDatastore('MerchData', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames');
데이터를 훈련 데이터 세트와 검증 데이터 세트로 나눕니다. 영상의 70%를 훈련용으로 사용하고 30%를 검증용으로 사용합니다. splitEachLabel
은 images
데이터저장소를 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)
첫 번째 계층인 영상 입력 계층에 입력되는 영상은 크기가 227×227×3이어야 합니다. 여기서 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];
신경망 훈련시키기
이 신경망의 입력 영상은 크기가 227×227×3이 되어야 하는데 영상 데이터저장소의 영상은 이와 다른 크기를 갖습니다. 증대 영상 데이터저장소를 사용하여 훈련 영상의 크기를 자동으로 조정합니다. 훈련 영상에 대해 추가로 수행할 증대 연산을 지정합니다. 즉, 세로 축을 따라 훈련 영상을 무작위로 뒤집고, 최대 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를 사용하고 그렇지 않은 경우에는 CPU를 사용합니다. GPU에서 훈련시키려면 Parallel Computing Toolbox™와 지원되는 GPU 장치가 필요합니다. 지원되는 장치에 대한 자세한 내용은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오. 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을 사용하여 영상을 읽어 들이고, 크기를 조정하고, 분류합니다. 먼저 사전 훈련된 AlexNet 모델을 불러옵니다.
net = alexnet;
imread
를 사용하여 영상을 읽어 들입니다.
I = imread('peppers.png');
figure
imshow(I)
사전 훈련된 모델을 사용하려면 영상 크기가 신경망의 입력 크기와 같아야 합니다. 신경망의 첫 번째 계층의 InputSize
속성을 사용하여 신경망의 입력 크기를 확인합니다.
sz = net.Layers(1).InputSize
sz = 1×3
227 227 3
영상의 크기를 신경망의 입력 크기에 맞게 조정합니다.
I = imresize(I,sz(1:2)); figure imshow(I)
classify
를 사용하여 영상을 분류합니다.
label = classify(net,I)
label = categorical
bell pepper
영상을 분류 결과와 함께 표시합니다.
figure imshow(I) title(label)
AlexNet을 사용하여 특징 추출하기
이 예제에서는 사전 훈련된 컨벌루션 신경망에서 학습된 영상 특징을 추출한 다음 추출한 특징을 사용하여 영상 분류기를 훈련시키는 방법을 보여줍니다. 특징 추출은 사전 훈련된 심층 신경망의 강력한 표현 기능을 가장 쉽고 빠르게 사용하는 방법입니다. 예를 들어, 추출된 특징에 대해 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); for i = 1:16 I{i} = readimage(imdsTrain,idx(i)); end figure imshow(imtile(I))
사전 훈련된 신경망 불러오기
사전 훈련된 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] 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' Grouped Convolution 2 groups of 128 5x5x48 convolutions with stride [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] and padding [1 1 1 1] 11 'relu3' ReLU ReLU 12 'conv4' Grouped Convolution 2 groups of 192 3x3x192 convolutions with stride [1 1] and padding [1 1 1 1] 13 'relu4' ReLU ReLU 14 'conv5' Grouped Convolution 2 groups of 128 3x3x192 convolutions with stride [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
첫 번째 계층인 영상 입력 계층에 입력되는 영상은 크기가 227×227×3이어야 합니다. 여기서 3은 색 채널의 개수입니다.
inputSize = net.Layers(1).InputSize
inputSize = 1×3
227 227 3
영상 특징 추출하기
신경망은 입력 영상에 대한 계층 표현을 생성합니다. 보다 심층의 계층에는 앞쪽 계층의 하위 수준 특징을 사용하여 생성한 상위 수준의 특징이 포함됩니다. 훈련 영상과 테스트 영상의 특징 표현을 가져오려면 완전 연결 계층 'fc7'
에서 activations
를 사용하십시오. 영상의 하위 수준 표현을 가져오려면 신경망의 앞쪽 계층을 사용하십시오.
이 신경망의 입력 영상은 크기가 227×227×3이 되어야 하는데 영상 데이터저장소의 영상은 이와 다른 크기를 갖습니다. 신경망에 입력하기 전에 훈련 영상과 테스트 영상의 크기를 자동으로 조정하려면 증대 영상 데이터저장소를 만들고 원하는 영상 크기를 지정한 다음 이러한 데이터저장소를 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)을 피팅합니다.
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은 높은 정확도를 갖습니다. 특징 추출을 사용했을 때의 정확도가 충분히 높지 않다면 그 대신 전이 학습을 사용해 보십시오.
출력 인수
net
— 사전 훈련된 AlexNet 컨벌루션 신경망
SeriesNetwork
객체
사전 훈련된 AlexNet 컨벌루션 신경망으로, SeriesNetwork
객체로 반환됩니다.
layers
— 훈련되지 않은 AlexNet 컨벌루션 신경망 아키텍처
Layer
배열
훈련되지 않은 AlexNet 컨벌루션 신경망 아키텍처로, Layer
배열로 반환됩니다.
팁
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
확장 기능
C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.
코드 생성을 하려면, 구문 net = alexnet
을 사용하거나 coder.loadDeepLearningNetwork
(MATLAB Coder)로 alexnet
함수를 전달하여 신경망을 불러올 수 있습니다. 예: net = coder.loadDeepLearningNetwork('alexnet')
자세한 내용은 Load Pretrained Networks for Code Generation (MATLAB Coder) 항목을 참조하십시오.
코드 생성에는 alexnet('Weights','none')
구문이 지원되지 않습니다.
GPU 코드 생성
GPU Coder™를 사용하여 NVIDIA® GPU용 CUDA® 코드를 생성할 수 있습니다.
사용법 관련 참고 및 제한 사항:
코드 생성을 하려면, 구문
net = alexnet
을 사용하거나coder.loadDeepLearningNetwork
(GPU Coder)로alexnet
함수를 전달하여 신경망을 불러올 수 있습니다. 예:net = coder.loadDeepLearningNetwork('alexnet')
자세한 내용은 Load Pretrained Networks for Code Generation (GPU Coder) 항목을 참조하십시오.
GPU 코드 생성에는
alexnet('Weights','none')
구문이 지원되지 않습니다.
버전 내역
R2017a에 개발됨
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)