Main Content

analyzeNetwork

딥러닝 신경망 아키텍처 분석

설명

analyzeNetwork를 사용해서 신경망을 시각화하여 이해하고, 아키텍처를 올바르게 정의했는지 확인하고, 훈련 전에 문제를 파악합니다. analyzeNetwork는 계층 입력 크기가 올바르지 않은 경우, 계층 입력 개수가 올바르지 않은 경우, 신경망 구조가 유효하지 않은 경우 등의 문제를 파악합니다.

딥러닝 신경망을 대화형 방식으로 구축하고 시각화하려면 심층 신경망 디자이너 앱을 사용하십시오. 자세한 내용은 심층 신경망 디자이너 시작하기 항목을 참조하십시오.

analyzeNetwork(net)은 지정된 신경망 또는 계층 배열을 분석하여 오류와 문제를 검출합니다. 이 함수는 신경망 아키텍처에 대한 대화형 방식 시각화를 표시하고 상세한 정보를 제공합니다. 정보에는 계층 유형, 계층의 학습 가능한 파라미터, 상태, 활성화의 크기와 형식, 학습 가능한 파라미터의 총 개수가 포함됩니다.

신경망에 ProjectedLayer 객체가 포함된 경우 함수는 학습 가능한 파라미터가 사영에 의해 제거된 비율에 대한 정보를 추가로 표시합니다.

신경망이 taylorPrunableNetwork 객체인 경우 함수는 가지치기를 통해 제거된 학습 가능한 파라미터의 비율과 가지치기된 필터 개수에 대한 정보를 추가로 표시합니다.

각 활성화 차원은 "S"(공간), "C"(채널), "B"(배치), "T"(시간 또는 시퀀스), "U"(지정되지 않음) 중에서 한 레이블을 가집니다.

예제

analyzeNetwork(net,X1,...,Xn)은 지정된 신경망 표본 입력값을 사용하여 신경망을 분석합니다. 소프트웨어는 신경망을 통해 표본 입력값을 전파하여 계층 활성화의 크기와 형식, 학습 가능한 파라미터와 상태 파라미터의 크기와 개수, 학습 가능한 파라미터의 전체 개수를 결정합니다. 이 구문을 사용하여 입력 계층에 연결되지 않은 입력값을 하나 이상 갖는 신경망을 분석합니다.

예제

info = analyzeNetwork(___)NetworkAnalysis 객체도 반환합니다. 이 객체를 사용하여 분석 결과에 프로그래밍 방식으로 액세스할 수 있습니다. 예를 들어 학습 가능한 파라미터의 총 개수, 계층 정보, 신경망 문제에 액세스할 수 있습니다.

___ = analyzeNetwork(___,Plots=plotName)은 신경망 분석 중에 표시할 플롯도 지정합니다. 분석 플롯을 열지 않고 신경망을 프로그래밍 방식으로 분석하려면 Plots 옵션을 "none"으로 설정하십시오.

예제

모두 축소

사전 훈련된 GoogLeNet 컨벌루션 신경망을 불러옵니다.

net = imagePretrainedNetwork("googlenet");

신경망을 분석합니다. analyzeNetwork는 신경망 아키텍처에 대한 대화형 방식 플롯 그리고 신경망 계층에 대한 정보를 포함하는 표를 표시합니다.

info = analyzeNetwork(net);

왼쪽에 있는 플롯을 사용하여 신경망 아키텍처를 살펴봅니다. 플롯에서 계층을 하나 선택합니다. 선택한 계층은 플롯과 계층 표에서 강조 표시됩니다.

표에서 계층 속성, 계층 유형, 계층 활성화 크기, 학습 가능한 파라미터와 같은 계층 정보를 확인합니다. 계층의 활성화는 해당 계층의 출력값입니다. 각 활성화 차원에는 다음 중 하나의 레이블이 지정됩니다.

  • S — 공간

  • C — 채널

  • B — 배치 관측값

  • T — 시간 또는 시퀀스

  • U — 지정되지 않음

데이터가 어떤 방식으로 신경망을 통과해 전파되는지 그리고 계층이 활성화의 크기와 레이아웃을 어떻게 수정하는지 파악하려면 차원 레이블을 확인하십시오.

신경망에서 더 깊은 계층을 하나 선택합니다. 더 깊은 계층에서의 활성화는 공간 차원(처음 2개 차원)은 더 작고 채널 차원(마지막 차원)은 더 큰 것을 알 수 있습니다. 이 구조를 사용하면 컨벌루션 신경망이 공간 분해능을 줄이면서 추출된 영상 특징 개수를 서서히 늘릴 수 있습니다.

