Main Content

groupedConvolution2dLayer

グループ化された 2 次元畳み込み層

説明

グループ化された 2 次元畳み込み層は、入力チャネルをグループに分けて、スライディング畳み込みフィルターを適用します。チャネル方向に分離可能な (深さ方向に分離可能とも呼ばれる) 畳み込みには、グループ化された畳み込み層を使用します。

この層では、各グループについて、入力に沿って垂直方向および水平方向にフィルターを移動させ、重みと入力のドット積を計算し、バイアス項を加算することによって、入力を畳み込みます。この層は、各グループの畳み込みを個別に結合します。グループの数がチャネルの数に等しい場合、この層はチャネル方向で畳み込みを実行します。

作成

説明

layer = groupedConvolution2dLayer(filterSize,numFiltersPerGroup,numGroups) は、グループ化された 2 次元畳み込み層を作成し、FilterSizeNumFiltersPerGroup、および NumGroups の各プロパティを設定します。

layer = groupedConvolution2dLayer(filterSize,numFiltersPerGroup,'channel-wise') は、チャネル方向の畳み込み (深さ方向の畳み込みとも呼ばれる) を行う層を作成します。この場合、ソフトウェアは学習時に NumGroups プロパティを決定します。この構文は、NumGroups を入力チャネル数に設定することと等価です。

layer = groupedConvolution2dLayer(___,Name,Value) は、名前と値のペアを使用して、オプションの StrideDilationFactorパラメーターと初期化学習率および正則化、および Name の各プロパティを設定します。入力パディングを指定するには、名前と値のペアの引数 'Padding' を使用します。たとえば、groupedConvolution2dLayer(5,128,2,'Padding','same') は、サイズが [5 5] である 128 個のフィルターから成る 2 つのグループで構成されたグループ化済みの 2 次元畳み込み層を作成し、出力が同じサイズとなるように入力をパディングします。複数の名前と値のペアを指定できます。各プロパティ名を一重引用符で囲みます。

入力引数

すべて展開する

名前と値の引数

コンマ区切りの名前と値のペアの引数を使用して、層の入力の端に沿って追加するパディングのサイズを指定するか、StrideDilationFactorパラメーターと初期化学習率および正則化、および Name の各プロパティを設定します。名前を一重引用符で囲みます。

例: groupedConvolution2dLayer(5,128,2,'Padding','same') は、サイズが [5 5] である 128 個のフィルターから成る 2 つのグループで構成されたグループ化済みの 2 次元畳み込み層を作成し、出力が同じサイズとなるように入力をパディングします。

入力の端のパディング。'Padding' と、次の値のいずれかから成るコンマ区切りのペアとして指定します。

  • 'same' — ストライドが 1 である場合、出力サイズが入力サイズと同じになるように、学習時または予測時にサイズが計算されたパディングを追加します。ストライドが 1 より大きい場合、出力サイズは ceil(inputSize/stride) になります。ここで、inputSize は入力の高さまたは幅、stride は対応する次元のストライドです。可能な場合、上下および左右に同じ量のパディングが追加されます。垂直方向に追加しなければならないパディングの値が奇数の場合、余ったパディングは下に追加されます。水平方向に追加しなければならないパディングの値が奇数の場合、余ったパディングは右に追加されます。

  • 非負の整数 p — サイズ p のパディングを入力のすべての端に追加します。

  • 非負の整数のベクトル [a b] — サイズ a のパディングを入力の上下に追加し、サイズ b のパディングを左右に追加します。

  • 非負の整数のベクトル [t b l r] — サイズが tblr のパディングを、それぞれ入力の上、下、左、右に追加します。

例: 'Padding',1 は、入力の上下に 1 行のパディングを追加し、入力の左右に 1 列のパディングを追加します。

例: 'Padding','same' は、(ストライドが 1 の場合) 出力サイズが入力サイズと同じになるようにパディングを追加します。

プロパティ

すべて展開する

グループ化された畳み込み

フィルターの高さと幅。2 つの正の整数のベクトル [h w] として指定します。h は高さ、w は幅です。FilterSize は、入力でニューロンが結合する局所領域のサイズを定義します。

層を作成する場合、FilterSize をスカラーとして指定して、高さと幅に同じ値を使用できます。

例: [5 5] は、高さが 5、幅が 5 のフィルターを指定します。

