ConvolutionLayer[n,s]
n 個の出力チャンネルを持ち,サイズ s のカーネルを使ってたたみ込みを計算する,訓練可能なたたみ込みネット層を表す.
ConvolutionLayer[n,{s}]
サイズ s のカーネルを持つ一次元たたみ込みを行う層を表す.
ConvolutionLayer[n,{h,w}]
サイズ h×w のカーネルを持つ二次元たたみ込みを行う層を表す.
ConvolutionLayer[n,{h,w,d}]
サイズ h×w×d のカーネルを持つ三次元たたみ込みを表す.
ConvolutionLayer[n,kernel,opts]
充填や他のパラメータについてのオプションを含む.
ConvolutionLayer
ConvolutionLayer[n,s]
n 個の出力チャンネルを持ち,サイズ s のカーネルを使ってたたみ込みを計算する,訓練可能なたたみ込みネット層を表す.
ConvolutionLayer[n,{s}]
サイズ s のカーネルを持つ一次元たたみ込みを行う層を表す.
ConvolutionLayer[n,{h,w}]
サイズ h×w のカーネルを持つ二次元たたみ込みを行う層を表す.
ConvolutionLayer[n,{h,w,d}]
サイズ h×w×d のカーネルを持つ三次元たたみ込みを表す.
ConvolutionLayer[n,kernel,opts]
充填や他のパラメータについてのオプションを含む.
詳細とオプション
- ConvolutionLayerは,入力にたたみ込み演算を適用するネットワーク層の一種である.
- ConvolutionLayer は,一般に画像パターン認識に用いられるが,空間データ解析,コンピュータビジョン,自然言語処理などにも利用される.
- n 個の出力チャンネルを持つ層を,m 個の入力チャンネルおよび一つ以上の空間次元を持つ入力配列に適用した場合,空間次元全体で実質的に n×m 種類の異なるたたみ込みが実行され,その結果として n 個のチャンネルを持つ出力配列が生成される.
- ConvolutionLayer[…][input]は,層を input に適用した結果の出力を明示的に計算する
- ConvolutionLayer[…][{input1,input2,…}]は,各 inputiについて明示的に出力を計算する.
- ConvolutionLayer[n,s]では,たたみ込み層の次元性は層がNetChainやNetGraph等の中で接続されたときに推測される.
- 次の任意のパラメータを含むことができる.
-
"Biases" Automatic カーネルのバイアスの初期ベクトル "ChannelGroups" 1 チャンネルグループ数 "Dilation" 1 拡大因子 "Dimensionality" Automatic たたみ込みの空間次元数 Interleaving False チャンネル次元の位置 LearningRateMultipliers Automatic カーネルの重みおよび/またはバイアスの学習率乗数 PaddingSize 0 入力に適用するゼロ充填の量 "Stride" 1 使用するたたみ込みの刻み幅 "Weights" Automatic カーネルの重みの初期テンソル - PaddingSizeの設定は,次の形式でよい.
-
n 全次元の始まりと終りを n 個のゼロで充填する {n1,n2,…} 第 i
次元の始まりと終りを n 個のゼロで充填する{{n1,m1},{n2,m2},…} 第 i
次元の始まりを ni個のゼロで,終りを mi個のゼロで充填する"Same" 出力サイズが入力サイズをストライドで割った値(切上げ)と等しくなるように,すべての次元を充填する - "Dilation"と"Stride"の設定は次の形式でよい.
-
n 全次元に値 n を使う {…,ni,…} 第 i 次元に値 niを使う - "ChannelGroups"g と設定することで,m 個の入力チャンネルと n 個の出力チャンネルが,それぞれ m/g チャンネルと n/g チャンネルの g 個のグループに分割される.m と n は g で割り切れなければならない.入力チャンネルの i
番目のグループを出力チャンネルの i
番目のグループと接続するために別々のたたみ込みが行われる.結果は出力に連結される.入出力グループの各ペアは n/g×m/g たたみ込みで接続されるので,"ChannelGroups"g という設定は,事実上,明確なたたみ込みの数を n×m から n×m/g に減らす. - "Biases"Noneの設定はバイアスを使わないように指定する.
- InterleavingFalseの設定のときは,チャンネル次元は入出力配列の最初の次元であるとみなされる.
- InterleavingTrue設定のときは,チャンネル次元は入出力配列の最後の次元であるとみなされる.
- 重みとバイアスが加えられると,ConvolutionLayer[…][input]は層を適用して明示的に出力を計算する.
- ConvolutionLayer[…][{input1,input2,…}]は,各 inputiについて明示的に出力を計算する.
- NetExtractを使ってConvolutionLayerオブジェクトから重みとバイアスを抽出することができる.
- ConvolutionLayerは,NetChain,NetGraph等の中で使われることが多い.
- ConvolutionLayerは,NetGraph等で使われる次のポートを開放する.
-
"Input" 階数が2,3,または4の配列 "Output" 階数が2,3,または4の配列 - ConvolutionLayerは,"Varying"次元を含む配列に使うことができる.
- より大きいネット中の他の層から推測できない場合は,オプション"Input"{d1,…,dn}を使ってConvolutionLayerの入力次元を固定することができる.
- 次元 d1×…×di×…の入力配列を与えられた場合,出力配列の次元は
×…×
×…になる.ただし,チャンネル次元
=n で,サイズ diは
に従って変換される.
/
は軸の始点/終点の充填サイズ,
はカーネルサイズ,
はストライドサイズ,
は各次元についての拡張因子である. - Options[ConvolutionLayer]は層を構築する際のデフォルトオプションのリストを与える.Options[ConvolutionLayer[…]]はデータについて層を評価する際のデフォルトオプションのリストを与える.
- Information[ConvolutionLayer[…]]は層についてのレポートを与える.
- Information[ConvolutionLayer[…],prop]はConvolutionLayer[…]の特性 prop の値を与える.使用可能な特性はNetGraphと同じである.
例題
すべて開く すべて閉じる例 (2)
2個の出力チャンネルとサイズ4のカーネルを持つ,一次元ConvolutionLayerを作る:
ConvolutionLayer[2, {4}]初期化された3次元ConvolutionLayerを作る:
conv = NetInitialize@ConvolutionLayer[1, {2, 3, 4}, "Input" -> {1, 10, 10, 10}]conv[RandomReal[1, {1, 10, 10, 10}]]//Shortスコープ (13)
引数 (3)
3つの出力チャンネルおよび2×2カーネルサイズを持つConvolutionLayerを作成する:
ConvolutionLayer[3, {2, 2}]3つの出力チャンネルおよび2×2×2のカーネルサイズを持つConvolutionLayerを作成する:
ConvolutionLayer[3, {2, 2, 2}]5つの出力チャンネル,7つの入力チャンネル,2×2のカーネルサイズを持つConvolutionLayerを作成する:
ConvolutionLayer[5, 2, "Input" -> {7, Automatic, Automatic}]conv = NetInitialize@ConvolutionLayer[5, 2, "Input" -> {7, Automatic, Automatic}]conv[RandomReal[1, {7, 3, 3}]]//Dimensionsconv[RandomReal[1, {7, 6, 6}]]//Dimensionsポート (3)
初期化された二次元ConvolutionLayerを作る:
conv = NetInitialize@ConvolutionLayer[1, 2, "Input" -> {1, 4, 4}]conv[RandomInteger[1, {1, 4, 4}]]Dimensions[%]カーネルサイズ2で,初期化された三次元ConvolutionLayerを作る:
conv = NetInitialize@ConvolutionLayer[1, 2, "Input" -> {1, 3, 3}]conv[{{{1, 1, 0}, {0, 0, 1}, {1, 1, 0}}}]RGB画像を取ってRGB画像を返す,初期化された二次元ConvolutionLayerを作る:
conv = NetInitialize@ConvolutionLayer[3, 10, "Dilation" -> 3, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]conv[[image]]ConvolutionLayerは自動的に入力バッチに縫い込まれる:
conv[{[image], [image]}]パラメータ (7)
"Biases" (3)
バイアスなしで二次元ConvolutionLayerを作成する:
conv = ConvolutionLayer[2, {4, 4}, "Biases" -> None, "Input" -> {1, 40, 40}]唯一のチャンネルにバイアスを適用する恒等カーネルで一次元ConvolutionLayerを作成する:
conv = ConvolutionLayer["Weights" -> {{{1}}}, "Biases" -> {0.5}]conv[{{1, 2, 3, 4, 5}}]各チャンネルにバイアスを適用する恒等カーネルで二次元ConvolutionLayerを作成する:
kernel = ArrayReshape[IdentityMatrix[3], {3, 3, 1, 1}];
conv = ConvolutionLayer["Weights" -> kernel, "Biases" -> {0.5, -0.5, 0.}, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]conv[[image]]"Weights" (4)
入力配列のペアを平均化するカーネルで一次元ConvolutionLayerを作成する:
conv = ConvolutionLayer["Weights" -> {{{0.5, 0.5}}}, "Biases" -> None]conv[{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}] // Normal3つの入力チャンネルとガウスぼかしを適用する1つの出力チャンネルで二次元 ConvolutionLayerを作成する:
kernel = Table[GaussianMatrix[5], 1, 3];
conv = ConvolutionLayer["Weights" -> kernel, "Biases" -> None, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]conv[[image]]チャンネルごとのガウスカーネルで二次元ConvolutionLayerを作成する.まず,カーネルを作成する:
zero = ConstantArray[0, {19, 19}];
kernel = Table[If[i == j, GaussianMatrix[{9, 6 - 3i}], zero], {i, 0, 2}, {j, 0, 2}];Map[ArrayPlot[#, ImageSize -> 30]&, kernel, {2}]//GraphicsGridconv = ConvolutionLayer["Weights" -> kernel, "Biases" -> None, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]conv[[image]]ランダムなカーネルで二次元ConvolutionLayerを作成する:
kernel = RandomVariate[NormalDistribution[], {3, 3, 5, 5}];
conv = ConvolutionLayer["Weights" -> kernel, "Biases" -> None, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]conv[[image]]オプション (12)
"ChannelGroups" (2)
3つのチャンネルグループで二次元のConvolutionLayerを作る:
conv = NetInitialize@ConvolutionLayer[6, {2, 2}, "ChannelGroups" -> 3, "Input" -> {9, 30, 30}]チャンネルグループを使うことでたたみ込みの重み数がグループ数の割合で削減できる.重みの次元をチェックする:
Dimensions@NetExtract[conv, "Weights"]conv2 = NetInitialize@ConvolutionLayer[6, {2, 2}, "Input" -> {9, 30, 30}]Dimensions@NetExtract[conv2, "Weights"]ランダムな二次元ConvolutionLayerをチャンネルグループを3として作成する:
conv = NetInitialize@ConvolutionLayer[3, {4, 4}, "ChannelGroups" -> 3, "Input" -> NetEncoder[ "Image"], "Output" -> NetDecoder["Image"]]Dimensions@NetExtract[conv, "Weights"]conv[[image]]//ImageAdjust"Dilation" (2)
指定された次元におけるサイズ n の拡張因子は,事実上,距離 n 分だけ離れている入力配列からの要素にカーネルを適用する.
拡張因子が2の一次元ConvolutionLayerを作る:
conv = ConvolutionLayer["Weights" -> {{{0.5, 0.5}}}, "Biases" -> None, "Dilation" -> 2]conv[{{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}}] // Normal拡張因子が5のランダムな二次元ConvolutionLayerを作る:
conv = NetInitialize@ConvolutionLayer[3, {3, 3}, "Dilation" -> 5, "Input" -> NetEncoder[ "Image"], "Output" -> NetDecoder["Image"]]conv[[image]]Interleaving (1)
InterleavingFalseと1つの入力チャンネルでConvolutionLayerを作る:
ConvolutionLayer[1, 5, "Input" -> {1, 25, 25}, Interleaving -> False]InterleavingTrueと1つの入力チャンネルでConvolutionLayerを作る:
ConvolutionLayer[1, 5, "Input" -> {25, 25, 1}, Interleaving -> True]PaddingSize (4)
隣接要素を平均し各側を4個の0で充填する,一次元ConvolutionLayerを作る:
conv = ConvolutionLayer["Weights" -> {{{0.5, 0.5}}}, "Biases" -> None, PaddingSize -> 4]conv[{{1, 2, 3, 4, 5}}] // Normal第1次元の各側を10個のゼロで,第2次元の各側を25個のゼロで充填する,ランダムな二次元ConvolutionLayerを作る:
conv = NetInitialize[ConvolutionLayer[3, {3, 3}, PaddingSize -> {10, 25}, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]], RandomSeeding -> Automatic]conv[[image]]第1次元の始まりを10個のゼロで,終りを20個のゼロで充填する,ランダムな二次元ConvolutionLayerを作る:
conv = NetInitialize[ConvolutionLayer[3, {3, 3}, PaddingSize -> {{10, 20}, {0, 0}}, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]], RandomSeeding -> Automatic]conv[[image]]conv = ConvolutionLayer[1, 5, "Input" -> {1, 25, 25}, PaddingSize -> 2 ]"Stride" (3)
指定された次元におけるサイズ n のストライドは,事実上,カーネルが出力配列を生成するために入力配列上を移動する刻み幅を制御する.
隣接ペアの平均を取るカーネルを持つ,一次元ConvolutionLayerを作る:
kernel = {{{0.5, 0.5}}};
conv = ConvolutionLayer["Weights" -> kernel, "Biases" -> None]conv[{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}] // Normalストライド2を使うとカーネルが重なり合ないペアに適用される:
conv = ConvolutionLayer["Weights" -> kernel, "Biases" -> None, "Stride" -> 2];
conv[{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}] // Normalconv = ConvolutionLayer["Weights" -> kernel, "Biases" -> None, "Stride" -> 4];
conv[{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}] // Normal非対称スライドでランダムな二次元ConvolutionLayerを作る:
conv = ConvolutionLayer["Weights" -> RandomReal[0.1, {3, 3, 4, 4}], "Biases" -> None, "Stride" -> {3, 1}, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]conv[[image]]conv1 = ConvolutionLayer[30, 7, "Input" -> {3, 500, 500}, "Stride" -> 1 ]conv2 = ConvolutionLayer[30, 7, "Input" -> {3, 500, 500}, "Stride" -> 7 ]data = RandomReal[1, {3, 500, 500}];
conv1 = NetInitialize@conv1;
conv2 = NetInitialize@conv2;
conv1[data];//AbsoluteTiming
conv2[data];//AbsoluteTiming特性と関係 (2)
次の関数は,入力サイズとパラメータが与えられた際に,非チャンネル次元のサイズを計算する:
outputSize[inputSize_List, kernSize_, stride_, pad_, dilate_] := Floor[(inputSize + 2 * pad - (dilate * (kernSize - 1) + 1)) / stride] + 1入力サイズ{256,252},カーネルサイズ{2,3},ストライド2,拡張因子{3,4},充填サイズ{1,2}のときの出力サイズ:
outputSize[{256, 252}, {2, 3}, 2, {1, 2}, {3, 4}]ConvolutionLayerを使って二次元たたみ込みを計算することができる:
kernel = {{10, 1}, {1, 3}};
data = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
ConvolutionLayer[1, "Weights" -> {{kernel}}, "Biases" -> {0}][{data}]//First // Normalこれは,カーネルの向きを逆にした後のListConvolveに等しい:
ListConvolve[Reverse[kernel, {1, 2}], data]考えられる問題 (5)
すべての入出力次元が分かるまでConvolutionLayerは初期化できない:
NetInitialize@ConvolutionLayer[3, {2, 2}]NetInitialize@ConvolutionLayer[3, 2, "Input" -> {5, 23, 25}]ConvolutionLayerは記号入力を受け付けない:
conv = NetInitialize@ConvolutionLayer[1, {1, 1}, "Input" -> {1, 1, 1}];
conv[{{{1}}}]conv[{{{x}}}]ConvolutionLayer[3, {15, 15}, "Input" -> {3, 10, 10}]"ChannelGroups"は入力チャネル数の約数でなければならない:
ConvolutionLayer[6, 2, "ChannelGroups" -> 3, "Input" -> {3, Automatic, Automatic}]ConvolutionLayer[6, 2, "ChannelGroups" -> 4, "Input" -> {3, Automatic, Automatic}]ConvolutionLayer は,入力サイズが異なる入力のバッチには適用することができない:
conv = NetInitialize@ConvolutionLayer[3, {2, 2}, "Input" -> {2, Automatic, Automatic}];
conv[RandomReal[1, {2, 2, 3, 3}]]conv@{RandomReal[1, {2, 3, 3}], RandomReal[1, {2, 4, 4}]}テクニカルノート
関連するガイド
-
▪
- ニューラルネットワーク ▪
- ニューラルネットワークの構築と特性 ▪
- ニューラルネットワーク層 ▪
- 機械学習 ▪
- コンピュータビジョン
テキスト
Wolfram Research (2016), ConvolutionLayer, Wolfram言語関数, https://reference.wolfram.com/language/ref/ConvolutionLayer.html (2021年に更新).
CMS
Wolfram Language. 2016. "ConvolutionLayer." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2021. https://reference.wolfram.com/language/ref/ConvolutionLayer.html.
APA
Wolfram Language. (2016). ConvolutionLayer. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/ConvolutionLayer.html
BibTeX
@misc{reference.wolfram_2026_convolutionlayer, author="Wolfram Research", title="{ConvolutionLayer}", year="2021", howpublished="\url{https://reference.wolfram.com/language/ref/ConvolutionLayer.html}", note=[Accessed: 09-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_convolutionlayer, organization={Wolfram Research}, title={ConvolutionLayer}, year={2021}, url={https://reference.wolfram.com/language/ref/ConvolutionLayer.html}, note=[Accessed: 09-September-2026]}