Main Content

이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

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

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

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

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

일반적으로 GUI로 시작한 다음 GUI를 사용하여 명령줄 스크립트를 자동으로 생성하는 것이 가장 좋습니다. 두 방법 중 하나를 사용하기 전에 먼저 수행해야 할 첫 번째 단계는 데이터 세트를 선택해 문제를 정의하는 것입니다. 다음 섹션에서는 데이터 형식을 설명합니다.

문제 정의하기

패턴 인식 문제를 정의하려면 행렬에 Q 입력 벡터 세트를 배열하십시오. 그런 다음 입력 벡터가 할당되는 클래스를 나타내기 위해 또 하나의 세트인 Q 목표 벡터 세트를 정렬합니다. (정적 및 시계열 데이터의 데이터 형식 지정에 대한 자세한 설명은 “데이터 구조”를 참조하십시오.)

클래스가 두 개뿐인 경우 각 스칼라 목표값을 0 또는 1로 설정하여 해당 입력값이 속하는 클래스를 나타냅니다. 예를 들어, 다음과 같이 클래스가 두 개인 상호 배타적 분류 문제를 정의할 수 있습니다.

inputs  = [0 1 0 1; 0 0 1 1];
targets = [1 0 0 1; 0 1 1 0];

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

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

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

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

    inputs  = [0 0 0 0 5 5 5 5; 0 0 5 5 0 0 5 5; 0 5 0 5 0 5 0 5];
    targets = [1 0 0 0 0 0 0 0; 0 1 1 1 1 1 1 0; 0 0 0 0 0 0 0 1];
    

두 개의 클래스만을 포함하는 분류 문제는 두 형식 중 하나를 사용하여 나타낼 수 있습니다. 목표값은 스칼라 1/0 요소 또는 요소를 2개 가진 벡터로 구성할 수 있습니다. 한 요소는 1이고 다른 요소는 0입니다.

다음 섹션에서는 Neural Network Pattern Recognition 앱 nprtool을 사용하여 패턴을 인식하도록 신경망을 훈련시키는 방법을 보여줍니다. 이 예제는 툴박스와 함께 제공된 암 데이터 세트를 사용합니다. 이 데이터 세트는 요소를 9개 가진 입력 벡터 669개와 요소를 2개 가진 목표 벡터들로 구성됩니다. 각 입력 벡터에 두 가지 범주(양성 또는 악성)가 있기 때문에 각 목표 벡터에 요소가 두 개 있습니다.

Neural Network Pattern Recognition 앱 사용하기

  1. 필요한 경우 다음 명령을 사용하여 Neural Network Start GUI를 엽니다.

    nnstart
    

  2. Pattern Recognition app을 클릭하여 Neural Network Pattern Recognition 앱을 엽니다. (nprtool 명령을 사용할 수도 있습니다.)

  3. Next를 클릭하여 계속 진행합니다. Select Data 창이 열립니다.

  4. Load Example Data Set를 클릭합니다. Pattern Recognition Data Set Chooser 창이 열립니다.

  5. Breast Cancer를 선택하고 Import를 클릭합니다. Select Data 창으로 돌아갑니다.

  6. Next를 클릭하여 Validation and Test Data 창으로 이동합니다.

    검증 데이터 세트와 테스트 데이터 세트는 각각 원본 데이터의 15%로 설정되어 있습니다. 이러한 설정을 사용하면 입력 벡터와 목표 벡터가 다음과 같이 임의로 세 세트로 나뉩니다.

    • 70%는 훈련에 사용됩니다.

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

    • 마지막 15%는 신경망 일반화를 완전히 독립적으로 테스트하는 데 사용됩니다.

    (데이터 분할 과정에 대한 자세한 논의는 “데이터 분할하기”를 참조하십시오.)

  7. Next를 클릭합니다.

    패턴 인식에 사용되는 표준 신경망은 은닉 계층에 시그모이드 전달 함수가 있고 출력 계층에 소프트맥스 전달 함수가 있는 2계층 피드포워드 신경망입니다. 은닉 뉴런의 디폴트 개수는 10으로 설정됩니다. 신경망이 예상한 대로 잘 수행되지 않으면 다시 돌아와 이 수를 늘려야 할 수도 있습니다. 출력 뉴런의 개수는 2로 설정되며 목표 벡터의 요소 수(범주 개수)와 같습니다.

  8. Next를 클릭합니다.

  9. Train을 클릭합니다.

    훈련은 55회 반복됩니다.

  10. Neural Network Pattern Recognition 앱의 Plots 창에서 Confusion을 클릭합니다.

    다음 그림은 훈련, 테스트 및 검증을 위한 정오분류표와 결합된 3가지 종류의 데이터를 보여줍니다. 신경망 출력은 매우 정확합니다. 녹색 정사각형의 정확한 응답 수가 많고 빨간색 정사각형의 잘못된 응답 수가 적습니다. 오른쪽 아래의 파란색 정사각형은 전체 정확도를 나타냅니다.

  11. ROC(수신자 조작 특성) 곡선을 플로팅합니다. Neural Network Pattern Recognition 앱의 Plots 창에서 Receiver Operating Characteristic을 클릭합니다.

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

  12. Neural Network Pattern Recognition 앱에서 Next를 클릭하여 신경망을 평가합니다.

    이 점에서 새 데이터에 대해 신경망을 테스트할 수 있습니다.

    원본 데이터 또는 새 데이터에 대한 신경망 성능에 만족하지 못하면 다시 훈련시키거나, 뉴런 수를 늘리거나, 더 큰 훈련 데이터 세트를 가져올 수도 있습니다. 훈련 세트에서의 성능은 좋은데 테스트 세트 성능이 현저하게 나쁘면 과적합을 의미할 수 있으며, 그런 경우 뉴런 수를 줄이면 결과가 향상될 수 있습니다.

  13. 신경망 성능에 만족하면 Next를 클릭합니다.

    이 패널을 사용하여 신경망 시뮬레이션을 위한 MATLAB 함수 또는 Simulink 다이어그램을 생성합니다. 생성된 코드 또는 도식을 사용하여 신경망이 입력값에서 출력값을 계산하는 방법을 더 명확히 이해하고, 신경망과 함께 MATLAB Compiler 툴과 그 밖의 MATLAB 코드 생성 툴을 배포할 수 있습니다.

  14. Next를 클릭합니다. 이 화면의 버튼을 사용하여 결과를 저장합니다.

    • Simple Script 또는 Advanced Script를 클릭하여 명령줄에서 이전 단계를 모두 재현하는 데 사용할 수 있는 MATLAB® 코드를 만들 수 있습니다. 툴박스의 명령줄 기능을 사용하여 훈련 과정을 사용자 지정하는 방법을 배우려면 MATLAB 코드 만들기가 유용할 수 있습니다. 명령줄 함수 사용하기에서, 생성된 스크립트를 자세히 조사해야 합니다.

    • 신경망을 작업 공간에 net으로 저장할 수도 있습니다. 신경망에 대해 추가로 테스트를 수행하거나 새로운 입력값에 대해 작업을 수행할 수 있습니다.

  15. 결과를 저장했으면 Finish를 클릭합니다.

