Main Content

analyzeNetwork

深層学習ネットワーク アーキテクチャの解析

説明

analyzeNetwork を使用して、ネットワークのアーキテクチャを可視化して把握し、アーキテクチャが正しく定義されていることを確認して、学習前に問題を検出します。analyzeNetwork が検出する問題には、層入力のサイズの誤り、層の入力数の誤り、無効なニューラル ネットワーク構造などがあります。

ヒント

深層学習ニューラル ネットワークを対話的に構築して可視化するには、ディープ ネットワーク デザイナー アプリを使用します。詳細については、ディープ ネットワーク デザイナー入門を参照してください。

analyzeNetwork(net) は、指定されたネットワークまたは層配列を解析し、エラーと問題を検出します。関数は、ネットワーク アーキテクチャを対話的に可視化し、詳細情報を提供します。この情報には、層のタイプに加えて、層の学習可能なパラメーター、状態、活性化のサイズと形式、ならびに学習可能なパラメーターの総数が含まれます。

ネットワークに ProjectedLayer オブジェクトが含まれている場合、この関数は、学習可能なパラメーターの数が減少した割合に関する情報も表示します。

ネットワークが taylorPrunableNetwork オブジェクトである場合、この関数は、枝刈りによって削除された学習可能なパラメーターの割合と枝刈りされたフィルターの数に関する情報も表示します。

活性化の各次元は、"S" (空間)、"C" (チャネル)、"B" (バッチ)、"T" (時間またはシーケンス)、または "U" (指定なし) のいずれかのラベルをもちます。

analyzeNetwork(net,X1,...,Xn) は、指定されたサンプルのネットワーク入力を使用してニューラル ネットワークを解析します。ソフトウェアは、このサンプル入力をネットワーク全体に伝播させて、層の活性化のサイズと形式、学習可能パラメーターと状態パラメーターのサイズと数、および学習可能項目の総数を決定します。この構文を使用して、入力層に接続されていない入力が 1 つ以上存在するニューラル ネットワークを解析します。

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: 11-Dec-2023 17:48:12

スキップ接続をいくつか使用してシンプルな畳み込みネットワークを作成します。

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

ネットワークを解析します。dlnetworkInputNames プロパティと同じ順序でサンプル入力を与えます。入力層に接続されている入力も含め、すべてのネットワーク入力についてサンプル入力を与えなければなりません。

analyzeNetwork(net,X1,X2)

学習済みで枝刈り済みの taylorPrunableNetwork オブジェクトを読み込みます。

load("prunedDigitsCustom.mat");

ネットワークを解析します。analyzeNetwork は、ネットワーク アーキテクチャの対話型プロット、およびネットワーク層についての情報が含まれる table を表示します。この table には、枝刈りされた畳み込みフィルターの数が表示されます。この table には、各層の学習可能なパラメーターの数が減少した割合も表示されます。ここでは、3 つの畳み込み層が示されており、さらに、枝刈りされたフィルターをもたない他の層における下流への影響も示されています。

analyzeNetwork(prunableNet)

入力引数

すべて折りたたむ

ニューラル ネットワーク アーキテクチャ。dlnetwork オブジェクト、層配列、または taylorPrunableNetwork オブジェクトとして指定します。

組み込みのニューラル ネットワーク層の一覧については、深層学習層の一覧を参照してください。

taylorPrunableNetwork オブジェクトを解析するには、Deep Learning Toolbox™ Model Quantization Library サポート パッケージが必要です。このサポート パッケージは無料のアドオンで、アドオン エクスプローラーを使用してダウンロードできます。または、Deep Learning Toolbox Model Quantization Library を参照してください。

ニューラル ネットワークの解析中に表示するプロット。次のいずれかの値として指定します。

  • "analyzer" — 解析プロットを表示します。

  • "none" — 解析プロットを表示しません。

plotName"none" として指定した場合、解析結果にアクセスするには、関数 analyzeNetwork の出力を返さなければなりません。

info = analyzeNetwork(net,Plots="none")

サンプルのネットワーク入力。形式を整えた dlarray オブジェクトとして指定します。ソフトウェアは、このサンプル入力をネットワーク全体に伝播させて、層の活性化のサイズと形式、学習可能パラメーターと状態パラメーターのサイズと数、および学習可能項目の総数を決定します。

入力層がないネットワーク、または入力層に接続されていない入力が存在するネットワークを解析する場合、このサンプル入力を使用します。

指定すべきサンプル入力の順序は、解析対象のネットワークのタイプによって異なります。

  • 配列 Layer — 入力が配列 Layer に現れる必要がある層と同じ順序でサンプル入力を与えます。

  • dlnetwork オブジェクト — dlnetworkInputNames プロパティにリストされている入力と同じ順序でサンプル入力を与えます。

  • taylorPrunableNetwork オブジェクト (R2024a 以降)taylorPrunableNetworkInputNames プロパティにリストされている入力と同じ順序でサンプル入力を与えます。

未接続の入力が複数存在する層の場合、その層の InputNames プロパティに現れるのと同じ順序で、その層のサンプル入力を指定しなければなりません。

入力が入力層に接続されている場合でも、ネットワークの各入力についてサンプル入力を 1 つ指定しなければなりません。

出力引数

すべて折りたたむ

解析情報。以下のプロパティをもつ NetworkAnalysis オブジェクトとして返されます。

  • TotalLearnables — ネットワークの学習可能なパラメーターの総数

  • LayerInfo — 層の情報

  • Issues — ネットワークの問題

  • NumErrors — エラーの数

  • NumWarnings — 警告の数

  • AnalysisDate — 解析時間

バージョン履歴

R2018a で導入

すべて展開する