Main Content

layerGraph

深層学習用のネットワーク層のグラフ

説明

層グラフは、層に複数の層からの入力と複数の層への出力がある、より複雑なグラフ構造の深層学習ネットワークのアーキテクチャを指定します。このような構造を持つネットワークは有向非循環グラフ (DAG) ネットワークと呼ばれます。layerGraph オブジェクトの作成後は、オブジェクト関数を使用してグラフをプロットしたり、層の追加、削除、結合、および切り離しによってグラフを変更したりできます。ネットワークに学習させるには、関数 trainNetwork への入力として層グラフを使用するか、dlnetwork に変換し、カスタム学習ループを使用して学習させます。

作成

説明

lgraph = layerGraph は、層が含まれない空の層グラフを作成します。関数 addLayers を使用して空のグラフに層を追加できます。

lgraph = layerGraph(layers) は、ネットワーク層の配列から層グラフを作成し、Layers プロパティを設定します。lgraph に含まれる層は、layers と同じ順序で結合されます。

lgraph = layerGraph(net)SeriesNetwork オブジェクト、DAGNetwork オブジェクト、または dlnetwork オブジェクトの層グラフを抽出します。たとえば、事前学習済みのネットワークの層グラフを抽出して、転移学習を実行できます。

入力引数

すべて展開する

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

プロパティ

すべて展開する

このプロパティは読み取り専用です。

ネットワーク層。Layer 配列として指定します。

このプロパティは読み取り専用です。

層の結合。2 列の table として指定します。

各 table 行は層グラフの結合を表します。1 列目の Source は、各結合の結合元を指定します。2 列目の Destination は、各結合の結合先を指定します。結合元と結合先は層の名前であるか、'layerName/IOName' の形式を取ります。'IOName' は層の入力または出力の名前です。

データ型: table

このプロパティは読み取り専用です。

ネットワーク入力層の名前。文字ベクトルの cell 配列として指定します。

データ型: cell

ネットワーク出力層の名前。文字ベクトルの cell 配列として指定します。

データ型: cell

オブジェクト関数

addLayers層グラフへの層の追加
removeLayers層グラフからの層の削除
replaceLayerReplace layer in layer graph
connectLayers層グラフの層の結合
disconnectLayers層グラフの層の切り離し
plotPlot neural network layer graph

すべて折りたたむ

空の層グラフと層の配列を作成します。層グラフに層を追加し、グラフをプロットします。addLayers によって層が順に結合されます。

lgraph = layerGraph;

layers = [
    imageInputLayer([32 32 3],'Name','input')  
    convolution2dLayer(3,16,'Padding','same','Name','conv_1')
    batchNormalizationLayer('Name','BN_1')
    reluLayer('Name','relu_1')];

lgraph = addLayers(lgraph,layers);
figure
plot(lgraph)

Figure contains an axes object. The axes object contains an object of type graphplot.

層の配列を作成します。

layers = [
    imageInputLayer([28 28 1],'Name','input')  
    convolution2dLayer(3,16,'Padding','same','Name','conv_1')
    batchNormalizationLayer('Name','BN_1')
    reluLayer('Name','relu_1')];

層配列から層グラフを作成します。layerGraphlayers のすべての層を順に結合します。層グラフをプロットします。

lgraph = layerGraph(layers);
figure
plot(lgraph)

Figure contains an axes object. The axes object contains an object of type graphplot.

事前学習済みの SqueezeNet ネットワークを読み込みます。この学習済みネットワークを分類と予測に使用できます。

net = squeezenet;

ネットワーク構造を変更するには、まず layerGraph を使用して DAG ネットワークの構造を抽出します。次に、LayerGraph のオブジェクト関数を使用して、ネットワーク アーキテクチャを変更できます。

lgraph = layerGraph(net)
lgraph = 
  LayerGraph with properties:

         Layers: [68x1 nnet.cnn.layer.Layer]
    Connections: [75x2 table]
     InputNames: {'data'}
    OutputNames: {'ClassificationLayer_predictions'}