명령줄 함수 사용하기

툴박스의 명령줄 기능 사용법을 학습하는 가장 쉬운 방법은 GUI에서 스크립트를 생성한 다음 이를 수정하여 신경망 훈련을 사용자 지정하는 것입니다. 예를 들어, 이전 섹션의 단계 14에서 작성된 간단한 스크립트를 보십시오.

% Solve a Pattern Recognition Problem with a Neural Network
% Script generated by NPRTOOL
%
% This script assumes these variables are defined:
%
%   cancerInputs - input data.
%   cancerTargets - target data.

inputs = cancerInputs;
targets = cancerTargets;

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


% Set up 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,inputs,targets);

% Test the Network
outputs = net(inputs);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)

% View the Network
view(net)

% Plots
% Uncomment these lines to enable various plots.
% figure, plotperform(tr)
% figure, plottrainstate(tr)
% figure, plotconfusion(targets,outputs)
% figure, ploterrhist(errors)

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

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

    [inputs,targets] = cancer_dataset;
    
  2. 신경망을 만듭니다. 함수 피팅(또는 회귀) 문제에 대한 디폴트 신경망 patternnet는 은닉 계층에 디폴트 탄젠트-시그모이드 전달 함수가 있고 출력 계층에 소프트맥스 전달 함수가 있는 피드포워드 신경망입니다. 이전 섹션에서 하나의 은닉 계층에 (다소 임의적으로) 10개의 뉴런을 할당했습니다.

    • 각 입력 벡터와 연관된 두 개의 목표값(범주)이 있기 때문에 신경망에는 두 개의 출력 뉴런이 있습니다.

    • 각 출력 뉴런은 범주를 나타냅니다.

    • 적절한 범주의 입력 벡터가 신경망에 적용되면 해당 뉴런은 1을 생성하고 다른 뉴런은 0을 출력해야 합니다.

    신경망을 만들려면 다음 명령을 입력하십시오.

    hiddenLayerSize = 10;
    net = patternnet(hiddenLayerSize);
    

    참고

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

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

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

    이러한 설정을 사용하면 입력 벡터와 목표 벡터가 임의로 나뉘어, 70%는 훈련, 15%는 검증, 15%는 테스트에 사용됩니다.

    (데이터 분할 과정에 대한 자세한 논의는 “데이터 분할하기”를 참조하십시오.)

  4. 신경망을 훈련시킵니다. 패턴 인식 신경망은 스케일링된 켤레 기울기(Scaled Conjugate Gradient)(trainscg) 알고리즘을 디폴트 알고리즘으로 사용하여 훈련시킵니다. 신경망을 훈련시키려면 다음 명령을 입력하십시오.

    [net,tr] = train(net,inputs,targets);
    

    함수 피팅과 마찬가지로 훈련 중에 훈련 창이 열립니다. 이 창에는 훈련 진행 상황이 표시됩니다. 훈련을 중단하려면 언제든지 Stop Training을 클릭하십시오.

    이 훈련은 6회 반복 동안 검증 오차가 증가했을 때 중지되었으며, 24회째 반복에서 중지되었습니다.

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

    outputs = net(inputs);
    errors = gsubtract(targets,outputs);
    performance = perform(net,targets,outputs)
    
    performance =
    
        0.0419
    
    

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

    tInd = tr.testInd;
    tstOutputs = net(inputs(:,tInd));
    tstPerform = perform(net,targets(:,tInd),tstOutputs)
    
    tstPerform =
    
        0.0263
    
    
  6. 신경망 도식을 확인합니다.

    view(net)
    

  7. 훈련, 검증 및 테스트 성능을 플로팅합니다.

    figure, plotperform(tr)
    

  8. plotconfusion 함수를 사용하여 정오분류표를 플로팅합니다. 최종 훈련된 신경망에서 발생한 다양한 유형의 오분류가 표시됩니다.

    figure, plotconfusion(targets,outputs)
    

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

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

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

  • 훈련 벡터 수를 늘립니다.

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

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

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

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

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

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

또한, 명령줄에서 훈련시킬 때 여러 옵션에 대한 고급 스크립트를 살펴보십시오.

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

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