Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

analyzeNetwork

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

説明

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

ヒント

ネットワークの可視化、解析、および学習を対話的に行うには、deepNetworkDesigner(net) を使用します。詳細については、ディープ ネットワーク デザイナーを参照してください。

学習済みネットワーク

analyzeNetwork(net)SeriesNetwork または DAGNetwork オブジェクトの net を解析します。関数は、ネットワーク アーキテクチャを対話的に可視化し、ネットワーク層についての詳細情報を提供します。層の情報には、層の活性化、学習可能パラメーター、状態パラメーターの数とサイズが含まれます。

ネットワーク層

analyzeNetwork(layers) は、layers で指定されたネットワーク層を解析し、trainNetwork ワークフローのエラーと問題も検出します。layers には、配列 Layer または LayerGraph オブジェクトを指定できます。関数は、ネットワーク アーキテクチャを対話的に可視化し、ネットワーク層についての詳細情報を提供します。層の情報には、層の活性化、学習可能パラメーター、状態パラメーターの数とサイズが含まれます。

analyzeNetwork(layers,'TargetUsage',target) は、指定されたターゲット ワークフローの layers で指定されたネットワーク層を解析します。この構文は、dlnetwork ワークフローの配列 Layer または層グラフを解析するときに使用します。

analyzeNetwork(layers,dlX1,...,dlXn,'TargetUsage','dlnetwork') は、サンプルのネットワーク入力 dlX1,...,dlXn を使用してネットワーク層を解析します。このソフトウェアは、このサンプル入力をネットワーク全体に伝播させて、層の活性化、学習可能パラメーター、状態パラメーターの数とサイズを判断します。この構文を使用して、入力層に接続されていない入力が 1 つ以上存在するネットワークを解析します。

dlnetwork オブジェクト

analyzeNetwork(dlnet) は、カスタム学習ループ ワークフローの dlnetwork オブジェクトを解析します。関数は、ネットワーク アーキテクチャを対話的に可視化し、ネットワーク層についての詳細情報を提供します。層の情報には、層の活性化、学習可能パラメーター、状態パラメーターの数とサイズが含まれます。

analyzeNetwork(dlnet,dlX1,...,dlXn) は、サンプルのネットワーク入力 dlX1,...,dlXn を使用して dlnetwork オブジェクトを解析します。このソフトウェアは、このサンプル入力をネットワーク全体に伝播させて、層の活性化、学習可能パラメーター、状態パラメーターの数とサイズを判断します。この構文を使用して、入力層に接続されていない入力が 1 つ以上存在する未初期化の dlnetwork を解析します。

すべて折りたたむ

事前学習済み GoogLeNet 畳み込みニューラル ネットワークを読み込みます。

net = googlenet
net = 
  DAGNetwork with properties:

         Layers: [144×1 nnet.cnn.layer.Layer]
    Connections: [170×2 table]
     InputNames: {'data'}
    OutputNames: {'output'}

ネットワークを解析します。analyzeNetwork は、ネットワーク アーキテクチャの対話型プロット、およびネットワーク層についての情報が含まれる table を表示します。

左側のプロットを使用してネットワーク アーキテクチャを調べます。プロットで層を選択します。選択した層は、プロットと層の table で強調表示されます。

table には、層のプロパティ、層のタイプ、層の活性化と学習可能なパラメーターのサイズなど、層の情報が表示されます。層の活性化は、その層の出力です。

ネットワークのさらに深い層を選択します。深い層の活性化は、空間次元 (最初の 2 つの次元) が小さくなり、チャネルの次元 (最後の次元) が大きくなることに注目してください。畳み込みニューラル ネットワークについてこの構造を使用すると、空間分解能を下げながら、抽出されるイメージの特徴の数を徐々に増やすことができます。

層の table の右上隅にある矢印をクリックし、[学習可能の総数] を選択して、学習可能なパラメーターの総数を表示します。列の値で層の table を並べ替えるには、列の見出しにマウスを移動して、表示される矢印をクリックします。たとえば、学習可能なパラメーターの総数で層を並べ替えると、含まれるパラメーターが最も多い層を判別できます。

