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
は、ネットワーク アーキテクチャの対話型プロット、およびネットワーク層についての情報が含まれる table を表示します。
info = analyzeNetwork(net);
左側のプロットを使用してネットワーク アーキテクチャを調べます。プロットで層を選択します。選択した層は、プロットと層の table で強調表示されます。
table には、層のプロパティ、層のタイプ、層の活性化と学習可能なパラメーターのサイズなど、層の情報が表示されます。層の活性化は、その層の出力です。各活性化次元は、次のラベルのいずれかをもちます。
S — 空間
C — チャネル
B — バッチ観測値
T — 時間またはシーケンス
U — 指定なし
次元ラベルを表示して、データがネットワークを介してどのように伝播するか、および層が活性化のサイズとレイアウトをどのように変更するかを把握します。
ネットワークのさらに深い層を選択します。深い層の活性化は、空間次元 (最初の 2 つの次元) が小さくなり、チャネルの次元 (最後の次元) が大きくなることに注目してください。畳み込みニューラル ネットワークについてこの構造を使用すると、空間分解能を下げながら、抽出されるイメージの特徴の数を徐々に増やすことができます。
深層学習ネットワーク アナライザーは、ネットワーク内の学習可能なパラメーターの総数を小数点以下 1 桁まで表示します。学習可能なパラメーターの正確な数を確認するには、[学習可能なパラメーターの総数] にカーソルを合わせます。各層の学習可能なパラメーターの数を表示するには、層の table の右上隅にある矢印をクリックして、[Learnables の数] を選択します。列の値で層の table を並べ替えるには、列の見出しにマウスを移動して、表示される矢印をクリックします。たとえば、学習可能なパラメーターの数で層を並べ替えると、どの層に最も多くのパラメーターが含まれているかを判別できます。
ネットワークの解析結果をプログラムによって表示します。
info
info = NetworkAnalysis with properties: TotalLearnables: 6998552 LayerInfo: [143×7 table] Issues: [0×3 table] NumErrors: 0 NumWarnings: 0 AnalysisDate: 23-Oct-2024 15:45:17
スキップ接続をいくつか使用してシンプルな畳み込みネットワークを作成します。
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
を使用してネットワーク アーキテクチャを解析します。この関数は、ネットワーク内の 3 つの層に関する問題を検出します。
analyzeNetwork(net)
ネットワークのエラーを調べて修正します。この例では、次の問題が原因でエラーが発生しています。
入力層に接続されていない入力がネットワークに存在します。これはニューラル ネットワークが有効であるための要件ではありませんが、入力層に接続されていない入力がネットワークに存在する場合、関数
analyzeNetwork
で下流の問題を特定するには、ネットワークに伝播させるためのサンプルの入力データが必要となります。このネットワークの根本的な問題は接続の欠損または層の設定ミスであるため、このエラーは無視して構いません。"add_2"
層は入力が 3 つになるように構成されていますが、この層の入力は 2 つしかありません。このエラーを修正するには、入力の数に2
を指定します。層
"conv_skip"
には未接続の入力があります。これはadd_1
層とadd_2
層のショートカット結合に含まれている必要があります。このエラーを修正するには、"add_1"
を"conv_skip"
に結合し、"conv_skip"
を"add_2"
に結合します。加算層へのすべての入力のサイズは同じでなければなりませんが、
"add_1"
層にサイズが異なる 2 つの入力があります。"conv_2"
層のStride
が 2 であるため、この層では最初の 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
にサンプルのネットワーク入力を与えます。
ネットワーク アーキテクチャを定義します。2 つの分岐をもつネットワークを構築します。このネットワークは 2 つの入力を取ります (各分岐から入力を 1 つずつ取ります)。加算層を使用して分岐を接続します。
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"
層の入力として、3 つのチャネルをもつ 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)
学習済みで枝刈り済みの TaylorPrunableNetwork
オブジェクトを読み込みます。
load("prunedDigitsCustom.mat");
ネットワークを解析します。analyzeNetwork
関数は、ネットワーク アーキテクチャの対話型プロット、およびネットワーク層についての情報が含まれる table を表示します。この table には、枝刈りされた畳み込みフィルターの数が表示されます。この table には、各層の学習可能なパラメーターの数が減少した割合も表示されます。枝刈りの影響には、3 つの畳み込み層での学習可能なパラメーターの削減だけでなく、枝刈りされたフィルターをもたない他の層における下流への影響も含まれます。
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 Compression Library サポート パッケージが必要です。このサポート パッケージは無料のアドオンで、アドオン エクスプローラーを使用してダウンロードできます。または、Deep Learning Toolbox Model Compression Library を参照してください。
ニューラル ネットワークの解析中に表示するプロット。次のいずれかの値として指定します。
"analyzer"
— 解析プロットを表示します。"none"
— 解析プロットを表示しません。
plotName
を "none"
として指定した場合、解析結果にアクセスするには、関数 analyzeNetwork
の出力を返さなければなりません。
info = analyzeNetwork(net,Plots="none")
サンプルのネットワーク入力。形式を整えた dlarray
オブジェクトとして指定します。ソフトウェアは、このサンプル入力をネットワーク全体に伝播させて、層の活性化のサイズと形式、学習可能なパラメーターと状態パラメーターのサイズと数、および学習可能項目の総数を決定します。
入力層がないネットワーク、または入力層に接続されていない入力が存在するネットワークを解析する場合、このサンプル入力を使用します。
指定すべきサンプル入力の順序は、解析対象のネットワークのタイプによって異なります。
配列
Layer
— 入力が配列Layer
に現れる必要がある層と同じ順序でサンプル入力を与えます。dlnetwork
オブジェクト —dlnetwork
のInputNames
プロパティにリストされている入力と同じ順序でサンプル入力を与えます。taylorPrunableNetwork
オブジェクト (R2024a 以降) —taylorPrunableNetwork
のInputNames
プロパティにリストされている入力と同じ順序でサンプル入力を与えます。
未接続の入力が複数存在する層の場合、その層の InputNames
プロパティに現れるのと同じ順序で、その層のサンプル入力を指定しなければなりません。
入力が入力層に接続されている場合でも、ネットワークの各入力についてサンプル入力を 1 つ指定しなければなりません。
出力引数
解析情報。以下のプロパティをもつ NetworkAnalysis
オブジェクトとして返されます。
TotalLearnables
— ネットワークの学習可能なパラメーターの総数LayerInfo
— 層の情報Issues
— ネットワークの問題NumErrors
— エラーの数NumWarnings
— 警告の数AnalysisDate
— 解析時間
バージョン履歴
R2018a で導入R2024b 以降では、入力ネットワークが taylorPrunableNetwork
オブジェクトであるか、ProjectedLayer
オブジェクトを含む場合、圧縮固有の情報が analyzeNetwork
関数の出力に含められます。
R2024a 以降、関数 analyzeNetwork
の出力を返せるようになりました。この関数は、解析情報を NetworkAnalysis
オブジェクトで返します。このオブジェクトを使用し、プログラムによって解析結果にアクセスします。たとえば、学習可能なパラメーターの総数、層の情報、ネットワークの問題にアクセスできます。
R2024a 以降、taylorPrunableNetwork
オブジェクトの解析、および ProjectedLayer
オブジェクトを含むニューラル ネットワークの解析を行えるようになりました。
R2024a 以降、関数 trainNetwork
、SeriesNetwork
オブジェクト、DAGNetwork
オブジェクト、および LayerGraph
オブジェクトは非推奨となりました。代わりに、関数 trainnet
および dlnetwork
オブジェクトを使用してください。この推奨により、SeriesNetwork
、DAGNetwork
、および LayerGraph
の関数 analyzeNetwork
への入力も非推奨となります。
SeriesNetwork
、DAGNetwork
、および LayerGraph
については、関数 analyzeNetwork
が trainNetwork
のワークフローでニューラル ネットワークを解析します。その際、入力層と出力層のチェックが行われます。
R2024a 以降、analyzeNetwork
は dlnetwork
オブジェクトのワークフローで層配列を解析します。以前のバージョンでは、関数 analyzeNetwork
は trainNetwork
のワークフローで層配列を解析します。この動作を再現するには、analyzeNetwork(layers,TargetUsage="trainNetwork")
を使用します。
R2024a 以降、関数 trainNetwork
、SeriesNetwork
オブジェクト、DAGNetwork
オブジェクト、および LayerGraph
オブジェクトは非推奨となりました。代わりに、関数 trainnet
および dlnetwork
オブジェクトを使用してください。この推奨により、SeriesNetwork
、DAGNetwork
、および LayerGraph
の関数 analyzeNetwork
への入力も非推奨となります。
R2024a 以降、関数 analyzeNetwork
の出力を返せるようになりました。この関数は、解析情報を NetworkAnalysis
オブジェクトで返します。このオブジェクトを使用し、プログラムによって解析結果にアクセスします。たとえば、学習可能なパラメーターの総数、層の情報、ネットワークの問題にアクセスできます。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- 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)