グループごとのフィルターの数。正の整数として指定します。このプロパティによって、層の出力に含まれるチャネルの数が決まります。出力チャネルの数は FiltersPerGroup * NumGroups です。

例: 10

グループの数。正の整数または 'channel-wise' として指定します。

NumGroups'channel-wise' の場合、ソフトウェアはチャネル方向の畳み込み (深さ方向の畳み込みとも呼ばれる) を行うための層を作成します。この場合、層は学習時に NumGroups プロパティを決定します。この値は、NumGroups を入力チャネル数に設定することと等価です。

グループの数は、層の入力に含まれるチャネルの数で割り切れなければなりません。

例: 2

入力を垂直方向および水平方向に走査するステップ サイズ。2 つの正の整数のベクトル [a b] として指定します。a は垂直方向のステップ サイズ、b は水平方向のステップ サイズです。層を作成する場合、Stride をスカラーとして指定して、両方のステップ サイズに同じ値を使用できます。

例: [2 3] は、垂直方向のステップ サイズとして 2、水平方向のステップ サイズとして 3 を指定します。

膨張畳み込み (Atrous 畳み込みとも呼ばれる) の係数。2 つの正の整数のベクトル [h w] として指定します。h は垂直方向の膨張、w は水平方向の膨張です。層を作成する場合、DilationFactor をスカラーとして指定して、水平方向と垂直方向の両方の膨張に同じ値を使用できます。

膨張畳み込みを使用して、パラメーターの数や計算量を増やさずに、層の受容野 (層で確認できる入力の領域) を増やすことができます。

各フィルター要素間にゼロを挿入すると、層のフィルターが拡張されます。膨張係数は、入力のサンプリングのステップ サイズ、またはこれと等価であるフィルターのアップサンプリング係数を決定します。これは、有効なフィルター サイズ (Filter Size – 1) .* Dilation Factor + 1 に相当します。たとえば、膨張係数 [2 2] の 3 行 3 列のフィルターは、要素間にゼロが挿入された 5 行 5 列のフィルターと等価です。

例: [2 3]

入力の境界に適用するパディングのサイズ。4 つの非負の整数のベクトル [t b l r] として指定します。t は上に適用されるパディング、b は下に適用されるパディング、l は左に適用されるパディング、r は右に適用されるパディングです。

層の作成時に、名前と値のペアの引数 'Padding' を使用してパディングのサイズを指定します。

例: [1 1 2 2] は、入力の上下に 1 行のパディングを追加し、入力の左右に 2 列のパディングを追加します。

パディングのサイズを決定するメソッド。'manual' または 'same' として指定します。

PaddingMode の値は、層の作成時に指定した 'Padding' 値に基づいて自動的に設定されます。

  • 'Padding' オプションをスカラーまたは非負の整数のベクトルに設定した場合、PaddingMode'manual' に自動的に設定されます。

  • 'Padding' オプションを 'same' に設定した場合、PaddingMode'same' に自動的に設定されます。ストライドが 1 である場合、出力サイズが入力サイズと同じになるように、学習時にパディングのサイズが計算されます。ストライドが 1 より大きい場合、出力サイズは ceil(inputSize/stride) になります。ここで、inputSize は入力の高さまたは幅、stride は対応する次元のストライドです。可能な場合、上下および左右に同じ量のパディングが追加されます。垂直方向に追加しなければならないパディングの値が奇数の場合、余ったパディングは下に追加されます。水平方向に追加しなければならないパディングの値が奇数の場合、余ったパディングは右に追加されます。

パディングするデータの値。次のいずれかとして指定します。

PaddingValue説明
スカラー指定したスカラー値でパディングします。

[314159265][0000000000000000314000015900002650000000000000000]

'symmetric-include-edge'入力のミラーリングされた値を使用して、エッジの値を含めてパディングします。

[314159265][5115995133144113314415115995622655662265565115995]

'symmetric-exclude-edge'入力のミラーリングされた値を使用して、エッジの値を除外してパディングします。

[314159265][5626562951595141314139515951562656295159514131413]

'replicate'入力の繰り返し境界要素を使用してパディングします。

[314159265][3331444333144433314441115999222655522265552226555]

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | char | string

グループごとのチャネルの数。'auto' または正の整数として指定します。グループごとのチャネルの数は、入力チャネルの数をグループの数で割った値と同じです。