analyzeNetwork(net)

ショートカット結合を使用してシンプルな畳み込みネットワークを作成します。ネットワークの主分岐を層配列として作成し、その層配列から層グラフを作成します。layerGraph は、layers のすべての層を順に結合します。

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','add1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',2)
    reluLayer
    additionLayer(3,'Name','add2')
    
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

lgraph = layerGraph(layers);

ショートカット結合を作成します。ショートカット結合の 1 つには、単一の 1 x 1 畳み込み層 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)

ネットワークのエラーを調べて修正します。この例では、次の問題が原因でエラーが発生しています。

  • skipConv 層が残りのネットワークに結合されていません。これは add1 層と add2 層のショートカット結合に含まれている必要があります。このエラーを修正するには、add1skipConv に結合し、skipConvadd2 に結合します。

  • add2 層の入力が 3 つになるように指定されていますが、この層の入力は 2 つしかありません。このエラーを修正するには、入力の数に 2 を指定します。

  • 加算層へのすべての入力のサイズは同じでなければなりませんが、add1 層にサイズが異なる 2 つの入力があります。conv_2 層の 'Stride' の値が 2 であるため、この層では最初の 2 つの次元 (空間次元) において係数 2 で活性化のダウンサンプリングが行われます。relu2 層からの入力のサイズを relu1 からの入力のサイズと同じになるように変更するには、conv_2 層の 'Stride' の値を 1 に設定してダウンサンプリングを削除します。

この例の開始時からの層グラフの構築にこれらの変更を適用し、新しい層グラフを作成します。

layers = [
    imageInputLayer([32 32 3])
    
    convolution2dLayer(5,16,'Padding','same')
    reluLayer('Name','relu_1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',1)
    reluLayer
    additionLayer(2,'Name','add1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',2)
    reluLayer
    additionLayer(2,'Name','add2')
    
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

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)

カスタム学習ループの層グラフを作成します。カスタム学習ループ ワークフローの場合、層グラフに出力層があってはなりません。