深層学習用のシンプルな有向非循環グラフ (DAG) ネットワークを作成します。数字のイメージを分類するようネットワークに学習させます。この例のシンプルなネットワークは、以下から構成されます。

  • 逐次結合層による主分岐。

  • 単一の 1 x 1 畳み込み層を含む "ショートカット結合"。ショートカット結合は、パラメーターの勾配がネットワークの出力層からより初期の層へとよりスムーズに流れるようにします。

ネットワークの主分岐を層配列として作成します。加算層では複数の入力が要素単位で合計されます。加算層で合計する入力数を指定します。後で簡単に結合を追加できるように、最初の ReLU 層と加算層の名前を指定します。

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

層配列から層グラフを作成します。layerGraphlayers のすべての層を順に結合します。層グラフをプロットします。

lgraph = layerGraph(layers);
figure
plot(lgraph)

Figure contains an axes object. The axes object contains an object of type graphplot.

1 x 1 畳み込み層を作成し、層グラフに追加します。活性化のサイズが 3 番目の ReLU 層の活性化のサイズと一致するように、畳み込みフィルターの数とストライドを指定します。この方法により、加算層で 3 番目の ReLU 層と 1 x 1 畳み込み層の出力を加算できます。層がグラフに含まれることを確認するには、層グラフをプロットします。

skipConv = convolution2dLayer(1,32,'Stride',2,'Name','skipConv');
lgraph = addLayers(lgraph,skipConv);
figure
plot(lgraph)

Figure contains an axes object. The axes object contains an object of type graphplot.

'relu_1' 層から 'add' 層へのショートカット結合を作成します。層の作成時に加算層への入力数を 2 に指定しているため、層には 'in1' および 'in2' という名前の 2 つの入力があります。3 番目の ReLU 層は既に 'in1' 入力に結合されています。'relu_1' 層を 'skipConv' 層に結合し、'skipConv' 層を 'add' 層の 'in2' 入力に結合します。ここで加算層は 3 番目の ReLU 層と 'skipConv' 層の出力を合計します。層が正しく結合されていることを確認するには、層グラフをプロットします。

lgraph = connectLayers(lgraph,'relu_1','skipConv');
lgraph = connectLayers(lgraph,'skipConv','add/in2');
figure
plot(lgraph);

Figure contains an axes object. The axes object contains an object of type graphplot.

数字の 28 x 28 のグレースケール イメージで構成される学習データと検証データを読み込みます。

[XTrain,YTrain] = digitTrain4DArrayData;
[XValidation,YValidation] = digitTest4DArrayData;

学習オプションを指定してネットワークに学習させます。trainNetwork は、ValidationFrequency 回の反復ごとに検証データを使用してネットワークを検証します。

options = trainingOptions('sgdm', ...
    'MaxEpochs',8, ...
    'Shuffle','every-epoch', ...
    'ValidationData',{XValidation,YValidation}, ...
    'ValidationFrequency',30, ...
    'Verbose',false, ...
    'Plots','training-progress');
net = trainNetwork(XTrain,YTrain,lgraph,options);

Figure Training Progress (11-Feb-2022 22:26:53) contains 2 axes objects and another object of type uigridlayout. Axes object 1 contains 15 objects of type patch, text, line. Axes object 2 contains 15 objects of type patch, text, line.

学習済みネットワークのプロパティを表示します。ネットワークは DAGNetwork オブジェクトになります。

net
net = 
  DAGNetwork with properties:

         Layers: [16x1 nnet.cnn.layer.Layer]
    Connections: [16x2 table]
     InputNames: {'imageinput'}
    OutputNames: {'classoutput'}

検証イメージを分類し、精度を計算します。ネットワークは非常に正確になっています。

YPredicted = classify(net,XValidation);
accuracy = mean(YPredicted == YValidation)
accuracy = 0.9932

バージョン履歴

R2017b で導入