analyzeNetwork
딥러닝 신경망 아키텍처 분석
구문
설명
analyzeNetwork
를 사용해서 신경망을 시각화하여 이해하고, 아키텍처를 올바르게 정의했는지 확인하고, 훈련 전에 문제를 파악합니다. analyzeNetwork
는 계층 입력 크기가 올바르지 않은 경우, 계층 입력 개수가 올바르지 않은 경우, 신경망 구조가 유효하지 않은 경우 등의 문제를 파악합니다.
팁
딥러닝 신경망을 대화형 방식으로 구축하고 시각화하려면 심층 신경망 디자이너 앱을 사용하십시오. 자세한 내용은 심층 신경망 디자이너 시작하기 항목을 참조하십시오.
analyzeNetwork(
은 지정된 신경망 또는 계층 배열을 분석하여 오류와 문제를 검출합니다. 이 함수는 신경망 아키텍처에 대한 대화형 방식 시각화를 표시하고 상세한 정보를 제공합니다. 정보에는 계층 유형, 계층의 학습 가능한 파라미터, 상태, 활성화의 크기와 형식, 학습 가능한 파라미터의 총 개수가 포함됩니다.net
)
신경망에 ProjectedLayer
객체가 포함된 경우 함수는 학습 가능한 파라미터가 사영에 의해 제거된 비율에 대한 정보를 추가로 표시합니다.
신경망이 taylorPrunableNetwork
객체인 경우 함수는 가지치기를 통해 제거된 학습 가능한 파라미터의 비율과 가지치기된 필터 개수에 대한 정보를 추가로 표시합니다.
각 활성화 차원은 "S"
(공간), "C"
(채널), "B"
(배치), "T"
(시간 또는 시퀀스), "U"
(지정되지 않음) 중에서 한 레이블을 가집니다.
는 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");
신경망을 분석합니다. dlnetwork
의 InputNames
속성 순서와 동일한 순서로 표본 입력값을 제공합니다. 입력 계층에 연결된 입력값을 비롯하여 모든 신경망 입력값에 표본 입력값을 제공해야 합니다.
analyzeNetwork(net,X1,X2)
테일러 가지치기 신경망(Taylor Prunable Network) 분석하기
훈련되고 가지치기가 수행된 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
입력 인수
net
— 신경망 아키텍처
dlnetwork
객체 | 계층 배열 | taylorPrunableNetwork
객체 (R2024a 이후)
신경망 아키텍처로, dlnetwork
객체, 계층 배열 또는 taylorPrunableNetwork
객체로 지정됩니다.
내장 신경망 계층 목록은 딥러닝 계층 목록 항목을 참조하십시오.
taylorPrunableNetwork
객체를 분석하려면 Deep Learning Toolbox™ Model Quantization Library 지원 패키지가 필요합니다. 이 지원 패키지는 애드온 탐색기를 사용하여 다운로드할 수 있는 무료 애드온입니다. 또는 Deep Learning Toolbox Model Quantization Library를 참조하십시오.
plotName
— 신경망 분석 중에 표시할 플롯
"analyzer"
(디폴트 값) | "none"
신경망 분석 중에 표시할 플롯으로, 다음 값 중 하나로 지정됩니다.
"analyzer"
— 분석 플롯을 표시합니다."none"
— 분석 플롯을 표시하지 않습니다.
plotName
을 "none"
으로 지정한 경우 분석 결과에 액세스하려면 analyzeNetwork
함수의 출력값을 반환해야 합니다.
info = analyzeNetwork(net,Plots="none")
X1,...,Xn
— 신경망 표본 입력값
형식이 지정된 dlarray
객체
신경망 표본 입력값으로, 형식이 지정된 dlarray
객체로 지정됩니다. 소프트웨어는 신경망을 통해 표본 입력값을 전파하여 계층 활성화의 크기와 형식, 학습 가능한 파라미터와 상태 파라미터의 크기와 개수, 학습 가능한 파라미터의 전체 개수를 결정합니다.
입력 계층이 없거나 입력 계층에 연결되지 않은 입력값을 갖는 신경망을 분석하려고 할 때 표본 입력값을 사용합니다.
표본 입력값을 지정할 때 지켜야 하는 순서는 분석하고 있는 신경망 유형에 따라 다릅니다.
Layer
배열 —Layer
배열에 표시된, 입력값을 요구하는 계층의 순서와 동일한 순서로 표본 입력값을 제공합니다.dlnetwork
객체 —dlnetwork
의InputNames
속성에 나열된 입력값 순서대로 표본 입력값을 제공합니다.taylorPrunableNetwork
객체 (R2024a 이후) —taylorPrunableNetwork
의InputNames
속성에 나열된 입력값 순서대로 표본 입력값을 제공합니다.
계층에 연결되지 않은 입력값이 여러 개 있으면 해당 계층의 표본 입력값은 계층의 InputNames
속성에 표시되는 순서와 동일하게 지정해야 합니다.
입력 계층에 해당 표본 입력값이 연결되어 있더라도 신경망의 각 입력값마다 하나의 표본 입력값을 지정해야 합니다.
출력 인수
info
— 분석 정보
NetworkAnalysis
객체
분석 정보로, 다음과 같은 속성을 가진 NetworkAnalysis
객체로 반환됩니다.
TotalLearnables
— 신경망의 학습 가능한 파라미터의 총 개수LayerInfo
— 계층 정보Issues
— 신경망 문제NumErrors
— 오류 개수NumWarnings
— 경고 개수AnalysisDate
— 분석 시간
버전 내역
R2018a에 개발됨R2024b: 압축과 관련된 신경망 분석 정보에 프로그래밍 방식으로 액세스함
R2024b부터는 입력 신경망이 taylorPrunableNetwork
객체이거나 ProjectedLayer
객체를 포함하는 경우 analyzeNetwork
함수의 출력값에 압축 관련 정보가 포함됩니다.
R2024a: 신경망 분석 정보에 프로그래밍 방식으로 액세스함
R2024a부터는 analyzeNetwork
함수의 출력값을 반환할 수 있습니다. 이 함수는 분석 정보를 NetworkAnalysis
객체로 반환합니다. 이 객체를 사용하여 분석 결과에 프로그래밍 방식으로 액세스할 수 있습니다. 예를 들어 학습 가능한 파라미터의 총 개수, 계층 정보, 신경망 문제에 액세스할 수 있습니다.
R2024a: 테일러 가지치기 신경망 및 투영 계층이 포함된 신경망을 분석함
R2024a부터는 taylorPrunableNetwork
객체를 분석하거나 ProjectedLayer
객체를 포함하는 신경망을 분석할 수 있습니다.
R2024a: SeriesNetwork
객체, DAGNetwork
객체, LayerGraph
객체는 권장되지 않음
R2024a부터 trainNetwork
함수 및 SeriesNetwork
, DAGNetwork
, LayerGraph
객체는 권장되지 않습니다. 대신 trainnet
함수와 dlnetwork
객체를 사용하십시오. 이 권장 사항은 analyzeNetwork
함수에 대해 SeriesNetwork
, DAGNetwork
, LayerGraph
입력값을 사용하는 것을 권장하지 않는다는 의미입니다.
SeriesNetwork
, DAGNetwork
, LayerGraph
의 경우 analyzeNetwork
함수는 trainNetwork
워크플로의 신경망을 분석합니다. 여기에는 입력 계층과 출력 계층에 대한 검사가 포함됩니다.
R2024a: 기본적으로 analyzeNetwork
는 dlnetwork
객체에 대해 분석을 수행함
R2024a부터 analyzeNetwork
는 dlnetwork
객체 워크플로의 계층 배열을 분석합니다. 이전 버전에서는 analyzeNetwork
함수는 trainNetwork
워크플로의 계층 배열을 분석했습니다. 이 동작을 재현하려면 analyzeNetwork(layers,TargetUsage="trainNetwork")
를 사용하십시오.
R2024a부터 trainNetwork
함수 및 SeriesNetwork
, DAGNetwork
, LayerGraph
객체는 권장되지 않습니다. 대신 trainnet
함수와 dlnetwork
객체를 사용하십시오. 이 권장 사항은 analyzeNetwork
함수에 대해 SeriesNetwork
, DAGNetwork
, LayerGraph
입력값을 사용하는 것을 권장하지 않는다는 의미입니다.
R2024a부터는 analyzeNetwork
함수의 출력값을 반환할 수 있습니다. 이 함수는 분석 정보를 NetworkAnalysis
객체로 반환합니다. 이 객체를 사용하여 분석 결과에 프로그래밍 방식으로 액세스할 수 있습니다. 예를 들어 학습 가능한 파라미터의 총 개수, 계층 정보, 신경망 문제에 액세스할 수 있습니다.
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)