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

analyzeNetwork

심층 학습 네트워크 아키텍처 분석

설명

예제

analyzeNetwork(layers)layers로 지정된 심층 학습 네트워크 아키텍처를 분석합니다. analyzeNetwork 함수는 네트워크 아키텍처를 대화형 방식으로 표시하고, 네트워크의 오류와 문제를 검출하고, 네트워크 계층에 대한 상세한 정보를 제공합니다. 계층 정보에는 계층 활성화의 크기와 학습 가능한 파라미터, 학습 가능한 파라미터의 총 개수, 순환 계층의 상태 파라미터의 크기가 포함됩니다.

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

예제

모두 축소

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

net = googlenet
net = 
  DAGNetwork with properties:

         Layers: [144×1 nnet.cnn.layer.Layer]
    Connections: [170×2 table]

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

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

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

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

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

analyzeNetwork(net)

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

layers = [
    imageInputLayer([32 32 3],'Name','input')
    
    convolution2dLayer(5,16,'Padding','same','Name','conv_1')
    reluLayer('Name','relu_1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',2,'Name','conv_2')
    reluLayer('Name','relu_2') 
    additionLayer(2,'Name','add1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',2,'Name','conv_3')
    reluLayer('Name','relu_3') 
    additionLayer(3,'Name','add2')
    
    fullyConnectedLayer(10,'Name','fc')
    classificationLayer('Name','output')];

lgraph = layerGraph(layers);

지름길 연결을 만듭니다. 지름길 연결 중 하나는 단일 1x1 컨벌루션 계층 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)

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

  • 클래스 확률을 출력하는 소프트맥스 계층은 분류 계층 앞에 와야 합니다. output 분류 계층의 오류를 수정하려면 분류 계층 앞에 소프트맥스 계층을 추가합니다.

  • 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],'Name','input')
    
    convolution2dLayer(5,16,'Padding','same','Name','conv_1')
    reluLayer('Name','relu_1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',1,'Name','conv_2')
    reluLayer('Name','relu_2') 
    additionLayer(2,'Name','add1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',2,'Name','conv_3')
    reluLayer('Name','relu_3') 
    additionLayer(2,'Name','add2')
    
    fullyConnectedLayer(10,'Name','fc')
    softmaxLayer('Name','softmax');
    classificationLayer('Name','output')];

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)

입력 인수

모두 축소

네트워크 아키텍처로, Layer 배열, LayerGraph 객체, SeriesNetwork 객체 또는 DAGNetwork 객체로 지정됩니다.

R2018a에 개발됨