Main Content

resnet18

ResNet-18 컨벌루션 신경망

  • ResNet-18 network architecture

설명

ResNet-18은 18개 계층으로 구성된 컨벌루션 신경망입니다. ImageNet 데이터베이스의 1백만 개가 넘는 영상에 대해 훈련된 신경망의 사전 훈련된 버전을 불러올 수 있습니다 [1]. 사전 훈련된 신경망은 영상을 키보드, 마우스, 연필, 각종 동물 등 1,000가지 사물 범주로 분류할 수 있습니다. 그 결과 이 신경망은 다양한 영상을 대표하는 다양한 특징을 학습했습니다. 신경망의 영상 입력 크기는 224×224입니다. MATLAB®의 여타 훈련된 신경망에 대한 자세한 내용은 사전 훈련된 심층 신경망 항목을 참조하십시오.

ResNet-18 모델을 사용하여 classify로 새 영상을 분류할 수 있습니다. GoogLeNet을 ResNet-18로 바꾸어서 GoogLeNet을 사용하여 영상 분류하기 항목의 단계를 수행하십시오.

새로운 분류 작업에서 신경망을 다시 훈련시키려면 새로운 영상을 분류하도록 딥러닝 신경망 훈련시키기 항목의 단계를 수행하고 GoogLeNet 대신 ResNet-18을 불러오십시오.

영상 분류 작업에 적합한 훈련되지 않은 잔차 신경망을 만들려면 resnetLayers를 사용하십시오.

예제

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

이 함수를 사용하려면 Deep Learning Toolbox™ Model for ResNet-18 Network 지원 패키지가 필요합니다. 이 지원 패키지가 설치되어 있지 않으면 함수에서 다운로드 링크를 제공합니다.

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

lgraph = resnet18('Weights','none')은 훈련되지 않은 ResNet-18 신경망 아키텍처를 반환합니다. 훈련되지 않은 모델에는 지원 패키지가 필요하지 않습니다.

예제

모두 축소

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

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

resnet18

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

resnet18
ans = 

  DAGNetwork with properties:

         Layers: [72×1 nnet.cnn.layer.Layer]
    Connections: [79×2 table]

심층 신경망 디자이너를 사용하여 신경망을 시각화합니다.

deepNetworkDesigner(resnet18)

새로 만들기를 클릭하여 심층 신경망 디자이너에서 사전 훈련된 다른 신경망을 살펴봅니다.

Deep Network Designer start page showing available pretrained neural networks

신경망을 다운로드해야 할 경우에는 원하는 신경망에서 잠시 멈추고 설치를 클릭하여 애드온 탐색기를 엽니다.

사전 훈련된 ResNet-18 모델을 불러옵니다.

net = resnet18;

imread를 사용하여 테스트 영상을 읽습니다.

I = imread("peppers.png");
imshow(I)

Figure contains an axes object. The axes object contains an object of type image.

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

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

   224   224     3

영상의 크기를 신경망의 입력 크기에 맞게 조정합니다.

I = imresize(I,sz(1:2));

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

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

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

imshow(I)
title(label)

Figure contains an axes object. The axes object with title bell pepper contains an object of type image.

작업 공간에서 MathWorks Merch 데이터 세트를 추출합니다.

unzip("MerchData.zip");

사용 가능한 사전 훈련된 신경망을 보려면 심층 신경망 디자이너 항목을 여십시오.

deepNetworkDesigner

ResNet-18을 선택하고 열기를 클릭합니다. Deep Learning Toolbox™ Model for ResNet-18 Network가 설치되어 있지 않으면 애드온 탐색기가 열립니다.

심층 신경망 디자이너로 데이터를 불러오려면 데이터 탭에서 데이터 가져오기 > 영상 분류 데이터 가져오기를 클릭하십시오. 데이터 소스 목록에서 폴더를 선택합니다. 찾아보기를 클릭하고 추출된 MerchData 폴더를 선택합니다.

데이터를 훈련 데이터 세트와 검증 데이터 세트로 나눕니다. 영상의 70%를 훈련용으로 사용하고 30%를 검증용으로 사용합니다. 무작위 분할을 선택하여 지정된 비율의 영상을 검증 세트와 훈련 세트에 무작위로 할당합니다.

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

앱에 가져온 데이터의 요약이 표시됩니다.

사전 훈련된 신경망이 새 영상을 분류하도록 다시 훈련시키려면 마지막 학습 가능한 계층과 마지막 분류 계층을 새로운 데이터 세트에 맞게 조정하십시오.

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

R2023b 이전: 계층 속성을 편집하려면 계층을 잠금 해제하는 대신에 계층을 바꿔야 합니다.

OutputSize를 새 데이터의 클래스 개수(이 예제에서는 5)로 설정합니다. 전이된 계층보다 새 계층에서 학습이 더 빨리 이루어지도록 학습률을 편집합니다. WeightLearnRateFactorBiasLearnRateFactor10으로 설정합니다.

