Main Content

convolution2dLayer

説明

2 次元畳み込み層は、2 次元入力にスライディング畳み込みフィルターを適用します。この層では、入力に沿って垂直方向および水平方向にフィルターを移動させ、重みと入力のドット積を計算し、バイアス項を加算することによって、入力を畳み込みます。

層が畳み込みを行う次元は、層の入力によって次のように異なります。

  • 2 次元イメージ入力 (2 つの空間次元内のピクセル、ならびにチャネルと観測値に対応する 4 次元のデータ) の場合、層は空間次元で畳み込みます。

  • 2 次元イメージ シーケンス入力 (2 つの空間次元内のピクセル、ならびにチャネルと観測値とタイム ステップに対応する 5 次元のデータ) の場合、層は 2 つの空間次元で畳み込みます。

  • 1 次元イメージ シーケンス入力 (1 つの空間次元内のピクセル、ならびにチャネルと観測値とタイム ステップに対応する 4 次元のデータ) の場合、層は空間次元と時間次元で畳み込みます。

作成

説明

layer = convolution2dLayer(filterSize,numFilters) は、2 次元畳み込み層を作成し、FilterSize プロパティおよび NumFilters プロパティを設定します。

layer = convolution2dLayer(filterSize,numFilters,Name,Value) は、名前と値のペアを使用して、オプションの StrideDilationFactorNumChannelsパラメーターと初期化学習率および正則化、および Name の各プロパティを設定します。入力パディングを指定するには、名前と値のペアの引数 'Padding' を使用します。たとえば、convolution2dLayer(11,96,'Stride',4,'Padding',1) は、サイズ [11 11] の 96 個のフィルター、[4 4] のストライド、層の入力のすべての端に沿ったサイズ 1 のパディングを持つ、2 次元畳み込み層を作成します。複数の名前と値のペアを指定できます。各プロパティ名を一重引用符で囲みます。

入力引数

すべて展開する

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値の各ペアを区切り、Name を引用符で囲みます。

例: convolution2dLayer(3,16,'Padding','same') は、サイズ [3 3] の 16 個のフィルターと 'same' パディングを持つ、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 次元畳み込み

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

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

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

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

フィルターの数。正の整数として指定します。この数値は、入力の同じ領域に結合する層のニューロンの数に対応します。このパラメーターは、層の出力のチャネル (特徴マップ) の数を決定します。

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

入力を垂直方向および水平方向に走査するステップ サイズ。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 は対応する次元のストライドです。可能な場合、上下および左右に同じ量のパディングが追加されます。垂直方向に追加しなければならないパディングの値が奇数の場合、余ったパディングは下に追加されます。水平方向に追加しなければならないパディングの値が奇数の場合、余ったパディングは右に追加されます。

メモ

Padding プロパティは将来のリリースで削除される予定です。代わりに PaddingSize を使用してください。層の作成時に、名前と値のペアの引数 'Padding' を使用してパディングのサイズを指定します。

入力の境界に垂直方向および水平方向に適用するパディングのサイズ。2 つの非負の整数のベクトル [a b] として指定します。a は入力データの上下に適用されるパディング、b は左右に適用されるパディングです。

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

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

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' — 学習時に入力チャネルの数を自動的に決定します。

  • 正の整数 — 指定された数の入力チャネルの層を構成します。NumChannels と層入力データのチャネル数は一致しなければなりません。たとえば、入力が RGB イメージの場合、NumChannels は 3 でなければなりません。入力が 16 個のフィルターをもつ畳み込み層の出力である場合、NumChannels は 16 でなければなりません。

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

パラメーターと初期化

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

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

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

  • '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) x FilterSize(2) x NumChannels x NumFilters の配列です。

データ型: single | double

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

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

学習時、Bias は 1 x 1 x NumFilters の配列です。

データ型: 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 倍になります。グローバル L2 正則化係数は、関数 trainingOptions を使用して指定できます。

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

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

データ型: char | string

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

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

データ型: double

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

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

データ型: cell

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

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

データ型: double

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

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

データ型: cell

すべて折りたたむ

高さと幅がそれぞれ 11 のフィルターを 96 個もつ畳み込み層を作成します。水平方向と垂直方向のストライド (ステップ サイズ) に 4 を使用します。

layer = convolution2dLayer(11,96,'Stride',4)
layer = 
  Convolution2DLayer with properties:

              Name: ''

   Hyperparameters
        FilterSize: [11 11]
       NumChannels: 'auto'
        NumFilters: 96
            Stride: [4 4]
    DilationFactor: [1 1]
       PaddingMode: 'manual'
       PaddingSize: [0 0 0 0]
      PaddingValue: 0

   Learnable Parameters
           Weights: []
              Bias: []

  Show all properties

Layer 配列に畳み込み層を含めます。

layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(5,20)
    reluLayer
    maxPooling2dLayer(2,'Stride',2)
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer]
layers = 
  7x1 Layer array with layers:

     1   ''   Image Input             28x28x1 images with 'zerocenter' normalization
     2   ''   Convolution             20 5x5 convolutions with stride [1  1] and padding [0  0  0  0]
     3   ''   ReLU                    ReLU
     4   ''   Max Pooling             2x2 max pooling with stride [2  2] and padding [0  0  0  0]
     5   ''   Fully Connected         10 fully connected layer
     6   ''   Softmax                 softmax
     7   ''   Classification Output   crossentropyex

重みとバイアスの初期化子関数を指定するには、それぞれ WeightsInitializer プロパティと BiasInitializer プロパティを使用します。重みとバイアスを直接指定するには、それぞれ Weights プロパティと Bias プロパティを使用します。

