Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

analyzeNetwork

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

설명

analyzeNetwork를 사용해서 신경망을 시각화하여 이해하고, 아키텍처를 올바르게 정의했는지 확인하고, 훈련 전에 문제를 파악합니다. analyzeNetwork에서 검출하는 문제에는 계층이 누락되었거나 연결이 끊긴 경우, 계층 입력 크기가 올바르지 않은 경우, 계층 입력 개수가 올바르지 않은 경우, 그래프 구조가 유효하지 않은 경우 등이 포함됩니다.

대화형 방식으로 신경망을 시각화, 분석 및 훈련시키려면 deepNetworkDesigner(net)을 사용하십시오. 자세한 내용은 심층 신경망 디자이너를 참조하십시오.

훈련된 신경망

예제

analyzeNetwork(net)SeriesNetwork 또는 DAGNetwork 객체 net을 분석합니다. 함수는 신경망 아키텍처에 대한 대화형 방식 시각화를 표시하고 신경망 계층에 대한 상세한 정보를 제공합니다. 계층 정보에는 계층 활성화, 학습 가능한 파라미터, 상태 파라미터의 개수와 크기가 포함됩니다.

신경망 계층

예제

analyzeNetwork(layers)layers에 지정된 신경망을 분석하고 trainNetwork 워크플로의 오류와 문제도 검출합니다. layersLayer 배열 또는 LayerGraph 객체가 될 수 있습니다. 함수는 신경망 아키텍처에 대한 대화형 방식 시각화를 표시하고 신경망 계층에 대한 상세한 정보를 제공합니다. 계층 정보에는 계층 활성화, 학습 가능한 파라미터, 상태 파라미터의 개수와 크기가 포함됩니다.

예제

analyzeNetwork(layers,'TargetUsage',target)은 지정된 대상 워크플로를 위해 layers에 지정된 신경망 계층을 분석합니다. dlnetwork 워크플로의 Layer 배열 또는 계층 그래프를 분석할 때 이 구문을 사용하십시오.

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

dlnetwork 객체

analyzeNetwork(dlnet)은 사용자 지정 훈련 루프 워크플로를 위해 dlnetwork 객체를 분석합니다. 함수는 신경망 아키텍처에 대한 대화형 방식 시각화를 표시하고 신경망 계층에 대한 상세한 정보를 제공합니다. 계층 정보에는 계층 활성화, 학습 가능한 파라미터, 상태 파라미터의 개수와 크기가 포함됩니다.

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

예제

모두 축소

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

net = googlenet
net = 
  DAGNetwork with properties:

         Layers: [144×1 nnet.cnn.layer.Layer]
    Connections: [170×2 table]
     InputNames: {'data'}
    OutputNames: {'output'}

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

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

표에서 계층 속성, 계층 유형, 계층 활성화 크기, 학습 가능한 파라미터와 같은 계층 정보를 확인합니다. 계층의 활성화는 해당 계층의 출력값입니다.

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

각 계층에서 학습 가능한 파라미터의 총 개수를 표시하려면 계층 표의 오른쪽 위 코너에 있는 화살표를 클릭하고 전체 학습 가능 파라미터를 선택합니다. 열 값을 기준으로 계층 표를 정렬하려면 열 제목 위에 커서를 올렸을 때 표시되는 화살표를 클릭합니다. 예를 들어, 계층을 학습 가능한 파라미터의 총 개수를 기준으로 정렬하여 가장 많은 파라미터를 포함하는 계층이 무엇인지 확인할 수 있습니다.

analyzeNetwork(net)

지름길 연결을 갖는 간단한 컨벌루션 신경망을 만듭니다. 신경망의 기본 분기를 계층 배열로 만들고 계층 배열에서 계층 그래프를 만듭니다. layerGraphlayers의 모든 계층을 순차적으로 연결합니다.

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','add1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',2)
    reluLayer
    additionLayer(3,'Name','add2')
    
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

lgraph = layerGraph(layers);