딥러닝 신경망 분석기는 신경망에 있는 학습 가능한 파라미터의 전체 개수를 소수점 첫째 자리까지 보여줍니다. 학습 가능한 파라미터의 정확한 개수를 확인하려면 전체 학습 가능 파라미터에서 잠시 멈추십시오. 각 계층에서 학습 가능한 파라미터의 개수를 표시하려면 계층 표의 오른쪽 위 코너에 있는 화살표를 클릭하고 학습 가능 개수를 선택하십시오. 열 값을 기준으로 계층 표를 정렬하려면 열 제목 위에 커서를 올렸을 때 표시되는 화살표를 클릭합니다. 예를 들어, 계층을 학습 가능한 파라미터 개수를 기준으로 정렬하여 가장 많은 파라미터를 포함하는 계층이 무엇인지 확인할 수 있습니다.

신경망 분석 결과를 프로그래밍 방식으로 표시합니다.

info
info = 
  NetworkAnalysis with properties:

    TotalLearnables: 6998552
          LayerInfo: [143×7 table]
             Issues: [0×3 table]
          NumErrors: 0
        NumWarnings: 0
       AnalysisDate: 11-Dec-2023 17:48:12

몇 곳에 건너뛰기 연결(skip connection)이 있는 간단한 컨벌루션 신경망을 만듭니다.

net = dlnetwork;

layers = [
    imageInputLayer([32 32 3])
    convolution2dLayer(5,16,Padding="same")
    reluLayer(Name="relu_1")
    convolution2dLayer(3,16,Padding="same",Stride=2)
    reluLayer
    additionLayer(2,Name="add_1")
    convolution2dLayer(3,16,Padding="same",Stride=2)
    reluLayer
    additionLayer(3,Name="add_2")
    fullyConnectedLayer(10)
    softmaxLayer];

net = addLayers(net,layers);

layer = convolution2dLayer(1,16,Stride=2,Name="conv_skip");
net = addLayers(net,layer);
net = connectLayers(net,"relu_1","add_1/in2");
net = connectLayers(net,"add_1","add_2/in2");

analyzeNetwork 함수를 사용하여 신경망 아키텍처를 분석합니다. 이 함수는 신경망의 세 개 계층에서 문제를 발견합니다.

analyzeNetwork(net)

신경망의 오류를 살펴보고 수정합니다. 이 예제에서는 다음과 같은 문제가 오류를 유발했습니다.

  • 신경망에 입력 계층과 연결되지 않은 입력이 있습니다. 이는 유효한 신경망의 필수 요건은 아닙니다. 하지만 입력 계층에 연결되지 않은 입력이 신경망에 있으면, analyzeNetwork 함수는 입력 데이터를 신경망을 통해 전파하여 다운스트림 문제가 있는지 확인하기 위해 표본 입력 데이터를 필요로 합니다. 이 신경망의 근본적인 문제는 연결이 누락되었거나 잘못 구성된 계층이 있는 것이므로 이 오류는 무시해도 됩니다.

  • "add_2" 계층은 3개의 입력을 갖도록 구성되어 있는데, 2개의 입력만 있습니다. 이 오류를 수정하려면 입력의 개수를 2로 지정합니다.

  • "conv_skip" 계층에 연결되지 않은 입력이 있습니다. 이 계층은 add_1 계층과 add_2 계층 간의 지름길 연결의 일부가 되어야 합니다. 이 오류를 수정하려면 "add_1""conv_skip"에 연결하고 "conv_skip""add_2"에 연결합니다.

  • 덧셈 계층에 대한 입력은 모두 크기가 같아야 하는데 "add_1" 계층의 두 입력이 서로 크기가 다릅니다. "conv_2" 계층의 Stride가 2이므로, 이 계층은 처음 두 차원(공간 차원)에서 인자 2로 활성화를 다운샘플링합니다. "relu_2" 계층에서 받는 입력의 크기가 "relu_1"에서 받는 입력의 크기와 같아지도록 하려면, "conv_2" 계층의 Stride 값을 제거하여 다운샘플링을 제거합니다.

이 예제의 첫 부분에서 생성한 신경망에 이러한 수정 사항을 적용하고 새로운 신경망을 만듭니다.

net = dlnetwork;

layers = [
    imageInputLayer([32 32 3])
    convolution2dLayer(5,16,Padding="same")
    reluLayer(Name="relu_1")
    convolution2dLayer(3,16,Padding="same")
    reluLayer
    additionLayer(2,Name="add_1")
    convolution2dLayer(3,16,Padding="same",Stride=2)
    reluLayer
    additionLayer(2,Name="add_2")
    fullyConnectedLayer(10)
    softmaxLayer];

net = addLayers(net,layers);

layer = convolution2dLayer(1,16,Stride=2,Name="conv_skip");
net = addLayers(net,layer);

