Main Content

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

analyzeNetwork

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

説明

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

ヒント

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

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

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

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

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

analyzeNetwork(net) は、SeriesNetwork オブジェクト、DAGNetwork オブジェクト、または dlnetwork オブジェクトの net を解析します。

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

すべて折りたたむ

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

net = googlenet;

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

analyzeNetwork(net)

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

table には、層のプロパティ、層のタイプ、層の活性化と学習可能なパラメーターのサイズなど、層の情報が表示されます。層の活性化は、その層の出力です。各活性化次元は、次のラベルのいずれかをもちます。

  • S — 空間

  • C — チャネル

  • B — バッチ観測値

  • T — 時間またはシーケンス

  • U — 指定なし

次元ラベルを表示して、データがネットワークを介してどのように伝播するか、および層が活性化のサイズとレイアウトをどのように変更するかを把握します。

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

深層学習ネットワーク アナライザーは、ネットワーク内の学習可能パラメーターの総数を小数点以下 1 桁まで表示します。学習可能パラメーターの正確な数を確認するには、[Learnables の総数] で一時停止します。各層の学習可能パラメーターの数を表示するには、層の table の右上隅にある矢印をクリックして、[Learnables の数] を選択します。列の値で層の table を並べ替えるには、列の見出しにマウスを移動して、表示される矢印をクリックします。たとえば、学習可能パラメーターの数で層を並べ替えると、どの層に最も多くのパラメーターが含まれているかを判別できます。

スキップ接続をいくつか使用してシンプルな畳み込みネットワークを作成します。ネットワークの主分岐を含む層配列を作成します。

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
    classificationLayer];

lgraph = layerGraph(layers);

層配列を層グラフに変換し、スキップ接続を追加します。スキップ接続の 1 つには、単一の 1 行 1 列の畳み込み層 conv_skip が含まれています。

layer = convolution2dLayer(1,16,Stride=2,Name="conv_skip");
lgraph = addLayers(lgraph,layer);
lgraph = connectLayers(lgraph,"relu_1","add_1/in2");
lgraph = connectLayers(lgraph,"add_1","add_2/in2");

関数 analyzeNetwork を使用してネットワーク アーキテクチャを解析します。この関数は、ネットワーク内の 3 つの層に関する問題を検出します。

analyzeNetwork(lgraph)

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

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

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

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

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

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
    classificationLayer];

lgraph = layerGraph(layers);

layer = convolution2dLayer(1,16,Stride=2,Name="conv_skip");
lgraph = addLayers(lgraph,layer);
lgraph = connectLayers(lgraph,"relu_1","add_1/in2");
lgraph = connectLayers(lgraph,"add_1","conv_skip");
lgraph = connectLayers(lgraph,"conv_skip","add_2/in2");

新しいアーキテクチャを解析します。新しいネットワークにはエラーが含まれず、学習の準備が整っています。

analyzeNetwork(lgraph)

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

layers = [
    imageInputLayer([28 28 1],Normalization="none")
    convolution2dLayer(5,20,Padding="same")
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,20,Padding="same")
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,20,Padding="same")
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(10)
    softmaxLayer];

関数 analyzeNetwork を使用して層配列を解析し、TargetUsage オプションを "dlnetwork" に設定します。

analyzeNetwork(layers,TargetUsage="dlnetwork")

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

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

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

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

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

lgraph = layerGraph(layersBranch1);
lgraph = addLayers(lgraph,layersBranch2);
lgraph = connectLayers(lgraph,"gn_branch","add/in2");

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

net = dlnetwork(lgraph,Initialize=false);

ネットワーク入力名を表示します。

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)

入力引数

すべて折りたたむ

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

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

深層学習ネットワーク。SeriesNetwork オブジェクト、DAGNetwork オブジェクト、または dlnetwork オブジェクトとして指定します。

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

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

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

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

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

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

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

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

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

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

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

バージョン履歴

R2018a で導入