지름길 연결을 만듭니다. 지름길 연결 중 하나는 단일 1×1 컨벌루션 계층 skipConv를 갖습니다.

skipConv = convolution2dLayer(1,16,'Stride',2,'Name','skipConv');
lgraph = addLayers(lgraph,skipConv);
lgraph = connectLayers(lgraph,'relu_1','add1/in2');
lgraph = connectLayers(lgraph,'add1','add2/in2');

신경망 아키텍처를 분석합니다. analyzeNetwork가 신경망에서 4개의 오류를 찾았습니다.

analyzeNetwork(lgraph)

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

  • skipConv 계층이 신경망의 나머지에 연결되어 있지 않습니다. add1 계층과 add2 계층 간의 지름길 연결의 일부가 되어야 합니다. 이 오류를 수정하려면 add1skipConv에 연결하고 skipConvadd2에 연결합니다.

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

  • 덧셈 계층의 입력값은 모두 크기가 같아야 하는데 add1 계층의 입력값 2개는 크기가 서로 다릅니다. conv_2 계층의 'Stride' 값이 2이므로, 이 계층은 처음 2개의 차원(공간 차원)에서 2배만큼 활성화를 다운샘플링합니다. relu1에서 받는 입력값과 크기가 같아지도록 relu2 계층에서 받는 입력값의 크기를 조정하려면 conv_2 계층의 'Stride' 값을 1로 설정하여 다운샘플링을 제거합니다.

이 예제의 첫 부분에서 생성한 계층 그래프에 이러한 수정 사항을 적용하고 새로운 계층 그래프를 만듭니다.