ソフトウェアは、このプロパティを学習時に自動的に設定します。

例: 256

パラメーターと初期化

重みを初期化する関数。次のいずれかに指定します。

  • 'glorot' – Glorot 初期化子[1](Xavier 初期化子とも呼ばれる) を使用して重みを初期化します。Glorot 初期化子は、平均 0、分散 2/(numIn + numOut) の一様分布から個別にサンプリングを行います。ここで、numIn = FilterSize(1)*FilterSize(2)*NumChannelsPerGroup および numOut = FilterSize(1)*FilterSize(2)*NumFiltersPerGroup です。

  • 'he' – He 初期化子[2]を使用して重みを初期化します。He 初期化子は、平均 0、分散 2/numIn の正規分布からサンプリングを行います。ここで、numIn = FilterSize(1)*FilterSize(2)*NumChannelsPerGroup です。

  • 'narrow-normal' – 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、重みを初期化します。

  • 'zeros' – 0 で重みを初期化します。

  • 'ones' – 1 で重みを初期化します。

  • 関数ハンドル – カスタム関数で重みを初期化します。関数ハンドルを指定する場合、関数は weights = func(sz) という形式でなければなりません。ここで、sz は重みのサイズです。例については、カスタム重み初期化関数の指定を参照してください。

この層では、Weights プロパティが空の場合にのみ重みが初期化されます。

データ型: char | string | function_handle

バイアスを初期化する関数。次のいずれかに指定します。

  • 'zeros' — 0 でバイアスを初期化します。

  • 'ones' — 1 でバイアスを初期化します。

  • 'narrow-normal' — 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、バイアスを初期化します。

  • 関数ハンドル — カスタム関数でバイアスを初期化します。関数ハンドルを指定する場合、関数は bias = func(sz) という形式でなければなりません。ここで、sz はバイアスのサイズです。

この層では、Bias プロパティが空の場合にのみバイアスが初期化されます。

データ型: char | string | function_handle

層の重み。数値配列として指定します。

層の重みは学習可能なパラメーターです。層の Weights プロパティを使用して、重みに直接、初期値を指定できます。ネットワークに学習させるときに、層の Weights プロパティが空ではない場合、trainNetworkWeights プロパティを初期値として使用します。Weights プロパティが空の場合、trainNetwork は層の WeightsInitializer プロパティによって指定された初期化子を使用します。

学習時、WeightsFilterSize(1)×FilterSize(2)×NumChannelsPerGroup×NumFiltersPerGroup×NumGroups の配列です。ここで、NumInputChannels は層の入力に含まれるチャネルの数です。

データ型: single | double

層のバイアス。数値配列として指定します。

層のバイアスは学習可能なパラメーターです。ネットワークの学習時に、Bias が空ではない場合、trainNetworkBias プロパティを初期値として使用します。Bias が空の場合、trainNetworkBiasInitializer によって指定された初期化子を使用します。

学習時、Bias は 1×1×NumFiltersPerGroup×NumGroups の配列です。

データ型: single | double

学習率および正則化

重みの学習率係数。非負のスカラーとして指定します。

この係数にグローバル学習率が乗算されて、この層の重みの学習率が決定されます。たとえば、WeightLearnRateFactor2 の場合、この層の重みの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル学習率が決定されます。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

バイアスの学習率係数。非負のスカラーとして指定します。

この係数にグローバル学習率が乗算されて、この層のバイアスの学習率が決定されます。たとえば、BiasLearnRateFactor2 の場合、層のバイアスの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル学習率が決定されます。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

重みの L2 正則化係数。非負のスカラーとして指定します。

この係数にグローバル L2 正則化係数が乗算されて、この層の重みの L2 正則化が決定されます。たとえば、WeightL2Factor2 の場合、この層の重みの L2 正則化はグローバル L2 正則化係数の 2 倍になります。グローバル L2 正則化係数は、関数 trainingOptions を使用して指定できます。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

バイアスの L2 正則化係数。非負のスカラーとして指定します。

この係数にグローバル L2 正則化係数が乗算されて、この層のバイアスの L2 正則化が決定されます。たとえば、BiasL2Factor2 の場合、この層のバイアスの L2 正則化はグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル L2 正則化係数が決定されます。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

