groupedConvolution2dLayer
グループ化された 2 次元畳み込み層
説明
グループ化された 2 次元畳み込み層は、入力チャネルをグループに分けて、スライディング畳み込みフィルターを適用します。チャネル方向に分離可能な (深さ方向に分離可能とも呼ばれる) 畳み込みには、グループ化された畳み込み層を使用します。
この層では、各グループについて、入力に沿って垂直方向および水平方向にフィルターを移動させ、重みと入力のドット積を計算し、バイアス項を加算することによって、入力を畳み込みます。この層は、各グループの畳み込みを個別に結合します。グループの数がチャネルの数に等しい場合、この層はチャネル方向で畳み込みを実行します。
作成
構文
説明
は、グループ化された 2 次元畳み込み層を作成し、layer
= groupedConvolution2dLayer(filterSize
,numFiltersPerGroup
,numGroups
)FilterSize
、NumFiltersPerGroup
、および NumGroups
の各プロパティを設定します。
は、名前と値のペアを使用して、オプションの layer
= groupedConvolution2dLayer(___,Name,Value
)Stride
、DilationFactor
、パラメーターと初期化、学習率および正則化、および Name
の各プロパティを設定します。入力パディングを指定するには、名前と値のペアの引数 'Padding'
を使用します。たとえば、groupedConvolution2dLayer(5,128,2,'Padding','same')
は、サイズが [5 5]
である 128 個のフィルターから成る 2 つのグループで構成されたグループ化済みの 2 次元畳み込み層を作成し、出力が同じサイズとなるように入力をパディングします。複数の名前と値のペアを指定できます。各プロパティ名を一重引用符で囲みます。
入力引数
コンマ区切りの名前と値のペアの引数を使用して、層の入力の端に沿って追加するパディングのサイズを指定するか、Stride
、DilationFactor
、パラメーターと初期化、学習率および正則化、および Name
の各プロパティを設定します。名前を一重引用符で囲みます。
例: groupedConvolution2dLayer(5,128,2,'Padding','same')
は、サイズが [5 5]
である 128 個のフィルターから成る 2 つのグループで構成されたグループ化済みの 2 次元畳み込み層を作成し、出力が同じサイズとなるように入力をパディングします。
Padding
— 入力の端のパディング
[0 0 0 0]
(既定値) | 非負の整数のベクトル | 'same'
入力の端のパディング。'Padding'
と、次の値のいずれかから成るコンマ区切りのペアとして指定します。
'same'
— ストライドが 1 である場合、出力サイズが入力サイズと同じになるように、学習時または予測時にサイズが計算されたパディングを追加します。ストライドが 1 より大きい場合、出力サイズはceil(inputSize/stride)
になります。ここで、inputSize
は入力の高さまたは幅、stride
は対応する次元のストライドです。可能な場合、上下および左右に同じ量のパディングが追加されます。垂直方向に追加しなければならないパディングの値が奇数の場合、余ったパディングは下に追加されます。水平方向に追加しなければならないパディングの値が奇数の場合、余ったパディングは右に追加されます。非負の整数
p
— サイズp
のパディングを入力のすべての端に追加します。非負の整数のベクトル
[a b]
— サイズa
のパディングを入力の上下に追加し、サイズb
のパディングを左右に追加します。非負の整数のベクトル
[t b l r]
— サイズがt
、b
、l
、r
のパディングを、それぞれ入力の上、下、左、右に追加します。
例: 'Padding',1
は、入力の上下に 1 行のパディングを追加し、入力の左右に 1 列のパディングを追加します。
例: 'Padding','same'
は、(ストライドが 1 の場合) 出力サイズが入力サイズと同じになるようにパディングを追加します。
プロパティ
グループ化された畳み込み
FilterSize
— フィルターの高さと幅
2 つの正の整数のベクトル
フィルターの高さと幅。2 つの正の整数のベクトル [h w]
として指定します。h
は高さ、w
は幅です。FilterSize
は、入力でニューロンが結合する局所領域のサイズを定義します。
層を作成する場合、FilterSize
をスカラーとして指定して、高さと幅に同じ値を使用できます。
例: [5 5]
は、高さが 5、幅が 5 のフィルターを指定します。
NumFiltersPerGroup
— グループごとのフィルターの数
正の整数
グループごとのフィルターの数。正の整数として指定します。このプロパティによって、層の出力に含まれるチャネルの数が決まります。出力チャネルの数は FiltersPerGroup * NumGroups
です。
例: 10
NumGroups
— グループの数
正の整数 | 'channel-wise'
グループの数。正の整数または 'channel-wise'
として指定します。
NumGroups
が 'channel-wise'
の場合、ソフトウェアはチャネル方向の畳み込み (深さ方向の畳み込みとも呼ばれる) を行うための層を作成します。この場合、層は学習時に NumGroups
プロパティを決定します。この値は、NumGroups
を入力チャネル数に設定することと等価です。
グループの数は、層の入力に含まれるチャネルの数で割り切れなければなりません。
例: 2
Stride
— 入力を走査するステップ サイズ
[1 1]
(既定値) | 2 つの正の整数のベクトル
入力を垂直方向および水平方向に走査するステップ サイズ。2 つの正の整数のベクトル [a b]
として指定します。a
は垂直方向のステップ サイズ、b
は水平方向のステップ サイズです。層を作成する場合、Stride
をスカラーとして指定して、両方のステップ サイズに同じ値を使用できます。
例: [2 3]
は、垂直方向のステップ サイズとして 2、水平方向のステップ サイズとして 3 を指定します。
DilationFactor
— 膨張畳み込みの係数
[1 1]
(既定値) | 2 つの正の整数のベクトル
膨張畳み込み (Atrous 畳み込みとも呼ばれる) の係数。2 つの正の整数のベクトル [h w]
として指定します。h
は垂直方向の膨張、w
は水平方向の膨張です。層を作成する場合、DilationFactor
をスカラーとして指定して、水平方向と垂直方向の両方の膨張に同じ値を使用できます。
膨張畳み込みを使用して、パラメーターの数や計算量を増やさずに、層の受容野 (層で確認できる入力の領域) を増やすことができます。
各フィルター要素間にゼロを挿入すると、層のフィルターが拡張されます。膨張係数は、入力のサンプリングのステップ サイズ、またはこれと等価であるフィルターのアップサンプリング係数を決定します。これは、有効なフィルター サイズ (Filter Size – 1) .* Dilation Factor + 1 に相当します。たとえば、膨張係数 [2 2]
の 3 行 3 列のフィルターは、要素間にゼロが挿入された 5 行 5 列のフィルターと等価です。
例: [2 3]
PaddingSize
— パディングのサイズ
[0 0 0 0]
(既定値) | 4 つの非負の整数のベクトル
入力の境界に適用するパディングのサイズ。4 つの非負の整数のベクトル [t b l r]
として指定します。t
は上に適用されるパディング、b
は下に適用されるパディング、l
は左に適用されるパディング、r
は右に適用されるパディングです。
層の作成時に、名前と値のペアの引数 'Padding'
を使用してパディングのサイズを指定します。
例: [1 1 2 2]
は、入力の上下に 1 行のパディングを追加し、入力の左右に 2 列のパディングを追加します。
PaddingMode
— パディングのサイズを決定するメソッド
'manual'
(既定値) | 'same'
パディングのサイズを決定するメソッド。'manual'
または 'same'
として指定します。
PaddingMode
の値は、層の作成時に指定した 'Padding'
値に基づいて自動的に設定されます。
'Padding'
オプションをスカラーまたは非負の整数のベクトルに設定した場合、PaddingMode
は'manual'
に自動的に設定されます。'Padding'
オプションを'same'
に設定した場合、PaddingMode
が'same'
に自動的に設定されます。ストライドが 1 である場合、出力サイズが入力サイズと同じになるように、学習時にパディングのサイズが計算されます。ストライドが 1 より大きい場合、出力サイズはceil(inputSize/stride)
になります。ここで、inputSize
は入力の高さまたは幅、stride
は対応する次元のストライドです。可能な場合、上下および左右に同じ量のパディングが追加されます。垂直方向に追加しなければならないパディングの値が奇数の場合、余ったパディングは下に追加されます。水平方向に追加しなければならないパディングの値が奇数の場合、余ったパディングは右に追加されます。
PaddingValue
— パディングするデータの値
0 (既定値) | スカラー | 'symmetric-include-edge'
| 'symmetric-exclude-edge'
| 'replicate'
パディングするデータの値。次のいずれかとして指定します。
PaddingValue | 説明 | 例 |
---|---|---|
スカラー | 指定したスカラー値でパディングします。 | |
'symmetric-include-edge' | 入力のミラーリングされた値を使用して、エッジの値を含めてパディングします。 | |
'symmetric-exclude-edge' | 入力のミラーリングされた値を使用して、エッジの値を除外してパディングします。 | |
'replicate' | 入力の繰り返し境界要素を使用してパディングします。 | |
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| char
| string
NumChannelsPerGroup
— グループごとのチャネルの数
'auto'
(既定値) | 正の整数
グループごとのチャネルの数。'auto'
または正の整数として指定します。グループごとのチャネルの数は、入力チャネルの数をグループの数で割った値と同じです。
ソフトウェアは、このプロパティを学習時に自動的に設定します。
例: 256
パラメーターと初期化
WeightsInitializer
— 重みを初期化する関数
'glorot'
(既定値) | 'he'
| 'narrow-normal'
| 'zeros'
| 'ones'
| 関数ハンドル
重みを初期化する関数。次のいずれかに指定します。
'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
BiasInitializer
— バイアスを初期化する関数
"zeros"
(既定値) | "narrow-normal"
| "ones"
| 関数ハンドル
バイアスを初期化する関数。次のいずれかの値として指定します。
"zeros"
— 0 でバイアスを初期化します。"ones"
— 1 でバイアスを初期化します。"narrow-normal"
— 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、バイアスを初期化します。関数ハンドル — カスタム関数でバイアスを初期化します。関数ハンドルを指定する場合、関数は
bias = func(sz)
という形式でなければなりません。ここで、sz
はバイアスのサイズです。
この層では、Bias
プロパティが空の場合にのみバイアスが初期化されます。
データ型: char
| string
| function_handle
Weights
— 層の重み
[]
(既定値) | 数値配列
層の重み。数値配列として指定します。
層の重みは学習可能なパラメーターです。層の Weights
プロパティを使用して、重みの初期値を直接指定できます。ネットワークに学習させるときに、層の Weights
プロパティが空ではない場合、関数 trainnet
および trainNetwork
は Weights
プロパティを初期値として使用します。Weights
プロパティが空の場合、ソフトウェアは層の WeightsInitializer
プロパティによって指定された初期化子を使用します。
学習時、Weights
は FilterSize(1)
×FilterSize(2)
×NumChannelsPerGroup
×NumFiltersPerGroup
×NumGroups
の配列です。ここで、NumInputChannels
は層の入力に含まれるチャネルの数です。
データ型: single
| double
Bias
— 層のバイアス
[]
(既定値) | 数値配列
層のバイアス。数値配列として指定します。
層のバイアスは学習可能なパラメーターです。ニューラル ネットワークの学習時に、Bias
が空ではない場合、関数 trainnet
および trainNetwork
は Bias
プロパティを初期値として使用します。Bias
が空の場合、ソフトウェアは BiasInitializer
によって指定された初期化子を使用します。
学習時、Bias
は 1×1×NumFiltersPerGroup
×NumGroups
の配列です。
データ型: single
| double
学習率および正則化
WeightLearnRateFactor
— 重みの学習率係数
1
(既定値) | 非負のスカラー
重みの学習率係数。非負のスカラーとして指定します。
この係数にグローバル学習率が乗算されて、この層の重みの学習率が決定されます。たとえば、WeightLearnRateFactor
が 2
の場合、この層の重みの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル学習率が決定されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
BiasLearnRateFactor
— バイアスの学習率係数
1
(既定値) | 非負のスカラー
バイアスの学習率係数。非負のスカラーとして指定します。
この係数にグローバル学習率が乗算されて、この層のバイアスの学習率が決定されます。たとえば、BiasLearnRateFactor
が 2
の場合、層のバイアスの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル学習率が決定されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
WeightL2Factor
— 重みの L2 正則化係数
1 (既定値) | 非負のスカラー
重みの L2 正則化係数。非負のスカラーとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、この層の重みの L2 正則化が決定されます。たとえば、WeightL2Factor
が 2
の場合、この層の重みの L2 正則化はグローバル L2 正則化係数の 2 倍になります。グローバル L2 正則化係数は、関数 trainingOptions
を使用して指定できます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
BiasL2Factor
— バイアスの L2 正則化係数
0
(既定値) | 非負のスカラー
バイアスの L2 正則化係数。非負のスカラーとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、この層のバイアスの L2 正則化が決定されます。たとえば、BiasL2Factor
が 2
の場合、この層のバイアスの L2 正則化はグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル L2 正則化係数が決定されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
層
NumInputs
— 入力の数
1
(既定値)
この プロパティ は読み取り専用です。
層への入力の数。1
として返されます。この層は単一の入力のみを受け入れます。
データ型: double
InputNames
— 入力名
{'in'}
(既定値)
この プロパティ は読み取り専用です。
入力名。{'in'}
として返されます。この層は単一の入力のみを受け入れます。
データ型: cell
NumOutputs
— 出力の数
1
(既定値)
この プロパティ は読み取り専用です。
層からの出力の数。1
として返されます。この層には単一の出力のみがあります。
データ型: double
OutputNames
— 出力名
{'out'}
(既定値)
この プロパティ は読み取り専用です。
出力名。{'out'}
として返されます。この層には単一の出力のみがあります。
データ型: 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: [] Use properties method to see a list of 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: [] Use properties method to see a list of 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];
アルゴリズム
層の入力形式と出力形式
層配列内または層グラフ内の層は、形式を整えた dlarray
オブジェクトとして後続の層にデータを渡します。dlarray
オブジェクトの形式は文字列で、各文字はデータ内の対応する次元を表します。この形式には次の文字が 1 つ以上含まれています。
"S"
— 空間"C"
— チャネル"B"
— バッチ"T"
— 時間"U"
— 指定なし
たとえば、4 次元配列として表された 2 次元イメージ データがあり、最初の 2 つの次元がイメージの空間次元に対応し、3 番目の次元がイメージのチャネルに対応し、4 番目の次元がバッチ次元に対応している場合、このイメージ データは "SSCB"
(空間、空間、チャネル、バッチ) という形式で表されます。
functionLayer
オブジェクトを使用するか、関数 forward
と関数 predict
を dlnetwork
オブジェクトと共に使用して、カスタム層の開発などの自動微分ワークフローで、これらの dlarray
オブジェクトを操作できます。
次の表は、GroupedConvolution2DLayer
オブジェクトでサポートされている入力形式、および対応する出力形式を示しています。ソフトウェアが nnet.layer.Formattable
クラスを継承していないカスタム層、または Formattable
プロパティが 0
(false
) に設定された FunctionLayer
オブジェクトに層の出力を渡す場合、その層は形式を整えていない dlarray
オブジェクトを受け取り、この表に示された形式に従って次元が並べられます。ここには一部の形式のみを示します。層では、追加の "S"
(空間) 次元または "U"
(未指定) 次元をもつ形式など、追加の形式がサポートされている場合があります。
入力形式 | 出力形式 |
---|---|
|
|
|
|
dlnetwork
オブジェクトでは、GroupedConvolution2DLayer
オブジェクトもこれらの入力形式と出力形式の組み合わせをサポートします。
入力形式 | 出力形式 |
---|---|
|
|
|
|
参照
[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. https://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
[2] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification." In 2015 IEEE International Conference on Computer Vision (ICCV), 1026–34. Santiago, Chile: IEEE, 2015. https://doi.org/10.1109/ICCV.2015.123
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意および制限:
NumGroups
プロパティに 2 より大きい整数値が設定されたグループ化済みの 2 次元畳み込み層では、ARM Compute Library 用のコード生成はサポートされません。コード生成では、
PaddingValue
パラメーターは既定の値0
と等しくなければなりません。
GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。
使用上の注意および制限:
NumGroups
プロパティに'channel-wise'
または 2 より大きい値が設定されたグループ化済みの 2 次元畳み込み層では、ARM Mali GPU 用のコード生成はサポートされません。コード生成では、
PaddingValue
パラメーターは既定の値0
と等しくなければなりません。
バージョン履歴
R2019a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)