ドキュメンテーション

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

additionLayer

説明

加算層は、複数のニューラル ネットワーク層からの入力を要素単位で加算します。

作成時に層への入力の数を指定します。層への入力の名前は 'in1','in2',...,'inN' になります。N は入力の数です。connectLayers または disconnectLayers を使用して層の結合または切り離しを行うときには、入力名を使用します。加算層へのすべての入力の次元は同じでなければなりません。

作成

説明

layer = additionLayer(numInputs) は、numInputs 個の入力を要素単位で加算する加算層を作成します。この関数は、NumInputs プロパティも設定します。

layer = additionLayer(numInputs,'Name',Name) は、Name プロパティも設定します。加算層を含むネットワークを作成するには、層の名前を指定しなければなりません。

プロパティ

すべて展開する

層への入力の数。正の整数として指定します。

入力の名前は 'in1','in2',...,'inN' になります。NNumInputs に等しい値です。たとえば、NumInputs が 3 である場合、入力の名前は 'in1','in2' および 'in3' になります。connectLayers または disconnectLayers を使用して層の結合または切り離しを行うときには、入力名を使用します。

層の名前。文字ベクトルまたは string スカラーとして指定します。層グラフにこの層を含めるには、層の名前を指定しなければなりません。

データ型: char | string

入力名。{'in1','in2',...,'inN'} として指定します。ここで、N は層の入力の数です。

データ型: cell

層の出力の数。この層には単一の出力のみがあります。

データ型: double

層の出力名。この層には単一の出力のみがあります。

データ型: cell

すべて折りたたむ

2 つの入力があり、名前が 'add_1' である加算層を作成します。

add = additionLayer(2,'Name','add_1')
add = 
  AdditionLayer with properties:

          Name: 'add_1'
     NumInputs: 2
    InputNames: {'in1'  'in2'}

2 つの ReLU 層を作成し、これらの層を加算層に結合します。加算層で ReLU 層の出力が加算されます。

relu_1 = reluLayer('Name','relu_1');
relu_2 = reluLayer('Name','relu_2');

lgraph = layerGraph;
lgraph = addLayers(lgraph,relu_1);
lgraph = addLayers(lgraph,relu_2);
lgraph = addLayers(lgraph,add);

lgraph = connectLayers(lgraph,'relu_1','add_1/in1');
lgraph = connectLayers(lgraph,'relu_2','add_1/in2');

plot(lgraph)

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

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

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

ネットワークの主分岐を層配列として作成します。加算層では複数の入力が要素単位で合計されます。加算層で合計する入力数を指定します。すべての層に名前があり、すべての名前が一意でなければなりません。

layers = [
    imageInputLayer([28 28 1],'Name','input')
    
    convolution2dLayer(5,16,'Padding','same','Name','conv_1')
    batchNormalizationLayer('Name','BN_1')
    reluLayer('Name','relu_1')
    
    convolution2dLayer(3,32,'Padding','same','Stride',2,'Name','conv_2')
    batchNormalizationLayer('Name','BN_2')
    reluLayer('Name','relu_2')
    convolution2dLayer(3,32,'Padding','same','Name','conv_3')
    batchNormalizationLayer('Name','BN_3')
    reluLayer('Name','relu_3')
    
    additionLayer(2,'Name','add')
    
    averagePooling2dLayer(2,'Stride',2,'Name','avpool')
    fullyConnectedLayer(10,'Name','fc')
    softmaxLayer('Name','softmax')
    classificationLayer('Name','classOutput')];

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

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

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

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

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

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

数字の 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);

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

net
net = 
  DAGNetwork with properties:

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

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

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

R2017b で導入