層の名前。文字ベクトルまたは string スカラーとして指定します。Layer 配列入力の場合、関数 trainNetworkassembleNetworklayerGraph、および dlnetwork は、名前が '' の層に自動的に名前を割り当てます。

データ型: char | string

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

層の入力の数。この層は単一の入力のみを受け入れます。

データ型: double

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

層の入力名。この層は単一の入力のみを受け入れます。

データ型: cell

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

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

データ型: double

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

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

データ型: cell

すべて折りたたむ

高さと幅が 11 である 10 個のフィルターから成る 3 個のグループで構成され、名前が 'gconv1' であるグループ化された畳み込み層を作成します。

layer = groupedConvolution2dLayer(11,10,3,'Name','gconv1')
layer = 
  GroupedConvolution2DLayer with properties:

                   Name: 'gconv1'

   Hyperparameters
             FilterSize: [11 11]
              NumGroups: 3
    NumChannelsPerGroup: 'auto'
     NumFiltersPerGroup: 10
                 Stride: [1 1]
         DilationFactor: [1 1]
            PaddingMode: 'manual'
            PaddingSize: [0 0 0 0]
           PaddingValue: 0

   Learnable Parameters
                Weights: []
                   Bias: []

  Show all properties

高さと幅が 11 である 10 個のフィルターから成るグループで構成され、名前が 'cwconv1' であるチャネル方向の畳み込み層 (深さ方向の畳み込みとも呼ばれる) を作成します。

layer = groupedConvolution2dLayer(11,10,'channel-wise','Name','cwconv1')
layer = 
  GroupedConvolution2DLayer with properties:

                   Name: 'cwconv1'

   Hyperparameters
             FilterSize: [11 11]
              NumGroups: 'channel-wise'
    NumChannelsPerGroup: 'auto'
     NumFiltersPerGroup: 10
                 Stride: [1 1]
         DilationFactor: [1 1]
            PaddingMode: 'manual'
            PaddingSize: [0 0 0 0]
           PaddingValue: 0

   Learnable Parameters
                Weights: []
                   Bias: []

  Show all properties

畳み込みニューラル ネットワークは、一般に、畳み込み層、バッチ正規化層、および ReLU 層のブロックで構成されます。次に例を示します。

filterSize = 3;
numFilters = 16;

convLayers = [
    convolution2dLayer(filterSize,numFilters,'Stride',2,'Padding','same')
    batchNormalizationLayer
    reluLayer];

チャネル方向に分離可能な (深さ方向に分離可能とも呼ばれる) 畳み込みの場合、畳み込みブロックをチャネル方向の畳み込みブロックおよび点単位の畳み込みブロックに置き換えます。

チャネル方向の畳み込みで使用するフィルター サイズとストライド、および点単位の畳み込みで使用するフィルターの数を指定します。チャネル方向の畳み込みでは、グループごとにフィルターを 1 つ指定します。点単位の畳み込みでは、convolution2dLayer でサイズ 1 のフィルターを指定します。

cwsConvLayers = [
    groupedConvolution2dLayer(filterSize,1,'channel-wise','Stride',2,'Padding','same')
    batchNormalizationLayer
    reluLayer
    
    convolution2dLayer(1,numFilters,'Padding','same')
    batchNormalizationLayer
    reluLayer];

チャネル方向に分離可能な畳み込みを行う層を含むネットワークを作成します。

layers = [
    imageInputLayer([227 227 3])
    
    convolution2dLayer(3,32,'Padding','same')
    batchNormalizationLayer
    reluLayer
    
    groupedConvolution2dLayer(3,1,'channel-wise','Stride',2,'Padding','same')
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(1,16,'Padding','same')
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,'Stride',2)
    
    fullyConnectedLayer(5)
    softmaxLayer
    classificationLayer];

参照

[1] Glorot, Xavier, and Yoshua Bengio. "Understanding the Difficulty of Training Deep Feedforward Neural Networks." In Proceedings of the Thirteenth International Conference on Artificial Intelligence and Statistics, 249–356. Sardinia, Italy: AISTATS, 2010.

[2] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification." In Proceedings of the 2015 IEEE International Conference on Computer Vision, 1026–1034. Washington, DC: IEEE Computer Vision Society, 2015.

拡張機能

バージョン履歴

R2019a で導入