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

데이터 불러오기
데이터 세트에는 손으로 쓴 숫자를 나타내는 합성 영상과 영상 각각의 회전 각도(단위: 도)가 포함되어 있습니다.
MAT 파일 DigitsDataTrain.mat 및 DigitsDataTest.mat에서 훈련 데이터와 테스트 데이터를 각각 불러옵니다. 변수 anglesTrain 및 anglesTest는 회전 각도(단위: 도)입니다. 훈련 및 테스트 데이터 세트는 각각 5,000개의 영상을 포함합니다.
load DigitsDataTrain load DigitsDataTest
훈련 영상 몇 개를 표시합니다.
numObservations = size(XTrain,4); idx = randperm(numObservations,49); I = imtile(XTrain(:,:,:,idx)); figure imshow(I);

이 예제에 지원 파일로 첨부된 trainingPartitions 함수를 사용하여 XTrain 및 anglesTrain을 훈련 파티션과 검증 파티션으로 분할합니다. 이 함수에 액세스하려면 예제를 라이브 스크립트로 여십시오. 검증을 위해 훈련 데이터의 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--")

새 데이터를 사용하여 예측하기
신경망을 사용하여 첫 번째 테스트 영상으로 예측을 수행합니다. 하나의 영상을 사용하여 예측을 수행하기 위해 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))
참고 항목
trainnet | trainingOptions | dlnetwork