Main Content

얕은 신경망을 사용하여 패턴 분류하기

함수 피팅 외에도 신경망은 패턴을 인식하는 데 효과적입니다.

예를 들어, 세포 크기, 덩어리 두께, 유사 분열 등의 균일성을 기준으로 종양을 양성 또는 악성으로 분류하기를 원한다고 가정합니다. 9개 특징이 있고 양성 또는 악성으로 정확하게 분류된 표본이 699건 있습니다.

함수 피팅과 마찬가지로 이 문제를 해결할 수 있는 방법은 두 가지입니다.

일반적으로 앱으로 시작한 다음, 앱을 사용하여 명령줄 스크립트를 자동으로 생성하는 것이 가장 좋습니다. 두 방법 중 하나를 사용하기 전에 먼저 데이터 세트를 선택하여 문제를 정의하십시오. 각 신경망 앱은 툴박스를 실험하는 데 쓸 수 있는 여러 샘플 데이터 세트에 액세스할 수 있습니다(얕은 신경망을 위한 샘플 데이터 세트 참조). 해결하려는 특정한 문제가 있는 경우, 자신의 데이터를 작업 공간으로 불러올 수 있습니다. 다음 섹션에서는 데이터 형식을 설명합니다.

심층 신경망을 대화형 방식으로 구축하고 훈련시키려면 심층 신경망 디자이너를 사용하십시오.

문제 정의하기

패턴 인식 문제를 정의하려면 입력 벡터의 세트(예측 변수)를 행렬의 열로 정렬하십시오. 그런 다음 관측값이 할당되는 클래스를 나타내는 또 하나의 세트인 응답 변수 벡터 세트를 정렬합니다.

클래스가 두 개뿐인 경우 각 응답 변수는 두 가지 요소 0과1을 가지며, 이는 해당 관측값이 속하는 클래스를 나타냅니다. 예를 들어, 다음과 같이 클래스가 두 개인 분류 문제를 정의할 수 있습니다.

predictors = [7 10 3 1 6; 5 8 1 1 6; 6 7 1 1 6];
responses = [0 0 1 1 0; 1 1 0 0 1];
데이터는 5개의 관측값으로 구성되며, 각각은 3개의 특징을 가지고 있고 두 개의 클래스 중 하나로 분류됩니다.

예측 변수를 N개의 서로 다른 클래스로 분류하려면 응답 변수에 N개의 요소가 있어야 합니다. 각각의 응답 변수에서 요소 한 개는 1이고 나머지 다른 요소는 0입니다. 예를 들어, 다음 라인은 5×5×5 큐브의 코너를 세 클래스로 나눠 분류 문제를 정의하는 방법을 보여줍니다.

  • 한 클래스에는 원점(첫 번째 입력 벡터)

  • 두 번째 클래스에는 원점에서 가장 먼 코너(마지막 입력 벡터)

  • 세 번째 클래스에는 그 밖의 모든 점

predictors  = [0 0 0 0 5 5 5 5; 0 0 5 5 0 0 5 5; 0 5 0 5 0 5 0 5];
responses = [1 0 0 0 0 0 0 0; 0 1 1 1 1 1 1 0; 0 0 0 0 0 0 0 1];
데이터는 8개의 관측값으로 구성되며, 각각은 3개의 특징을 가지고 있고 3개의 클래스 중 하나로 분류됩니다.

다음 섹션에서는 신경망 패턴 인식 앱을 사용하여 패턴을 인식하도록 신경망을 훈련시키는 방법을 보여줍니다. 이 예제는 툴박스와 함께 제공된 예제 데이터 세트를 사용합니다.

신경망 패턴 인식 앱을 사용하여 패턴 분류하기

이 예제에서는 신경망 패턴 인식 앱을 사용하여 얕은 신경망을 훈련시켜 패턴을 분류하는 방법을 보여줍니다.

nprtool을 사용하여 신경망 패턴 인식 앱을 엽니다.

nprtool

데이터 선택하기

신경망 패턴 인식 앱에는 신경망 훈련을 시작하는 데 사용할 수 있는 예제 데이터가 있습니다.

유리 분류 예제 데이터를 가져오려면 가져오기 > 유리 데이터 세트 가져오기를 선택하십시오. 이 데이터 세트를 사용하여 유리를 창 또는 창이 아닌 것으로 분류하도록 신경망을 훈련시킬 수 있습니다. 분류에는 유리의 화학적 속성을 사용합니다. 파일이나 작업 공간에서 사용자 소유의 데이터를 가져올 경우, 예측 변수와 응답 변수를 지정하고 관측값이 행에 있는지 아니면 열에 있는지를 지정해야 합니다.