layers = [
    imageInputLayer([28 28 1],'Normalization','none','Name','input')
    convolution2dLayer(5, 20,'Name','conv1')
    batchNormalizationLayer('Name','bn1')
    reluLayer('Name','relu1')
    convolution2dLayer(3,20,'Padding',1,'Name','conv2')
    batchNormalizationLayer('Name','bn2')
    reluLayer('Name','relu2')
    convolution2dLayer(3, 20,'Padding', 1,'Name','conv3')
    batchNormalizationLayer('Name','bn3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(10,'Name','fc')
    softmaxLayer('Name','softmax')];

lgraph = layerGraph(layers);

関数 analyzeNetwork を使用して層グラフを解析し、'TargetUsage' オプションを 'dlnetwork' に設定します。

analyzeNetwork(lgraph,'TargetUsage','dlnetwork')

関数の報告によれば、この層グラフには何の問題もありません。

入力層に接続されていない入力が存在するネットワークを解析するには、関数 analyzeNetwork にサンプルのネットワーク入力を与えます。dlnetwork オブジェクトを解析する場合、またはカスタム学習ワークフロー用の配列 LayerLayerGraph オブジェクトを解析する場合は、名前と値のオプション 'TargetUsage','dlnetwork' を使用してサンプル入力を与えることができます。

ネットワーク アーキテクチャの定義。2 つの分岐をもつネットワークを構築します。このネットワークは 2 つの入力を取ります (各分岐から入力を 1 つずつ取ります)。加算層を使用して分岐を接続します。

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

layersBranch1 = [
    imageInputLayer(inputSize,'Normalization','none','Name','input')
    convolution2dLayer(3,6*numFilters,'Padding','same','Stride',2,'Name','conv1Branch1')
    groupNormalizationLayer('all-channels','Name','gn1Branch1')
    reluLayer('Name','relu1Branch1')
    convolution2dLayer(3,numFilters,'Padding','same','Name','conv2Branch1')
    groupNormalizationLayer('channel-wise','Name','gn2Branch1')
    additionLayer(2,'Name','add')
    reluLayer('Name','reluCombined')
    fullyConnectedLayer(10,'Name','fc')
    softmaxLayer('Name','sm')];

layersBranch2 = [
    convolution2dLayer(1,numFilters,'Name','convBranch2')
    groupNormalizationLayer('all-channels','Name','gnBranch2')];

lgraph = layerGraph(layersBranch1);
lgraph = addLayers(lgraph,layersBranch2);
lgraph = connectLayers(lgraph,'gnBranch2','add/in2');  

dlnetwork を作成します。このネットワークには未接続の入力が含まれているため、名前と値のオプション 'Initialize'false に設定して、未初期化の dlnetwork オブジェクトを作成します。

dlnet = dlnetwork(lgraph,'Initialize',false);

このネットワークの標準的な入力とサイズおよび形式が等しいサンプルのネットワーク入力を作成します。どちらの入力もバッチ サイズは 32 とします。'input' 層の入力として、3 つのチャネルをもつ 64 行 64 列のサイズの入力を使用します。'convBranch2' 層の入力として、18 個のチャネルをもつ 64 行 64 列のサイズの入力を使用します。

exampleInput = dlarray(rand([inputSize 32]),'SSCB');
exampleConvBranch2 = dlarray(rand([32 32 18 32]),'SSCB');

ネットワークの Layers プロパティを調べ、サンプル入力を与える順序を決定します。

dlnet.Layers
ans = 
  12×1 Layer array with layers:

     1   'input'          Image Input           64×64×3 images
     2   'conv1Branch1'   Convolution           144 3×3 convolutions with stride [2  2] and padding 'same'
     3   'gn1Branch1'     Group Normalization   Group normalization
     4   'relu1Branch1'   ReLU                  ReLU
     5   'conv2Branch1'   Convolution           24 3×3 convolutions with stride [1  1] and padding 'same'
     6   'gn2Branch1'     Group Normalization   Group normalization
     7   'add'            Addition              Element-wise addition of 2 inputs
     8   'reluCombined'   ReLU                  ReLU
     9   'fc'             Fully Connected       10 fully connected layer
    10   'sm'             Softmax               softmax
    11   'convBranch2'    Convolution           24 1×1 convolutions with stride [1  1] and padding [0  0  0  0]
    12   'gnBranch2'      Group Normalization   Group normalization

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

analyzeNetwork(dlnet,exampleInput,exampleConvBranch2)

入力引数

すべて折りたたむ

学習済みネットワーク。SeriesNetwork または DAGNetwork オブジェクトとして指定します。事前学習済みのネットワークをインポートする (たとえば、関数 googlenet を使用する)、または trainNetwork を使用して独自のネットワークに学習させることによって、学習済みネットワークを取得できます。

ネットワーク層。Layer 配列または LayerGraph オブジェクトとして指定します。

組み込まれている層の一覧については、深層学習層の一覧を参照してください。

カスタム学習ループのネットワーク。dlnetwork オブジェクトとして指定します。

ターゲット ワークフロー。次のいずれかとして指定します。

  • 'trainNetwork' — 関数 trainNetwork で使用するために層グラフを解析します。たとえば、関数は、層グラフが出力層をもち、切り離された層出力がないことをチェックします。

  • 'dlnetwork'dlnetwork オブジェクトで使用するために層グラフを解析します。たとえば、関数は、層グラフが出力層をもたないことをチェックします。

サンプルのネットワーク入力。書式付き dlarray オブジェクトとして指定します。このソフトウェアは、このサンプル入力をネットワーク全体に伝播させて、層の活性化、学習可能パラメーター、状態パラメーターの数とサイズを判断します。

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

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

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

  • LayerGraph — 入力が LayerGraphLayers プロパティに現れる必要がある層と同じ順序でサンプル入力を与えます。

  • dlnetworkdlnetworkInputNames プロパティにリストされている入力と同じ順序でサンプル入力を与えます。

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

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

バージョン履歴

R2018a で導入