net = connectLayers(net,"relu_1","add_1/in2");
net = connectLayers(net,"add_1","conv_skip");
net = connectLayers(net,"conv_skip","add_2/in2");

새 아키텍처를 분석합니다. 새 신경망에 오류가 없습니다. 이제 신경망을 훈련시킬 준비가 되었습니다.

analyzeNetwork(net)

입력 계층에 연결되지 않은 입력값을 갖는 신경망을 분석하려면 analyzeNetwork 함수에 신경망 표본 입력값을 제공하면 됩니다.

신경망 아키텍처를 정의합니다. 두 개의 분기가 있는 신경망을 만듭니다. 신경망은 분기당 하나의 입력값, 즉 두 개의 입력값을 받습니다. 덧셈 계층을 사용하여 분기를 연결합니다.

numFilters = 24;
inputSize = [64 64 3];

net = dlnetwork;

layersBranch1 = [
    convolution2dLayer(3,6*numFilters,Padding="same",Stride=2)
    groupNormalizationLayer("all-channels")
    reluLayer
    convolution2dLayer(3,numFilters,Padding="same")
    groupNormalizationLayer("channel-wise")
    additionLayer(2,Name="add")
    reluLayer
    fullyConnectedLayer(10)
    softmaxLayer];

layersBranch2 = [
    convolution2dLayer(1,numFilters,Name="conv_branch")
    groupNormalizationLayer("all-channels",Name="gn_branch")];

net = addLayers(net,layersBranch1);
net = addLayers(net,layersBranch2);
net = connectLayers(net,"gn_branch","add/in2");

신경망 입력값 이름을 확인합니다.

net.InputNames
ans = 1×2 cell
    {'conv_1'}    {'conv_branch'}

임의의 dlarray 객체를 사용하여 이 신경망의 일반적인 입력값과 동일한 크기와 형식의 신경망 표본 입력값을 만듭니다. 두 입력값 모두 배치 크기로 32를 사용합니다. 계층 "input"에 대한 입력값으로 세 개의 채널을 가진 64×64 크기의 입력값을 사용합니다. 계층 "conv_branch"에 대한 입력값으로 18개의 채널을 가진 64×64 크기의 입력값을 사용합니다.

X1 = dlarray(rand([inputSize 32]),"SSCB");
X2 = dlarray(rand([32 32 18 32]),"SSCB");

신경망을 분석합니다. dlnetworkInputNames 속성 순서와 동일한 순서로 표본 입력값을 제공합니다. 입력 계층에 연결된 입력값을 비롯하여 모든 신경망 입력값에 표본 입력값을 제공해야 합니다.

analyzeNetwork(net,X1,X2)

훈련되고 가지치기가 수행된 taylorPrunableNetwork 객체를 불러옵니다.

load("prunedDigitsCustom.mat");

신경망을 분석합니다. analyzeNetwork는 신경망 아키텍처에 대한 대화형 방식 플롯 그리고 신경망 계층에 대한 정보를 포함하는 표를 표시합니다. 다음 표에는 가지치기로 제거된 컨벌루션 필터의 개수가 나와 있습니다. 또한 각 계층마다 학습 가능한 파라미터 개수의 감소 비율도 나와 있습니다. 여기에는 이 세 개의 컨벌루션 계층뿐만 아니라 필터가 가지치기되지 않은 다른 계층들의 다운스트림 효과도 포함되어 있습니다.

info = analyzeNetwork(prunableNet);

계층 정보 테이블을 프로그래밍 방식으로 표시합니다.