가져온 데이터에 관한 정보는 모델 요약에 표시됩니다. 이 데이터 세트는 214개의 관측값을 포함하며 각 관측값에는 9개의 특징이 있습니다. 각 관측값은 창 클래스와 창이 아닌 클래스 둘 중 하나로 분류됩니다.

데이터를 훈련 세트, 검증 세트, 테스트 세트로 분할합니다. 디폴트 설정을 유지합니다. 데이터는 다음과 같이 분할됩니다.

  • 훈련에 70%.

  • 신경망이 일반화되고 있음을 검증하고 과적합 전에 훈련을 중지하는 데 15%.

  • 신경망 일반화를 독립적으로 테스트하는 데 15%.

데이터 분할에 대한 자세한 내용은 최적의 신경망 훈련을 위해 데이터 분할하기 항목을 참조하십시오.

신경망 만들기

신경망은 은닉 계층에 시그모이드 전달 함수가 있고 출력 계층에 소프트맥스 전달 함수가 있는 2계층 피드포워드 신경망입니다. 은닉 계층의 크기는 은닉 뉴런의 개수에 대응합니다. 디폴트 계층 크기는 10입니다. 신경망 창에서 신경망 아키텍처를 확인할 수 있습니다. 출력 뉴런의 개수는 2로 설정되며 응답 변수 데이터에서 지정하는 클래스의 수와 같습니다.

신경망 훈련시키기

신경망을 훈련시키려면 훈련을 클릭하십시오.

훈련 창에서 훈련 진행 상황을 확인할 수 있습니다. 훈련은 중지 기준 중 하나를 충족할 때까지 계속됩니다. 이 예제에서는 6회 반복하는 동안 검증 오차가 연속하여 증가할 때까지("검증 기준이 충족됨") 훈련이 계속됩니다.

결과 분석하기

모델 요약에는 훈련 알고리즘에 대한 정보와 각 데이터 세트의 훈련 결과가 포함되어 있습니다.

플롯을 생성하여 결과를 더 자세히 분석할 수 있습니다. 혼동행렬을 플로팅하려면 플롯 섹션에서 혼동행렬을 클릭하십시오. 신경망 출력은 매우 정확합니다. 녹색 정사각형(대각선)의 올바른 분류 개수가 많고 빨간색 정사각형(비대각선)의 잘못된 분류 개수가 적습니다.

ROC 곡선을 보고 신경망 성능을 추가로 검증합니다. 플롯 섹션에서 ROC 곡선을 클릭하십시오.

각 축의 컬러 선은 ROC 곡선을 나타냅니다. ROC 곡선은 분계점 변화에 따른 참양성률(민감도) 대 거짓양성률(1-특이도)의 플롯입니다. 테스트 결과가 완벽하다면 100% 민감도와 100% 특이도로서 왼쪽 상단 코너에 점이 표시될 것입니다. 이 문제에서 신경망의 성능은 매우 좋습니다.

신경망 성능에 만족하지 못하는 경우 다음 중 하나를 수행할 수 있습니다.

  • 신경망을 다시 훈련시킵니다.

  • 은닉 뉴런 수를 늘립니다.

  • 더 큰 훈련 데이터 세트를 사용합니다.

훈련 세트에서의 성능은 좋은데 테스트 세트 성능이 나쁘면 모델이 과적합임을 의미할 수 있습니다. 뉴런 수를 줄이면 과적합을 줄일 수 있습니다.

또한, 추가 테스트 세트에 대해 신경망 성능을 평가할 수 있습니다. 추가 테스트 데이터를 불러와서 신경망을 평가하려면 테스트 섹션에서 테스트를 클릭하십시오. 모델 요약에 추가 테스트 결과가 표시됩니다. 플롯을 생성하여 추가 테스트 결과를 분석할 수도 있습니다.

코드 생성하기

코드 생성 > 단순 훈련 스크립트 생성을 선택하여 명령줄에서 이전 단계를 재현할 수 있는 MATLAB 코드를 만듭니다. 툴박스의 명령줄 기능을 사용하여 훈련 과정을 사용자 지정하는 방법을 배우려면 MATLAB 코드 만들기가 유용할 수 있습니다. 명령줄 함수를 사용하여 패턴 분류하기에서 생성된 스크립트를 자세히 조사해야 합니다.

신경망 내보내기

훈련된 신경망을 작업 공간 또는 Simulink®로 내보낼 수 있습니다. 또한, 신경망과 함께 MATLAB Compiler™와 그 밖의 MATLAB 코드 생성 툴을 배포할 수 있습니다. 훈련된 신경망과 결과를 내보내려면 모델 내보내기 > 작업 공간으로 내보내기를 선택하십시오.

명령줄 함수를 사용하여 패턴 분류하기