분류 계층을 선택하고 계층 잠금 해제를 클릭한 다음 무시하고 잠금 해제를 클릭합니다. 잠금 해제된 출력 계층에 대해 OutputSize를 설정할 필요는 없습니다. 심층 신경망 디자이너는 훈련 시점에 자동으로 데이터로부터 계층의 출력 클래스를 설정합니다.

훈련 옵션을 지정합니다. 훈련 탭을 선택하고 훈련 옵션을 클릭합니다. Solversgdm으로, InitialLearnRate0.0001로, MiniBatchSize11로, MaxEpochs8로, ValidationFrequency5로 설정합니다.

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

훈련된 가중치와 함께 신경망 아키텍처를 내보내려면 훈련 탭에서 내보내기 > 훈련된 신경망 및 결과 내보내기를 선택하십시오. 심층 신경망 디자이너가 훈련된 신경망을 변수 trainedNetwork_1로 내보냅니다.

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

I = imread("MerchDataTest.jpg");

심층 신경망 디자이너가 신경망 입력 크기와 일치하도록 훈련 중에 영상의 크기를 조정합니다. 신경망 입력 크기를 보려면 디자이너 창에서 imageInputLayer(첫 번째 계층)를 선택하십시오. 이 신경망의 입력 크기는 224×224입니다.

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

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

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

YPred = classify(trainedNetwork_1,I);
imshow(I)
title("Predicted Class: " + string(YPred));

사전 훈련된 ResNet-18 신경망을 불러오고 입력 크기를 구합니다.

net = resnet18;
inputSize = net.Layers(1).InputSize;

MathWorks Merch 데이터 세트를 추출합니다. 새 영상을 영상 데이터저장소로 불러옵니다.

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

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

데이터를 훈련 데이터 세트와 검증 데이터 세트로 나눕니다. "randomized"를 지정하여 지정된 비율의 영상을 검증 세트와 훈련 세트에 무작위로 할당합니다.

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

증대 영상 데이터저장소를 사용하여 신경망 입력 크기와 일치하도록 훈련 영상의 크기를 자동으로 조정합니다.

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

사전 훈련된 신경망이 새 영상을 분류하도록 다시 훈련시키려면 마지막 완전 연결 계층과 마지막 분류 계층을 새로운 데이터 세트에 적응된 새로운 계층들로 교체하십시오. 먼저 훈련된 신경망에서 계층 그래프를 추출합니다.

lgraph = layerGraph(net); 

이 완전 연결 계층을 출력값의 개수가 클래스 개수와 같은 새로운 완전 연결 계층으로 교체합니다. 전이된 계층보다 새로운 계층에서 학습이 더 빠르게 이루어지도록 하려면 완전 연결 계층의 WeightLearnRateFactor 값과 BiasLearnRateFactor 값을 높이십시오.

newLearnableLayer = fullyConnectedLayer(numClasses, ...
    WeightLearnRateFactor=10, ...
    BiasLearnRateFactor=10);
    
lgraph = replaceLayer(lgraph,"fc1000",newLearnableLayer);

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

newClassLayer = classificationLayer;
lgraph = replaceLayer(lgraph,"ClassificationLayer_predictions",newClassLayer);

훈련 옵션을 지정합니다. 전이된 계층의 학습을 늦추려면 초기 학습률을 작은 값으로 설정하십시오.

options = trainingOptions("sgdm", ...
    InitialLearnRate=0.0001, ...
    MiniBatchSize=11, ...
    MaxEpochs=8, ...
    ValidationData=augimdsValidation, ...
    ValidationFrequency=5, ...
    Verbose=false, ...
    Plots="training-progress");

신경망을 훈련시킵니다.

trainedNetwork = trainNetwork(augimdsTrain,lgraph,options);

Figure Training Progress (19-Aug-2023 11:40:06) contains 2 axes objects and another object of type uigridlayout. Axes object 1 with xlabel Iteration, ylabel Loss contains 15 objects of type patch, text, line. Axes object 2 with xlabel Iteration, ylabel Accuracy (%) contains 15 objects of type patch, text, line.

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

I = imread("MerchDataTest.jpg");
I = imresize(I,inputSize(1:2));

테스트 영상을 분류합니다.

YPred = classify(trainedNetwork,I);
imshow(I)
title("Predicted class: " + string(YPred));

Figure contains an axes object. The axes object with title Predicted class: MathWorks Cube contains an object of type image.

출력 인수

모두 축소

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

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

참고 문헌

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

[2] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Deep residual learning for image recognition." In Proceedings of the IEEE conference on computer vision and pattern recognition, pp. 770-778. 2016.

확장 기능

버전 내역

R2018a에 개발됨