Main Content

analyzeNetwork

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

설명

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

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

예제

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

각 활성화 차원에는 S(공간), C(채널), B(배치), T(시간 또는 시퀀스), U(지정되지 않음) 중 하나의 레이블이 지정됩니다.

예제

analyzeNetwork(layers,TargetUsage=target)은 계층 배열 또는 계층 그래프 layers에서 주어진 신경망 계층을 지정된 대상 워크플로에 기반하여 분석합니다. dlnetwork 워크플로에 기반하여 계층을 분석하려면 이 구문을 사용하십시오.

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

예제

analyzeNetwork(net)SeriesNetwork, DAGNetwork 또는 dlnetwork 객체 net을 분석합니다.

예제

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

예제

모두 축소

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

net = googlenet;

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

analyzeNetwork(net)

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

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

  • S — 공간

  • C — 채널

  • B — 배치 관측값

  • T — 시간 또는 시퀀스

  • U — 지정되지 않음

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

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

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

몇 곳에 건너뛰기 연결(skip connection)이 있는 간단한 컨벌루션 신경망을 만듭니다. 신경망의 기본 분기를 포함하는 계층 배열을 만듭니다.

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
    classificationLayer];

lgraph = layerGraph(layers);

계층 배열을 계층 그래프로 변환하고 건너뛰기 연결을 추가합니다. 건너뛰기 연결 중 하나는 단일 1×1 컨벌루션 계층 conv_skip을 갖습니다.

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

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

analyzeNetwork(lgraph)

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

  • 계층 conv_skip이 신경망의 나머지에 연결되어 있지 않습니다. 이 계층은 add_1 계층과 add_2 계층 간의 지름길 연결의 일부가 되어야 합니다. 이 오류를 수정하려면 add_1conv_skip에 연결하고 conv_skipadd_2에 연결합니다.

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

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

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

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
    classificationLayer];

lgraph = layerGraph(layers);

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

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

analyzeNetwork(lgraph)

사용자 지정 훈련 루프의 계층 배열을 만듭니다. 사용자 지정 훈련 루프 워크플로의 경우, 신경망이 출력 계층을 가지면 안 됩니다.

layers = [
    imageInputLayer([28 28 1],Normalization="none")
    convolution2dLayer(5,20,Padding="same")
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,20,Padding="same")
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,20,Padding="same")
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(10)
    softmaxLayer];

analyzeNetwork 함수를 사용하여 계층 배열을 분석하고 TargetUsage 옵션을 "dlnetwork"로 설정합니다.

analyzeNetwork(layers,TargetUsage="dlnetwork")

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

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

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

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

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")];

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

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

net = dlnetwork(lgraph,Initialize=false);

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

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)

입력 인수

모두 축소

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

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

딥러닝 신경망으로, SeriesNetwork, DAGNetwork 또는 dlnetwork 객체로 지정됩니다.

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

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

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

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

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

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

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

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

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

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

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

버전 내역

R2018a에 개발됨