layers = [
    imageInputLayer([32 32 3])
    
    convolution2dLayer(5,16,'Padding','same')
    reluLayer('Name','relu_1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',1)
    reluLayer
    additionLayer(2,'Name','add1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',2)
    reluLayer
    additionLayer(2,'Name','add2')
    
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

lgraph = layerGraph(layers);

skipConv = convolution2dLayer(1,16,'Stride',2,'Name','skipConv');
lgraph = addLayers(lgraph,skipConv);
lgraph = connectLayers(lgraph,'relu_1','add1/in2');
lgraph = connectLayers(lgraph,'add1','skipConv');
lgraph = connectLayers(lgraph,'skipConv','add2/in2');

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

analyzeNetwork(lgraph)

사용자 지정 훈련 루프의 계층 그래프를 만듭니다. 사용자 지정 훈련 루프 워크플로의 경우, 계층 그래프가 출력 계층을 가지면 안 됩니다.

layers = [
    imageInputLayer([28 28 1],'Normalization','none','Name','input')
    convolution2dLayer(5, 20,'Name','conv1')
    batchNormalizationLayer('Name','bn1')
    reluLayer('Name','relu1')
    convolution2dLayer(3,20,'Padding',1,'Name','conv2')
    batchNormalizationLayer('Name','bn2')
    reluLayer('Name','relu2')
    convolution2dLayer(3, 20,'Padding', 1,'Name','conv3')
    batchNormalizationLayer('Name','bn3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(10,'Name','fc')
    softmaxLayer('Name','softmax')];

lgraph = layerGraph(layers);

analyzeNetwork 함수를 사용하여 계층 그래프를 분석하고 'TargetUsage' 옵션을 'dlnetwork'로 설정합니다.

analyzeNetwork(lgraph,'TargetUsage','dlnetwork')

이 경우 함수는 계층 그래프에서 문제를 보고하지 않습니다.

입력 계층에 연결되지 않은 입력값을 갖는 신경망을 분석하려면 analyzeNetwork 함수에 신경망 표본 입력값을 제공하면 됩니다. 'TargetUsage','dlnetwork' 이름-값 옵션을 사용하는 사용자 지정 훈련 워크플로를 위해 dlnetwork 객체를 분석하거나 Layer 배열 또는 LayerGraph 객체를 분석할 때 표본 입력값을 제공할 수 있습니다.

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

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

layersBranch1 = [
    imageInputLayer(inputSize,'Normalization','none','Name','input')
    convolution2dLayer(3,6*numFilters,'Padding','same','Stride',2,'Name','conv1Branch1')
    groupNormalizationLayer('all-channels','Name','gn1Branch1')
    reluLayer('Name','relu1Branch1')
    convolution2dLayer(3,numFilters,'Padding','same','Name','conv2Branch1')
    groupNormalizationLayer('channel-wise','Name','gn2Branch1')
    additionLayer(2,'Name','add')
    reluLayer('Name','reluCombined')
    fullyConnectedLayer(10,'Name','fc')
    softmaxLayer('Name','sm')];

layersBranch2 = [
    convolution2dLayer(1,numFilters,'Name','convBranch2')
    groupNormalizationLayer('all-channels','Name','gnBranch2')];

lgraph = layerGraph(layersBranch1);
lgraph = addLayers(lgraph,layersBranch2);
lgraph = connectLayers(lgraph,'gnBranch2','add/in2');  

dlnetwork를 만듭니다. 이 신경망에는 연결되지 않은 입력값이 포함되므로 'Initialize' 이름-값 옵션을 false로 설정하여 초기화되지 않은 dlnetwork 객체를 만듭니다.

dlnet = dlnetwork(lgraph,'Initialize',false);

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

exampleInput = dlarray(rand([inputSize 32]),'SSCB');
exampleConvBranch2 = dlarray(rand([32 32 18 32]),'SSCB');

표본 입력값을 제공하는 순서를 확인하려면 신경망의 Layers 속성을 살펴보십시오.

dlnet.Layers
ans = 
  12×1 Layer array with layers:

     1   'input'          Image Input           64×64×3 images
     2   'conv1Branch1'   Convolution           144 3×3 convolutions with stride [2  2] and padding 'same'
     3   'gn1Branch1'     Group Normalization   Group normalization
     4   'relu1Branch1'   ReLU                  ReLU
     5   'conv2Branch1'   Convolution           24 3×3 convolutions with stride [1  1] and padding 'same'
     6   'gn2Branch1'     Group Normalization   Group normalization
     7   'add'            Addition              Element-wise addition of 2 inputs
     8   'reluCombined'   ReLU                  ReLU
     9   'fc'             Fully Connected       10 fully connected layer
    10   'sm'             Softmax               softmax
    11   'convBranch2'    Convolution           24 1×1 convolutions with stride [1  1] and padding [0  0  0  0]
    12   'gnBranch2'      Group Normalization   Group normalization

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

analyzeNetwork(dlnet,exampleInput,exampleConvBranch2)

입력 인수

모두 축소

훈련된 신경망으로, SeriesNetwork 또는 DAGNetwork 객체로 지정됩니다. 사전 훈련된 신경망을 가져오거나(예: googlenet 함수 사용) trainNetwork를 사용하여 자신만의 고유한 신경망을 훈련시켜 훈련된 신경망을 얻을 수 있습니다.

신경망 계층으로, Layer 배열 또는 LayerGraph 객체로 지정됩니다.

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

사용자 지정 훈련 루프에 대한 신경망으로, dlnetwork 객체로 지정됩니다.

대상 워크플로로, 다음 중 하나로 지정됩니다.

  • 'trainNetwork'trainNetwork 함수를 사용한 경우의 계층 그래프를 분석합니다. 예를 들어, 함수는 계층 그래프에 하나의 출력 계층이 있고 연결되지 않은 계층 출력값은 없음을 확인합니다.

  • 'dlnetwork'dlnetwork 객체를 사용한 경우의 계층 그래프를 분석합니다. 예를 들어, 함수는 계층 그래프에 출력 계층이 없음을 확인합니다.

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

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

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

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

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

  • dlnetworkdlnetworkInputNames 속성에 나열된 입력값 순서대로 표본 입력값을 제공합니다.

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

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

버전 내역

R2018a에 개발됨