툴박스의 명령줄 기능 사용법을 학습하는 가장 쉬운 방법은 앱에서 스크립트를 생성한 다음 이를 수정하여 신경망 훈련을 사용자 지정하는 것입니다. 한 예로, 이전 섹션에서 작성한 간단한 스크립트를 신경망 패턴 인식 앱을 통해 살펴보십시오.

% Solve a Pattern Recognition Problem with a Neural Network
% Script generated by Neural Pattern Recognition app
% Created 22-Mar-2021 16:50:20
%
% This script assumes these variables are defined:
%
%   glassInputs - input data.
%   glassTargets - target data.

x = glassInputs;
t = glassTargets;

% Choose a Training Function
% For a list of all training functions type: help nntrain
% 'trainlm' is usually fastest.
% 'trainbr' takes longer but may be better for challenging problems.
% 'trainscg' uses less memory. Suitable in low memory situations.
trainFcn = 'trainscg';  % Scaled conjugate gradient backpropagation.

% Create a Pattern Recognition Network
hiddenLayerSize = 10;
net = patternnet(hiddenLayerSize, trainFcn);

% Setup Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

% Train the Network
[net,tr] = train(net,x,t);

% Test the Network
y = net(x);
e = gsubtract(t,y);
performance = perform(net,t,y)
tind = vec2ind(t);
yind = vec2ind(y);
percentErrors = sum(tind ~= yind)/numel(tind);

% View the Network
view(net)

% Plots
% Uncomment these lines to enable various plots.
%figure, plotperform(tr)
%figure, plottrainstate(tr)
%figure, ploterrhist(e)
%figure, plotconfusion(t,y)
%figure, plotroc(t,y)

스크립트를 저장한 다음, 명령줄에서 실행하여 이전 훈련 세션의 결과를 재현할 수 있습니다. 스크립트를 편집하여 훈련 과정을 사용자 지정할 수도 있습니다. 이 사례에서는 스크립트의 각 단계를 따르십시오.

데이터 선택하기

이 스크립트는 예측 변수 벡터와 응답 변수 벡터를 이미 작업 공간에 불러온 상태라고 가정합니다. 데이터를 불러오지 않은 경우 다음과 같이 불러올 수 있습니다.

load glass_dataset
이 명령은 예측 변수 glassInputs와 응답 변수 glassTargets를 작업 공간으로 불러옵니다.

이 데이터 세트는 툴박스의 일부인 샘플 데이터 세트 중 하나입니다. 사용할 수 있는 데이터 세트에 대한 자세한 내용은 얕은 신경망을 위한 샘플 데이터 세트 항목을 참조하십시오. 또한, help nndatasets 명령을 입력하여 사용 가능한 모든 데이터 세트 목록을 볼 수 있습니다. 사용자 자신의 변수 이름을 사용하여 이러한 데이터 세트에서 변수를 불러올 수 있습니다. 예를 들어, 다음 명령은

[x,t] = glass_dataset;
유리 예측 변수를 배열 x로 불러오고 유리 응답 변수를 배열 t로 불러옵니다.

훈련 알고리즘 선택하기

훈련 알고리즘을 정의합니다.

trainFcn = 'trainscg';  % Scaled conjugate gradient backpropagation.

신경망 만들기

신경망을 만듭니다. 패턴 인식(분류) 문제를 위한 디폴트 신경망 patternnet은 은닉 계층에 디폴트 시그모이드 전달 함수가 있고 출력 계층에 소프트맥스 전달 함수가 있는 피드포워드 신경망입니다. 이 신경망에는 10개의 뉴런을 갖는 단일 은닉 계층이 있습니다(디폴트 값).

각 입력 벡터와 연관된 두 개의 응답 변수 값(클래스)이 있기 때문에 신경망에는 두 개의 출력 뉴런이 있습니다. 각 출력 뉴런은 클래스를 나타냅니다. 적절한 클래스의 입력 벡터가 신경망에 적용되면 해당 뉴런은 1을 생성하고 다른 뉴런은 0을 출력해야 합니다.

hiddenLayerSize = 10;
net = patternnet(hiddenLayerSize, trainFcn);

참고

뉴런이 많을수록 많은 계산이 필요하고 너무 높게 설정한 뉴런 개수로 인해 데이터를 과적합하는 경향이 발생하지만, 신경망으로 더 복잡한 문제를 해결할 수 있습니다. 계층이 많을수록 계산이 많이 필요하지만, 많은 계층을 사용하면 복잡한 문제를 더 효율적으로 해결할 수 있습니다. 두 개 이상의 은닉 계층을 사용하려면 patternnet 명령에 은닉 계층의 크기를 배열의 요소로 입력하십시오.

데이터 나누기

데이터 분할을 설정합니다.

net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

