ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

analyzeNetwork

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

説明

analyzeNetwork(layers) は、layers によって指定された深層学習ネットワーク アーキテクチャを解析します。関数 analyzeNetwork は、ネットワーク アーキテクチャを対話的に可視化して表示し、ネットワークのエラーや問題を検出して、ネットワーク層についての詳細情報を提供します。層の情報には、層の活性化と学習可能なパラメーターのサイズ、学習可能なパラメーターの総数、および再帰層の状態パラメーターのサイズが含まれます。

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

すべて折りたたむ

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

net = googlenet
net = 
  DAGNetwork with properties:

         Layers: [144×1 nnet.cnn.layer.Layer]
    Connections: [170×2 table]

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

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

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

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

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

analyzeNetwork(net)

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

layers = [
    imageInputLayer([32 32 3],'Name','input')
    
    convolution2dLayer(5,16,'Padding','same','Name','conv_1')
    reluLayer('Name','relu_1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',2,'Name','conv_2')
    reluLayer('Name','relu_2') 
    additionLayer(2,'Name','add1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',2,'Name','conv_3')
    reluLayer('Name','relu_3') 
    additionLayer(3,'Name','add2')
    
    fullyConnectedLayer(10,'Name','fc')
    classificationLayer('Name','output')];

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)

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

  • クラス確率を出力するソフトマックス層は、分類層の前に配置されていなければなりません。output 分類層のエラーを修正するには、分類層の前にソフトマックス層を追加します。

  • 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],'Name','input')
    
    convolution2dLayer(5,16,'Padding','same','Name','conv_1')
    reluLayer('Name','relu_1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',1,'Name','conv_2')
    reluLayer('Name','relu_2') 
    additionLayer(2,'Name','add1')
    
    convolution2dLayer(3,16,'Padding','same','Stride',2,'Name','conv_3')
    reluLayer('Name','relu_3') 
    additionLayer(2,'Name','add2')
    
    fullyConnectedLayer(10,'Name','fc')
    softmaxLayer('Name','softmax');
    classificationLayer('Name','output')];

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)

入力引数

すべて折りたたむ

ネットワーク アーキテクチャ。配列 LayerLayerGraph オブジェクト、SeriesNetwork オブジェクト、または DAGNetwork オブジェクトとして指定します。

R2018a で導入