주요 콘텐츠

회귀를 위해 컨벌루션 신경망 훈련시키기

이 예제에서는 손으로 쓴 숫자의 회전 각도를 예측하는 컨벌루션 신경망을 훈련시키는 방법을 보여줍니다.

회귀 작업에는 이산적인 클래스 레이블이 아니라 연속적인 숫자형 값을 예측하는 작업이 포함됩니다. 이 예제에서는 회귀를 위한 컨벌루션 신경망 아키텍처를 구성하고 신경망을 훈련시킨 다음 훈련된 신경망을 사용하여 손으로 쓴 숫자의 회전 각도를 예측합니다.

다음 도식은 회귀 신경망을 통과하는 영상 데이터의 흐름을 보여줍니다.

Diagram showing data flow of data through the neural network. The input data to the network is a collection of images of digits. The output of the neural network are numeric scalars.

데이터 불러오기

데이터 세트에는 손으로 쓴 숫자를 나타내는 합성 영상과 영상 각각의 회전 각도(단위: 도)가 포함되어 있습니다.

MAT 파일 DigitsDataTrain.matDigitsDataTest.mat에서 훈련 데이터와 테스트 데이터를 각각 불러옵니다. 변수 anglesTrainanglesTest는 회전 각도(단위: 도)입니다. 훈련 및 테스트 데이터 세트는 각각 5,000개의 영상을 포함합니다.

load DigitsDataTrain
load DigitsDataTest

훈련 영상 몇 개를 표시합니다.

numObservations = size(XTrain,4);
idx = randperm(numObservations,49);
I = imtile(XTrain(:,:,:,idx));
figure
imshow(I);

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

이 예제에 지원 파일로 첨부된 trainingPartitions 함수를 사용하여 XTrainanglesTrain을 훈련 파티션과 검증 파티션으로 분할합니다. 이 함수에 액세스하려면 예제를 라이브 스크립트로 여십시오. 검증을 위해 훈련 데이터의 15%를 남겨 둡니다.

[idxTrain,idxValidation] = trainingPartitions(numObservations,[0.85 0.15]);

XValidation = XTrain(:,:,:,idxValidation);
anglesValidation = anglesTrain(idxValidation);

XTrain = XTrain(:,:,:,idxTrain);
anglesTrain = anglesTrain(idxTrain);

신경망 아키텍처 정의하기

신경망 아키텍처를 정의합니다.

  • 영상 입력값으로 영상 입력 계층을 지정합니다.

  • 매번 필터 개수를 늘리면서 4개의 convolution-batchnorm-ReLU 블록을 지정합니다.

  • 각 블록 사이에 풀링 영역과 스트라이드 크기가 2인 평균값 풀링 계층을 지정합니다.

  • 회귀의 경우, 출력 크기가 응답 변수의 개수와 일치하는 완전 연결 계층을 추가합니다.

  • 이 예제에서 훈련 프로세스는 NormalizeTargets 훈련 옵션(R2026a에서 추가됨)을 사용하여 훈련 목표값을 자동으로 정규화합니다. 정규화된 목표값을 사용하면 훈련을 안정화하고 정규화된 목표값과 거의 일치하는 훈련 예측값을 얻는 데 도움이 됩니다. 신경망이 예측 시점에서만 정규화되지 않은 값의 공간에서 예측값을 출력하도록 하려면 역정규화 계층(R2026a에서 추가됨)을 포함하십시오.R2026a 이전: 훈련을 안정화하려면 목표값을 수동으로 정규화한 다음 신경망을 훈련시키십시오.

numResponses = size(anglesTrain,2);

layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(3,8,Padding="same")
    batchNormalizationLayer
    reluLayer
    averagePooling2dLayer(2,Stride=2)
    convolution2dLayer(3,16,Padding="same")
    batchNormalizationLayer
    reluLayer
    averagePooling2dLayer(2,Stride=2)
    convolution2dLayer(3,32,Padding="same")
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,32,Padding="same")
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(numResponses)
    inverseNormalizationLayer];