info.LayerInfo
ans=12×9 table
      Name               Type             ActivationSizes    ActivationFormats                     LearnableSizes                     NumLearnables                       StateSizes                       LearnablesReduction    NumPrunedFilters
    _________    _____________________    _______________    _________________    ________________________________________________    _____________    ________________________________________________    ___________________    ________________

    "input"      "Image Input"            {[ 28 28 1 1]}        {["SSCB"]}        {[dictionary (string --> cell) with no entries]}            0        {[dictionary (string --> cell) with no entries]}                0                 0        
    "conv1"      "2-D Convolution"        {[24 24 18 1]}        {["SSCB"]}        {[dictionary (string --> cell) with 2 entries ]}          468        {[dictionary (string --> cell) with no entries]}              0.1                 2        
    "bn1"        "Batch Normalization"    {[24 24 18 1]}        {["SSCB"]}        {[dictionary (string --> cell) with 2 entries ]}           36        {[dictionary (string --> cell) with 2 entries ]}              0.1                 0        
    "relu1"      "ReLU"                   {[24 24 18 1]}        {["SSCB"]}        {[dictionary (string --> cell) with no entries]}            0        {[dictionary (string --> cell) with no entries]}                0                 0        
    "conv2"      "2-D Convolution"        {[24 24 18 1]}        {["SSCB"]}        {[dictionary (string --> cell) with 2 entries ]}         2934        {[dictionary (string --> cell) with no entries]}           0.1895                 2        
    "bn2"        "Batch Normalization"    {[24 24 18 1]}        {["SSCB"]}        {[dictionary (string --> cell) with 2 entries ]}           36        {[dictionary (string --> cell) with 2 entries ]}              0.1                 0        
    "relu2"      "ReLU"                   {[24 24 18 1]}        {["SSCB"]}        {[dictionary (string --> cell) with no entries]}            0        {[dictionary (string --> cell) with no entries]}                0                 0        
    "conv3"      "2-D Convolution"        {[24 24 16 1]}        {["SSCB"]}        {[dictionary (string --> cell) with 2 entries ]}         2608        {[dictionary (string --> cell) with no entries]}          0.27956                 4        
    "bn3"        "Batch Normalization"    {[24 24 16 1]}        {["SSCB"]}        {[dictionary (string --> cell) with 2 entries ]}           32        {[dictionary (string --> cell) with 2 entries ]}              0.2                 0        
    "relu3"      "ReLU"                   {[24 24 16 1]}        {["SSCB"]}        {[dictionary (string --> cell) with no entries]}            0        {[dictionary (string --> cell) with no entries]}                0                 0        
    "fc"         "Fully Connected"        {[      10 1]}        {["CB"  ]}        {[dictionary (string --> cell) with 2 entries ]}        92170        {[dictionary (string --> cell) with no entries]}          0.19998                 0        
    "softmax"    "Softmax"                {[      10 1]}        {["CB"  ]}        {[dictionary (string --> cell) with no entries]}            0        {[dictionary (string --> cell) with no entries]}                0                 0        

입력 인수

모두 축소

신경망 아키텍처로, dlnetwork 객체, 계층 배열 또는 taylorPrunableNetwork 객체로 지정됩니다.

내장 신경망 계층 목록은 딥러닝 계층 목록 항목을 참조하십시오.

taylorPrunableNetwork 객체를 분석하려면 Deep Learning Toolbox™ Model Quantization Library 지원 패키지가 필요합니다. 이 지원 패키지는 애드온 탐색기를 사용하여 다운로드할 수 있는 무료 애드온입니다. 또는 Deep Learning Toolbox Model Quantization Library를 참조하십시오.

신경망 분석 중에 표시할 플롯으로, 다음 값 중 하나로 지정됩니다.

  • "analyzer" — 분석 플롯을 표시합니다.

  • "none" — 분석 플롯을 표시하지 않습니다.

plotName"none"으로 지정한 경우 분석 결과에 액세스하려면 analyzeNetwork 함수의 출력값을 반환해야 합니다.

info = analyzeNetwork(net,Plots="none")

신경망 표본 입력값으로, 형식이 지정된 dlarray 객체로 지정됩니다. 소프트웨어는 신경망을 통해 표본 입력값을 전파하여 계층 활성화의 크기와 형식, 학습 가능한 파라미터와 상태 파라미터의 크기와 개수, 학습 가능한 파라미터의 전체 개수를 결정합니다.

입력 계층이 없거나 입력 계층에 연결되지 않은 입력값을 갖는 신경망을 분석하려고 할 때 표본 입력값을 사용합니다.

표본 입력값을 지정할 때 지켜야 하는 순서는 분석하고 있는 신경망 유형에 따라 다릅니다.

  • Layer 배열 — Layer 배열에 표시된, 입력값을 요구하는 계층의 순서와 동일한 순서로 표본 입력값을 제공합니다.

  • dlnetwork 객체 — dlnetworkInputNames 속성에 나열된 입력값 순서대로 표본 입력값을 제공합니다.

  • taylorPrunableNetwork 객체 (R2024a 이후)taylorPrunableNetworkInputNames 속성에 나열된 입력값 순서대로 표본 입력값을 제공합니다.

계층에 연결되지 않은 입력값이 여러 개 있으면 해당 계층의 표본 입력값은 계층의 InputNames 속성에 표시되는 순서와 동일하게 지정해야 합니다.

입력 계층에 해당 표본 입력값이 연결되어 있더라도 신경망의 각 입력값마다 하나의 표본 입력값을 지정해야 합니다.

출력 인수

모두 축소

분석 정보로, 다음과 같은 속성을 가진 NetworkAnalysis 객체로 반환됩니다.

  • TotalLearnables — 신경망의 학습 가능한 파라미터의 총 개수

  • LayerInfo — 계층 정보

  • Issues — 신경망 문제

  • NumErrors — 오류 개수

  • NumWarnings — 경고 개수

  • AnalysisDate — 분석 시간

버전 내역

R2018a에 개발됨

모두 확장