이러한 설정을 사용하면 예측 변수 벡터와 응답 변수 벡터가 임의로 나뉘어, 70%는 훈련용, 15%는 검증용, 15%는 테스트용으로 분할됩니다. 데이터 분할 과정에 대한 자세한 내용은 최적의 신경망 훈련을 위해 데이터 분할하기 항목을 참조하십시오.

신경망 훈련시키기

신경망을 훈련시킵니다.

[net,tr] = train(net,x,t);

훈련 중에 훈련 진행 상황 창이 열립니다. 중지 버튼 을 클릭하여 언제든지 훈련을 중단할 수 있습니다.

Neural network training progress window

훈련은 6회 반복하는 동안 검증 오차가 연속하여 증가했을 때 완료되었으며, 이 상황은 14회째 반복에서 발생했습니다.

훈련 창에서 성능을 클릭하면 다음 그림과 같이 훈련 오차, 검증 오차 및 테스트 오차의 플롯이 나타납니다.

Cross entropy error against number of epochs for the training, validation, and test data. The best validation performance is 0.058432 at epoch 8.

이 예제에서는 최종 교차 엔트로피 오차가 작으므로 결과가 합리적입니다.

신경망 테스트하기

신경망을 테스트합니다. 훈련을 마친 신경망을 사용하여 신경망 출력값을 계산할 수 있습니다. 다음 코드는 신경망 출력값, 오차 및 전체 성능을 계산합니다.

y = net(x);
e = gsubtract(t,y);
performance = perform(net,t,y)
performance =

    0.0659

잘못 분류된 관측값의 비율을 구할 수 있습니다. 이 예제에서는 모델의 오분류 비율이 매우 낮습니다.

tind = vec2ind(t);
yind = vec2ind(y);
percentErrors = sum(tind ~= yind)/numel(tind)
percentErrors =

    0.0514

훈련 기록에 있는 테스트 인덱스를 사용하여 테스트 세트에서만 신경망 성능을 계산할 수도 있습니다.

tInd = tr.testInd;
tstOutputs = net(x(:,tInd));
tstPerform = perform(net,t(tInd),tstOutputs)
tstPerform =

    2.0163

신경망 보기

신경망 도식을 확인합니다.

view(net)

Graphical representation of the pattern recognition network. The network has input size 9, output size 2, and a single hidden layer of size 10.

결과 분석하기

plotconfusion 함수를 사용하여 혼동행렬을 플로팅합니다. 훈련 창에서 혼동행렬을 클릭하여 데이터 세트 각각의 혼동행렬을 플로팅할 수도 있습니다.

figure, plotconfusion(t,y)

Confusion matrix of the output and target classes. The network classifies 203 inputs correctly and 11 inputs incorrectly.

대각선 녹색 셀은 올바르게 분류된 사례의 수를 보여주며, 비대각선 빨간색 셀은 잘못 분류된 사례를 보여줍니다. 결과는 매우 좋은 인식률을 보여줍니다. 훨씬 더 정확한 결과가 필요한 경우 다음 방법 중 하나를 시도해 볼 수 있습니다.

  • 초기 신경망 가중치와 편향을 init를 사용하여 새로운 값으로 재설정하고 다시 훈련시킵니다.

  • 은닉 뉴런 수를 늘립니다.

  • 더 큰 훈련 데이터 세트를 사용합니다.

  • 더 많은 관련 정보를 사용할 수 있으면 입력값 개수를 늘립니다.

  • 다른 훈련 알고리즘을 사용해 봅니다(훈련 알고리즘 참조).

이 사례에서는 신경망 결과가 만족스러우므로 신경망을 새로운 입력 데이터에 사용할 수 있습니다.

다음 단계

명령줄 연산에 대한 더 많은 경험을 얻으려면 다음 몇 가지 작업을 수행해 보십시오.

  • 훈련 중에 정오 플롯과 같은 플롯 창을 열고 애니메이션을 확인합니다.

  • plotrocplottrainstate와 같은 함수로 명령줄에서 플로팅합니다.

신경망을 훈련시킬 때마다 임의의 초기 가중치와 편향 값이 달라지고 데이터를 훈련 세트, 검증 세트, 테스트 세트로 분할하는 것이 달라지므로 해가 다를 수 있습니다. 그 결과, 같은 문제에 대해 훈련받은 여러 신경망이 같은 입력에 대해 서로 다른 출력값을 제공할 수 있습니다. 정확도가 양호한 신경망을 발견한 것인지 확인하려면 여러 번 다시 훈련시키십시오.

더 높은 정확도를 원하는 경우 초기 해를 개선하기 위한 몇 가지 다른 기법이 있습니다. 자세한 내용은 얕은 신경망 일반화를 개선하고 과적합 방지하기 항목을 참조하십시오.

참고 항목

| | | |

관련 항목