훈련 옵션 지정하기

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

  • 크기가 128인 미니 배치를 사용하여 훈련시킵니다.

  • NormalizeTargets 인수(R2026a에서 추가됨)를 사용하여 훈련 목표값을 자동으로 정규화합니다. R2026a 이전: 훈련을 안정화하려면 목표값을 수동으로 정규화한 다음 신경망을 훈련시키십시오.

  • 0.001의 초기 학습률을 사용하고 20회 Epoch마다 0.1의 인자를 사용하여 학습률을 감소시키는 조각별 학습률 조정 계획을 사용하여 학습률을 감소시킵니다.

  • 매 Epoch마다 검증 데이터를 사용하여 신경망을 검증합니다.

  • 훈련 진행 상황을 플롯으로 표시합니다.

  • 상세 출력값을 비활성화합니다.

miniBatchSize = 128;

schedule = piecewiseLearnRate( ...
    DropFactor=0.1, ...
    Period=20);

numIterationsPerEpoch = floor(numel(anglesTrain)/miniBatchSize);

options = trainingOptions("sgdm", ...
    NormalizeTargets=true, ...
    MiniBatchSize=miniBatchSize, ...
    InitialLearnRate=1e-3, ...
    LearnRateSchedule=schedule, ... 
    Shuffle="every-epoch", ...
    ValidationData={XValidation,anglesValidation}, ...
    ValidationFrequency=numIterationsPerEpoch, ...
    Plots="training-progress", ...
    Verbose=false);

신경망 훈련시키기

trainnet 함수를 사용하여 신경망을 훈련시킵니다. 회귀의 경우 평균제곱오차 손실을 사용합니다. 기본적으로 trainnet 함수는 GPU를 사용할 수 있으면 GPU를 사용합니다. GPU를 사용하려면 Parallel Computing Toolbox™ 라이선스와 지원되는 GPU 장치가 필요합니다. 지원되는 장치에 대한 자세한 내용은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오. GPU를 사용할 수 없는 경우, 함수는 CPU를 사용합니다. 실행 환경을 지정하려면 ExecutionEnvironment 훈련 옵션을 사용하십시오.

net = trainnet(XTrain,anglesTrain,layers,"mse",options);

신경망 테스트하기

testnet 함수를 사용하여 신경망을 테스트합니다. 회귀의 경우 RMSE(RMS 오차)를 평가합니다. 기본적으로 testnet 함수는 GPU를 사용할 수 있으면 GPU를 사용합니다. 실행 환경을 수동으로 선택하려면 testnet 함수의 ExecutionEnvironment 인수를 사용하십시오.

rmse = testnet(net,XTest,anglesTest,"rmse")
rmse = 
7.6861

테스트 데이터를 사용하여 예측을 수행하고 예측값을 목표값과 비교하여 정확도를 플롯으로 시각화합니다. minibatchpredict 함수를 사용하여 예측을 수행합니다. 기본적으로 minibatchpredict 함수는 GPU를 사용할 수 있으면 GPU를 사용합니다.

YTest = minibatchpredict(net,XTest);

목표값에 대해 예측된 값을 플로팅합니다.

figure
scatter(YTest,anglesTest,"+")
xlabel("Prediction")
ylabel("Target")

hold on
plot([-60 60], [-60 60],"r--")

Figure contains an axes object. The axes object with xlabel Prediction, ylabel Target contains 2 objects of type scatter, line.

새 데이터를 사용하여 예측하기

신경망을 사용하여 첫 번째 테스트 영상으로 예측을 수행합니다. 하나의 영상을 사용하여 예측을 수행하기 위해 predict 함수를 사용합니다. GPU를 사용하려면 먼저 데이터를 gpuArray로 변환합니다.

X = XTest(:,:,:,1);
if canUseGPU
    X = gpuArray(X);
end
Y = predict(net,X)
Y = single

33.0647
figure
imshow(X)
title("Angle: " + gather(Y))

Figure contains an axes object. The hidden axes object with title Angle: 33.0647 contains an object of type image.

참고 항목

| |

도움말 항목