このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
convolution2dLayer
2 次元畳み込み層
説明
2 次元畳み込み層は、2 次元入力にスライディング畳み込みフィルターを適用します。この層では、入力に沿って垂直方向および水平方向にフィルターを移動させ、重みと入力のドット積を計算し、バイアス項を加算することによって、入力を畳み込みます。
層が畳み込みを行う次元は、層の入力によって次のように異なります。
2 次元イメージ入力 (2 つの空間次元内のピクセル、ならびにチャネルと観測値に対応する 4 次元のデータ) の場合、層は空間次元で畳み込みます。
2 次元イメージ シーケンス入力 (2 つの空間次元内のピクセル、ならびにチャネルと観測値とタイム ステップに対応する 5 次元のデータ) の場合、層は 2 つの空間次元で畳み込みます。
1 次元イメージ シーケンス入力 (1 つの空間次元内のピクセル、ならびにチャネルと観測値とタイム ステップに対応する 4 次元のデータ) の場合、層は空間次元と時間次元で畳み込みます。
作成
構文
説明
は、2 次元畳み込み層を作成し、layer
= convolution2dLayer(filterSize
,numFilters
)FilterSize
プロパティおよび NumFilters
プロパティを設定します。
は、1 つ以上の名前と値の引数を使用して、オプションのプロパティを設定します。layer
= convolution2dLayer(filterSize
,numFilters
,Name=Value
)
入力引数
フィルターの高さと幅。2 つの正の整数のベクトル [h w]
として指定します。h
は高さ、w
は幅です。filterSize
は、入力でニューロンが結合する局所領域のサイズを定義します。
層を作成する場合、filterSize
をスカラーとして指定して、高さと幅に同じ値を使用できます。
例: [5 5]
は、高さが 5、幅が 5 のフィルターを指定します。
フィルターの数。正の整数として指定します。この数値は、入力の同じ領域に結合する層のニューロンの数に対応します。このパラメーターは、層の出力のチャネル (特徴マップ) の数を決定します。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで、Name
は引数名で、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name
を引用符で囲みます。
例: convolution2dLayer(3,16,Padding="same")
は、サイズ [3 3]
の 16 個のフィルターと 'same'
パディングをもつ、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]
入力の端のパディング。次のいずれかの値として指定します。
"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 の場合) 出力サイズが入力サイズと同じになるようにパディングを追加します。
パディングするデータの値。次のいずれかとして指定します。
PaddingValue | 説明 | 例 |
---|---|---|
スカラー | 指定したスカラー値でパディングします。 | |
"symmetric-include-edge" | 入力のミラーリングされた値を使用して、エッジの値を含めてパディングします。 | |
"symmetric-exclude-edge" | 入力のミラーリングされた値を使用して、エッジの値を除外してパディングします。 | |
"replicate" | 入力の繰り返し境界要素を使用してパディングします。 | |
データ型: 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
プロパティが空でない場合、trainnet
関数は Weights
プロパティを初期値として使用します。Weights
プロパティが空の場合、ソフトウェアは層の WeightsInitializer
プロパティによって指定された初期化子を使用します。
学習時、Weights
は FilterSize(1)
x FilterSize(2)
x NumChannels
x NumFilters
の配列です。
データ型: single
| double
畳み込み層のバイアス。数値配列として指定します。
層のバイアスは学習可能なパラメーターです。ニューラル ネットワークの学習時に、Bias
が空ではない場合、関数 trainnet
および trainNetwork
は Bias
プロパティを初期値として使用します。Bias
が空の場合、ソフトウェアは BiasInitializer
によって指定された初期化子を使用します。
学習時、Bias
は 1 x 1 x NumFilters
の配列です。
データ型: single
| double
重みの学習率係数。非負のスカラーとして指定します。
この係数にグローバル学習率が乗算されて、この層の重みの学習率が決定されます。たとえば、WeightLearnRateFactor
が 2
の場合、この層の重みの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル学習率が決定されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
バイアスの学習率係数。非負のスカラーとして指定します。
この係数にグローバル学習率が乗算されて、この層のバイアスの学習率が決定されます。たとえば、BiasLearnRateFactor
が 2
の場合、層のバイアスの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル学習率が決定されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
重みの L2 正則化係数。非負のスカラーとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、この層の重みの L2 正則化が決定されます。たとえば、WeightL2Factor
が 2
の場合、この層の重みの L2 正則化はグローバル L2 正則化係数の 2 倍になります。グローバル L2 正則化係数は、関数 trainingOptions
を使用して指定できます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
バイアスの L2 正則化係数。非負のスカラーとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、この層のバイアスの L2 正則化が決定されます。たとえば、BiasL2Factor
が 2
の場合、この層のバイアスの L2 正則化はグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル L2 正則化係数が決定されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
プロパティ
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 | 説明 | 例 |
---|---|---|
スカラー | 指定したスカラー値でパディングします。 | |
"symmetric-include-edge" | 入力のミラーリングされた値を使用して、エッジの値を含めてパディングします。 | |
"symmetric-exclude-edge" | 入力のミラーリングされた値を使用して、エッジの値を除外してパディングします。 | |
"replicate" | 入力の繰り返し境界要素を使用してパディングします。 | |
データ型: 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
プロパティが空の場合にのみバイアスが初期化されます。
Convolution2DLayer
オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。
データ型: char
| string
| function_handle
畳み込み層の重み。数値配列として指定します。
層の重みは学習可能なパラメーターです。層の Weights
プロパティを使用して、重みの初期値を直接指定できます。ネットワークに学習させるときに、層の Weights
プロパティが空でない場合、trainnet
関数は Weights
プロパティを初期値として使用します。Weights
プロパティが空の場合、ソフトウェアは層の WeightsInitializer
プロパティによって指定された初期化子を使用します。
学習時、Weights
は FilterSize(1)
x FilterSize(2)
x NumChannels
x NumFilters
の配列です。
データ型: single
| double
畳み込み層のバイアス。数値配列として指定します。
層のバイアスは学習可能なパラメーターです。ニューラル ネットワークに学習させるときに、Bias
が空でない場合、trainnet
関数は Bias
プロパティを初期値として使用します。Bias
が空の場合、ソフトウェアは BiasInitializer
によって指定された初期化子を使用します。
学習時、Bias
は 1 x 1 x NumFilters
の配列です。
データ型: single
| double
学習率および正則化
重みの学習率係数。非負のスカラーとして指定します。
この係数にグローバル学習率が乗算されて、この層の重みの学習率が決定されます。たとえば、WeightLearnRateFactor
が 2
の場合、この層の重みの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル学習率が決定されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
バイアスの学習率係数。非負のスカラーとして指定します。
この係数にグローバル学習率が乗算されて、この層のバイアスの学習率が決定されます。たとえば、BiasLearnRateFactor
が 2
の場合、層のバイアスの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル学習率が決定されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
重みの L2 正則化係数。非負のスカラーとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、この層の重みの L2 正則化が決定されます。たとえば、WeightL2Factor
が 2
の場合、この層の重みの L2 正則化はグローバル L2 正則化係数の 2 倍になります。グローバル L2 正則化係数は、関数 trainingOptions
を使用して指定できます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
バイアスの L2 正則化係数。非負のスカラーとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、この層のバイアスの L2 正則化が決定されます。たとえば、BiasL2Factor
が 2
の場合、この層のバイアスの L2 正則化はグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル L2 正則化係数が決定されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
層
この プロパティ は読み取り専用です。
層への入力の数。1
として格納されます。この層は単一の入力のみを受け入れます。
データ型: double
この プロパティ は読み取り専用です。
入力名。{'in'}
として格納されます。この層は単一の入力のみを受け入れます。
データ型: cell
この プロパティ は読み取り専用です。
層からの出力の数。1
として格納されます。この層には単一の出力のみがあります。
データ型: double
この プロパティ は読み取り専用です。
出力名。{'out'}
として格納されます。この層には単一の出力のみがあります。
データ型: 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]
layers = 6×1 Layer array with layers: 1 '' Image Input 28×28×1 images with 'zerocenter' normalization 2 '' 2-D Convolution 20 5×5 convolutions with stride [1 1] and padding [0 0 0 0] 3 '' ReLU ReLU 4 '' 2-D Max Pooling 2×2 max pooling with stride [2 2] and padding [0 0 0 0] 5 '' Fully Connected 10 fully connected layer 6 '' Softmax softmax
重みとバイアスの初期化子関数を指定するには、それぞれ 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
で重みとバイアスをそれぞれ W
と b
に設定します。
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: [5×5×3×32 double] Bias: [1×1×32 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
アルゴリズム
2 次元畳み込み層は、2 次元入力にスライディング畳み込みフィルターを適用します。この層では、入力に沿って垂直方向および水平方向にフィルターを移動させ、重みと入力のドット積を計算し、バイアス項を加算することによって、入力を畳み込みます。
層が畳み込みを行う次元は、層の入力によって次のように異なります。
2 次元イメージ入力 (2 つの空間次元内のピクセル、ならびにチャネルと観測値に対応する 4 次元のデータ) の場合、層は空間次元で畳み込みます。
2 次元イメージ シーケンス入力 (2 つの空間次元内のピクセル、ならびにチャネルと観測値とタイム ステップに対応する 5 次元のデータ) の場合、層は 2 つの空間次元で畳み込みます。
1 次元イメージ シーケンス入力 (1 つの空間次元内のピクセル、ならびにチャネルと観測値とタイム ステップに対応する 4 次元のデータ) の場合、層は空間次元と時間次元で畳み込みます。
畳み込み層はさまざまなコンポーネントで構成されます。1
畳み込み層は、入力イメージまたは前の層の出力の小領域に結合するニューロンで構成されます。この層は、イメージをスキャンする間に、これらの領域で局所化された特徴を学習します。関数 convolution2dLayer
を使用して層を作成するときに入力引数 filterSize
を使用して、これらの領域のサイズを指定できます。
この層は、各領域に対して重みと入力のドット積を計算し、バイアス項を加算します。イメージの領域に適用される重みのセットは、"フィルター" と呼ばれます。フィルターは入力イメージに沿って垂直方向および水平方向に移動し、各領域に対して同じ計算を繰り返します。つまり、フィルターは入力を畳み込みます。
次のイメージは、入力をスキャンする 3 行 3 列のフィルターを示しています。下側のマップは入力を表し、上側のマップは出力を表します。
フィルターが移動に使用するステップ サイズは "ストライド" と呼ばれます。ステップ サイズは、名前と値のペアの引数 Stride
を使用して指定できます。ニューロンが結合する局所領域は、filterSize
および 'Stride'
の値によっては重なる可能性があります。
次のイメージは、ストライド 2 で入力をスキャンする 3 行 3 列のフィルターを示しています。下側のマップは入力を表し、上側のマップは出力を表します。
フィルターの重みの数は、h * w * c です。h はフィルターの高さ、w はフィルターの幅、c は入力のチャネルの数です。たとえば、入力がカラー イメージの場合は、カラー チャネルの数は 3 です。フィルターの数によって、畳み込み層にある出力のチャネルの数が決まります。関数 convolution2dLayer
の引数 numFilters
を使用して、フィルターの数を指定します。
膨張畳み込みとは、フィルターの要素間に挿入された空間によってフィルターが拡張される畳み込みです。'DilationFactor'
プロパティを使用して膨張係数を指定します。
膨張畳み込みを使用して、パラメーターの数や計算量を増やさずに、層の受容野 (層で確認できる入力の領域) を増やすことができます。
各フィルター要素間にゼロを挿入すると、層のフィルターが拡張されます。膨張係数は、入力のサンプリングのステップ サイズ、またはこれと等価であるフィルターのアップサンプリング係数を決定します。これは、有効なフィルター サイズ (Filter Size – 1) .* Dilation Factor + 1 に相当します。たとえば、膨張係数 [2 2]
の 3 行 3 列のフィルターは、要素間にゼロが挿入された 5 行 5 列のフィルターと等価です。
次のイメージは、入力をスキャンする、係数 2 で膨張処理された 3 行 3 列のフィルターを示しています。下側のマップは入力を表し、上側のマップは出力を表します。
フィルターが入力に沿って移動するのに合わせて、畳み込みと同じ重みのセットと同じバイアスを使用して、"特徴マップ" が形成されます。各特徴マップは、異なる重みセットと異なるバイアスを使用した畳み込みの結果です。そのため、特徴マップの数はフィルターの数に等しくなります。畳み込み層のパラメーターの総数は、((h*w*c + 1)*Number of Filters) になります。ここで、1 はバイアスに相当します。
また、名前と値のペアの引数 'Padding'
を使用して、入力イメージの垂直方向および水平方向の境界にパディングを適用することもできます。パディングとは、入力サイズを増やすために入力の境界に追加される値のことです。パディングを調整することにより、層の出力サイズを制御できます。
次のイメージは、サイズ 1 のパディングで入力をスキャンする 3 行 3 列のフィルターを示しています。下側のマップは入力を表し、上側のマップは出力を表します。
畳み込み層の出力の高さと幅は (Input Size – ((Filter Size – 1)*Dilation Factor + 1) + 2*Padding)/Stride + 1 です。この値は、イメージ全体を完全にカバーする整数でなければなりません。これらのオプションの組み合わせでイメージ全体を完全にカバーできない場合、既定では、畳み込みの右端と下端に沿ってイメージの残りの部分が無視されます。
出力の高さと幅の積によって、特徴マップのニューロンの総数 (Map Size) が求められます。畳み込み層のニューロンの総数 (出力サイズ) は、Map Size*Number of Filters になります。
たとえば、入力イメージが 32 x 32 x 3 のカラー イメージであるとします。8 個のフィルターを持つ畳み込み層で、フィルター サイズが 5 x 5 の場合、フィルターあたりの重みの数は 5 * 5 * 3 = 75、層のパラメーターの総数は (75 + 1) * 8 = 608 になります。各方向のストライドが 2 で、パディングのサイズとして 2 が指定されている場合、各特徴マップは 16 x 16 になります。これは、(32 – 5 + 2 * 2)/2 + 1 = 16.5 であり、イメージの右側と下側で最も外側のパディングの一部が破棄されるためです。最終的に、層のニューロンの総数は 16*16*8 = 2048 になります。
これらのニューロンからの結果は通常、正規化線形ユニット (ReLU) など、なんらかの形の非線形性を通過します。
畳み込み層の定義を行うときに、名前と値のペアの引数を使用して、層の学習率と正則化オプションを調整できます。これらのオプションを指定しないことを選択した場合、関数 trainnet
は関数 trainingOptions
で定義されたグローバル学習オプションを使用します。
畳み込みニューラル ネットワークは、1 つ以上の畳み込み層で構成されます。畳み込み層の数は、データの量と複雑度によって異なります。
層配列内または層グラフ内の層は、形式を整えた dlarray
オブジェクトとして後続の層にデータを渡します。dlarray
オブジェクトの形式は文字列で、各文字はデータ内の対応する次元を表します。この形式には次の文字が 1 つ以上含まれています。
"S"
— 空間"C"
— チャネル"B"
— バッチ"T"
— 時間"U"
— 指定なし
たとえば、4 次元配列として表された 2 次元イメージ データがあり、最初の 2 つの次元がイメージの空間次元に対応し、3 番目の次元がイメージのチャネルに対応し、4 番目の次元がバッチ次元に対応している場合、このイメージ データは "SSCB"
(空間、空間、チャネル、バッチ) という形式で記述できます。
functionLayer
オブジェクトを使用するか、関数 forward
と関数 predict
を dlnetwork
オブジェクトと共に使用して、カスタム層の開発などの自動微分ワークフローで、これらの dlarray
オブジェクトを操作できます。
次の表は、Convolution2DLayer
オブジェクトでサポートされている入力形式、および対応する出力形式を示しています。ソフトウェアが nnet.layer.Formattable
クラスを継承していないカスタム層、または Formattable
プロパティが 0
(false
) に設定された FunctionLayer
オブジェクトに層の出力を渡す場合、その層は形式を整えていない dlarray
オブジェクトを受け取り、この表に示された形式に従って次元が並べられます。ここには一部の形式のみを示します。層では、追加の "S"
(空間) 次元または "U"
(未指定) 次元をもつ形式など、追加の形式がサポートされている場合があります。
入力形式 | 出力形式 |
---|---|
|
|
|
|
|
|
dlnetwork
オブジェクトでは、Convolution2DLayer
オブジェクトもこれらの入力形式と出力形式の組み合わせをサポートします。
入力形式 | 出力形式 |
---|---|
|
|
|
|
|
|
参照
[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. https://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
[5] 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
拡張機能
使用上の注意および制限:
コード生成では、
PaddingValue
パラメーターは既定の値0
と等しくなければなりません。コード生成では、指定なし (U) の次元をもつ
dlarray
オブジェクトをこの層に渡すことはサポートされていません。
使用上の注意および制限:
GPU コード生成では、
PaddingValue
パラメーターは既定の値0
と等しくなければなりません。コード生成では、指定なし (U) の次元をもつ
dlarray
オブジェクトをこの層に渡すことはサポートされていません。
バージョン履歴
R2016a で導入R2019a 以降では、既定で、Glorot 初期化子を使用してこの層の重みが初期化されます。この動作は、学習を安定化させるのに役立ち、通常は深いネットワークの学習時間を短縮します。
以前のリリースでは、既定で、平均 0、分散 0.01 の正規分布からサンプリングを行って、層の重みが初期化されます。この動作を再現するには、層の 'WeightsInitializer'
オプションを 'narrow-normal'
に設定します。
参考
trainnet
| trainingOptions
| dlnetwork
| reluLayer
| batchNormalizationLayer
| maxPooling2dLayer
| fullyConnectedLayer
| groupedConvolution2dLayer
| ディープ ネットワーク デザイナー | exportNetworkToSimulink
| Convolution 2D Layer
1 Image credit: Convolution arithmetic (License)
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- 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)