初期化関数の指定

32 個のフィルターを持ち、各フィルターの高さと幅が 5 の畳み込み層を作成し、重み初期化子を He 初期化子に指定します。

filterSize = 5;
numFilters = 32;
layer = convolution2dLayer(filterSize,numFilters, ...
    'WeightsInitializer','he')
layer = 
  Convolution2DLayer with properties:

              Name: ''

   Hyperparameters
        FilterSize: [5 5]
       NumChannels: 'auto'
        NumFilters: 32
            Stride: [1 1]
    DilationFactor: [1 1]
       PaddingMode: 'manual'
       PaddingSize: [0 0 0 0]
      PaddingValue: 0

   Learnable Parameters
           Weights: []
              Bias: []

  Show all properties

Weights プロパティおよび Bias プロパティは空になることに注意してください。学習時に、これらのプロパティは指定した初期化関数を使用して初期化されます。

カスタム初期化関数の指定

重みとバイアスの独自の初期化関数を指定するには、関数ハンドルに WeightsInitializer プロパティおよび BiasInitializer プロパティを設定します。これらのプロパティに、重みとバイアスのサイズを入力として取り、初期化値を出力する関数ハンドルを指定します。

32 個のフィルターを持ち、各フィルターの高さと幅が 5 の畳み込み層を作成し、標準偏差 0.0001 のガウス分布から重みとバイアスをサンプリングする初期化子を指定します。

filterSize = 5;
numFilters = 32;

layer = convolution2dLayer(filterSize,numFilters, ...
    'WeightsInitializer', @(sz) rand(sz) * 0.0001, ...
    'BiasInitializer', @(sz) rand(sz) * 0.0001)
layer = 
  Convolution2DLayer with properties:

              Name: ''

   Hyperparameters
        FilterSize: [5 5]
       NumChannels: 'auto'
        NumFilters: 32
            Stride: [1 1]
    DilationFactor: [1 1]
       PaddingMode: 'manual'
       PaddingSize: [0 0 0 0]
      PaddingValue: 0

   Learnable Parameters
           Weights: []
              Bias: []

  Show all properties

ここでも、Weights プロパティおよび Bias プロパティは空になります。学習時に、これらのプロパティは指定した初期化関数を使用して初期化されます。

重みおよびバイアスの直接指定

出力サイズが 10 の全結合層を作成し、MAT ファイル Conv2dWeights.mat で重みとバイアスをそれぞれ Wb に設定します。

filterSize = 5;
numFilters = 32;
load Conv2dWeights

layer = convolution2dLayer(filterSize,numFilters, ...
    'Weights',W, ...
    'Bias',b)
layer = 
  Convolution2DLayer with properties:

              Name: ''

   Hyperparameters
        FilterSize: [5 5]
       NumChannels: 3
        NumFilters: 32
            Stride: [1 1]
    DilationFactor: [1 1]
       PaddingMode: 'manual'
       PaddingSize: [0 0 0 0]
      PaddingValue: 0

   Learnable Parameters
           Weights: [5x5x3x32 double]
              Bias: [1x1x32 double]

  Show all properties

ここで、Weights プロパティおよび Bias プロパティには指定した値が含まれます。学習時に、これらのプロパティが空ではない場合、指定した値が初期の重みとバイアスとして使用されます。この場合、初期化子関数は使用されません。

入力のサイズが 28 x 28 x 1 であるとします。16 個のフィルターを持ち、各フィルターの高さが 6 で幅が 4 の畳み込み層を作成します。水平方向と垂直方向のストライドを 4 に設定します。

畳み込みが入力を完全にカバーすることを確認します。畳み込みが入力を完全にカバーするには、水平方向と垂直方向の両方の出力次元が整数でなければなりません。水平方向の出力次元を整数にするには、イメージの上下に 1 行のパディングが必要です: (28 – 6+ 2 * 1)/4 + 1 = 7.垂直方向の出力次元を整数にするには、ゼロ パディングは不要です: (28 – 4+ 2 * 0)/4 + 1 = 7.

畳み込み層を構築します。

layer = convolution2dLayer([6 4],16,'Stride',4,'Padding',[1 0])
layer = 
  Convolution2DLayer with properties:

              Name: ''

   Hyperparameters
        FilterSize: [6 4]
       NumChannels: 'auto'
        NumFilters: 16
            Stride: [4 4]
    DilationFactor: [1 1]
       PaddingMode: 'manual'
       PaddingSize: [1 1 0 0]
      PaddingValue: 0

   Learnable Parameters
           Weights: []
              Bias: []

  Show all properties

アルゴリズム

すべて展開する

参照

[1] LeCun, Y., B. Boser, J. S. Denker, D. Henderson, R. E. Howard, W. Hubbard, and L. D. Jackel. "Handwritten Digit Recognition with a Back-Propagation Network." In Advances in Neural Information Processing Systems 2 (D. Touretzky, ed.). San Francisco: Morgan Kaufmann, 1990.

[2] LeCun, Y., L. Bottou, Y. Bengio, and P. Haffner. ''Gradient-Based Learning Applied to Document Recognition.'' Proceedings of the IEEE. Vol. 86, Number 11, 1998, pp. 2278–2324.

[3] Murphy, K. P. Machine Learning: A Probabilistic Perspective. Cambridge, MA: MIT Press, 2012.

[4] 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.

[5] 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.

拡張機能

バージョン履歴

R2016a で導入

すべて展開する

R2019a での動作変更


1 Image credit: Convolution arithmetic (License)