コンボリューション (2)

転置畳み込み

転置畳み込みの背景

通常、画像に対して畳み込み演算を実行する場合、複数の層で畳み込み演算を行った後、出力画像のサイズは非常に小さくなります、つまり、画像が縮小されます。一部の特定のタスク (画像セグメンテーション、GAN など) では、さらなる計算を実行する前に画像を元のサイズに復元する必要があります。次の図に示すように、画像サイズを復元し、画像を小さい解像度から大きい解像度にマッピングするこの操作は、アップサンプリングと呼ばれます。

ここに画像の説明を挿入します

アップサンプリングには多くの方法があります。一般的なものには、最近傍補間、双線形補間などが含まれます。ただし、これらのアップサンプリング方法はすべて人々の以前の経験に基づいて設計されており、多くのシーンではあまり効果的ではありません。したがって、ニューラル ネットワークに、それ自体でより適切に補間する方法を学習させたいと考えています。これが、次に紹介する転置畳み込み手法です。

転置畳み込みとその応用

転置畳み込み (Transpose Convolution) は、文献によってはデコンボリューション (Deconvolution) とも呼ばれます。転置畳み込みでは、事前に設定された補間方法は使用されず、学習可能なパラメータがあり、ネットワークが自ら学習して最適なアップサンプリング方法を取得できます。転置畳み込みは、次のような特定の分野で広く使用されています。

  • DCGANでは、ジェネレーターがランダムな値を使用してフルサイズの画像に変換しますが、このとき、転置コンボリューションが必要になります。

  • セマンティック セグメンテーションでは、畳み込み層を使用してエンコーダで特徴を抽出し、その後デコーダ層で元のサイズに復元することで、元の画像の各ピクセルを分類できます。このプロセスでは、転置畳み込みの使用も必要になります。FCN や Unet などの古典的な方法。

  • CNN の可視化: CNN で取得した特徴マップを転置畳み込みによってピクセル空間に復元し、特定の特徴マップがどの画像モードに敏感かを観察します。

転置畳み込みと標準畳み込みの違い

標準的な畳み込みの操作は、実際には、畳み込みカーネル内の要素と入力行列上の対応する位置にある要素のピクセルごとの積と和を実行することです。次に、コンボリューション カーネルを使用して、入力行列のすべての位置が移動されるまで、入力行列上を段階的にスライドさせます。

ここでは、具体的な操作プロセスを示す簡単な例を示します。入力が 4×4 行列で、パディングなしの 3×3 標準畳み込みを使用して計算され、ストライドが 1 に設定されていると仮定します。最終的な出力結果は、次の図に示すように 2×2 行列になります。

ここに画像の説明を挿入します
上の例では、入力行列の右上隅の 3×3 の値が出力行列の右上隅の値に影響しますが、これは実際には標準の畳み込みにおける受容野の概念に対応します。したがって、3×3 標準コンボリューション カーネルは、入力行列の 9 つの値と出力行列の 1 つの値の間に対応関係を確立していると言えます。

要約すると、標準の畳み込み演算は実際には多対 1 の関係を確立すると考えることもできます。

転置畳み込みの場合、実際には逆の操作、つまり 1 対多の関係を確立する必要があります。上記の例で、実際に確立したいのは、以下の図に示すように、出力畳み込みの 1 つの値と入力畳み込みの 9 つの値の間の関係です。

ここに画像の説明を挿入します
もちろん、情報理論の観点から見ると、畳み込み演算は不可逆であるため、転置畳み込みでは出力行列や畳み込みカーネルを使って元の入力行列を計算するのではなく、相対的な位置関係を保った行列を計算します。

転置畳み込みの数学的導出

4 × 4 4\times{4}のサイズを定義します4×4入力マトリックス入力 入力in p u t input = [ x 1 x 2 x 3 x 4 x 6 x 7 x 8 x 9 x 10 x 11 x 12 x 13 x 14 x 15 x 16 x 17 ] input=\left[\begin{array] }{ccc} x_1 & x_2 & x_3 & x_4 \\ x_6 & x_7 & x_8 & x_9 \\ x_{10} & x_{11} & x_{12} & x_{13} \\ x_{14} & x_{ 15} & x_{16} & x_{17} \end{配列}\right]入れ_ _= バツ1バツ6バツ10バツ14バツ2バツ7バツ11バツ15バツ3バツ8バツ12バツ16バツ4バツ9バツ13バツ17 3 × 3 3\times{3}のサイズ3×3次元配列kernel = [ w 0 , 0 w 0 , 1 w 0 , 2 w 1 , 0 w 1 , 1 w 1 , 2 w 2 , 0 w 2 , 1 w 2 , 2 ] kernel=\left [\ begin{array}{ccc} w_{0.0} & w_{0.1} & w_{0.2} \\ w_{1.0} & w_{1.1} & w_{1.2 } \\ w_{2,0} & w_{2, 1} & w_{2,2} \end{配列}\right]カーネル_ _ _ _= w0、0 _ _w1、0 _ _w2、0 _ _w0、1 _ _w1、1 _ _w2、1 _ _w0、2 _ _w1、2 _ _w2、2 _ _ stride=1、padding=0 とし、出力特徴マップの計算方法o = i + 2 p − ks + 1 o = \frac{i + 2p - k}{s} + 1 に従います。ああ=si + 2 p k+1 の場合、サイズ 2×2 の出力行列出力を取得できます。 Output = [ y 0 y 1 y 2 y 3 ] Output=\left[\begin{array}{ccc} y_0 & y_1 \\ y_2 & y_3 \end {配列}\右]出力する_ _ _=[y0y2y1y3]ここで、式を変えて、入力行列input input を入力出力マトリックス出力出力出力列ベクトルXXに展開されますXと列ベクトルYYY、次にベクトルXXXとベクトルYYYの次元は16 × 1 16\times{1}16×14 × 1 4\回{1}4×1はそれぞれ次の式で表すことができます: \begin{array}{ccc} x_1 \\ x_2 \\ x_3 \\ x_4 \\ x_6 \\ x_7 \\ x_8 \\ x_9 \\ x_{10} \\ x_{11} \\ x_{12} \\ x_{13} \\ x_{14} \\ x_{15} \\ x_{16} \\ x_{17} \end{array}\right]バツ= バツ1バツ2バツ3バツ4バツ6バツ7バツ8バツ9バツ10バツ11バツ12バツ13バツ14バツ15バツ16バツ17 Y = [ y 0 y 1 y 2 y 3 ] Y=\left[\begin{array}{ccc} y_0 \\ y_1 \\ y_2 \\ y_3 \end{array}\right]Y= y0y1y2y3 次に、行列演算を使用して標準の畳み込み演算を記述します。ここでは行列CCを使用します。C は新しい畳み込みカーネル行列を表します: Y = CXY = CXY=CXを導出した後、この疎行列CCC、その次元は4 × 16 4\times{16}4×16C = [ w 0 , 0 w 0 , 1 w 0 , 2 0 w 1 , 0 w 1 , 1 w 1 , 2 0 w 2 , 0 w 2 , 1 w 2 , 2 0 0 0 0 0 0 w 0 , 0 w 0 、1 w 0 、2 0 w 1 、0 w 1 、1 w 1 、2 0 w 2 、0 w 2 、1 w 2 、2 0 0 0 0 0 0 0 0 w 0 、0 w 0 、 1 w 0 、2 0 w 1 、0 w 1 、1 w 1 、2 0 w 2 、0 w 2 、1 w 2 、2 0 0 0 0 0 0 w 0 、0 w 0 、1 w 0 、2 0 w 1 , 0 w 1 , 1 w 1 , 2 0 w 2 , 0 w 2 , 1 w 2 , 2 ] \scriptsize{ C=\left[\begin{array}{ccc} w_{0,0} & w_ {0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1 } & w_{2,2} & 0 & 0 & 0 & 0 & 0 \\ 0 & w_{0,0} & w_{0,1} & w_{0,2} & 0 & w_{1,0 } & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1} & w_{2,2} & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & w_{0,0} & w_{0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1} & w_{2,2} & 0 \\ 0 & 0 & 0 & 0 & 0 & w_{0, 0} & w_{0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_ {2,1} & w_{2,2} \end{array}\right] }C= w0、0 _ _000w0、1 _ _w0、0 _ _00w0、2 _ _w0、1 _ _000w0、2 _ _00w1、0 _ _0w0、0 _ _0w1、1 _ _w1、0 _ _w0、1 _ _w0、0 _ _w1、2 _ _w1、1 _ _w0、2 _ _w0、1 _ _0w1、2 _ _0w0、2 _ _w2、0 _ _0w1、0 _ _0w2、1 _ _w2、0 _ _w1、1 _ _w1、0 _ _w2、2 _ _w2、1 _ _w1、2 _ _w1、1 _ _0w2、2 _ _0w1、2 _ _00w2、0 _ _000w2、1 _ _w2、0 _ _00w2、2 _ _w2、1 _ _000w2、2 _ _ ここでは、図 4 を使用して、上記の行列演算プロセスを直感的に示します。

ここに画像の説明を挿入します
転置畳み込みは、実際にはこのプロセスの逆の操作です。つまり、X は C と Y を通じて取得されます: X = CTYX = C^TYバツ=CT Yこのとき、新しい疎行列は16 × 4 1​​6\times{4}16×4CTC ^TCT さん、ここでは次の図を使用して、転置畳み込み行列演算の例を視覚的に示します。ここで、転置畳み込みに使用される重み行列は、必ずしも元の畳み込み行列から来ているわけではなく、重み行列の形状が転置畳み込み行列と同じであるだけです。

ここに画像の説明を挿入します
次に、サイズ 2×2 の入力行列からサイズ 4×4 の出力行列を取得できるように、16×1 の出力結果を並べ替えます。

転置畳み込み出力特徴マップのサイズ

stride=1 の転置畳み込み

前述の畳み込みカーネル行列CCも使用します。

C = [ w 0 , 0 w 0 , 1 w 0 , 2 0 w 1 , 0 w 1 , 1 w 1 , 2 0 w 2 , 0 w 2 , 1 w 2 , 2 0 0 0 0 0 0 w 0 , 0 w 0 、1 w 0 、2 0 w 1 、0 w 1 、1 w 1 、2 0 w 2 、0 w 2 、1 w 2 、2 0 0 0 0 0 0 0 0 w 0 、0 w 0 、 1 w 0 、2 0 w 1 、0 w 1 、1 w 1 、2 0 w 2 、0 w 2 、1 w 2 、2 0 0 0 0 0 0 w 0 、0 w 0 、1 w 0 、2 0 w 1 , 0 w 1 , 1 w 1 , 2 0 w 2 , 0 w 2 , 1 w 2 , 2 ] \scriptsize{ C=\left[\begin{array}{ccc}w_{0,0} & w_ {0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1 } & w_{2,2} & 0 & 0 & 0 & 0 & 0 \\ 0 & w_{0,0} & w_{0,1} & w_{0,2} & 0 & w_{1,0 } & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1} & w_{2,2} & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & w_{0,0} & w_{0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1} & w_{2,2} & 0 \\ 0 & 0 & 0 & 0 & 0 & w_{0, 0} & w_{0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_ {2,1} & w_{2,2} \end{array}\right]}C= w0、0 _ _000w0、1 _ _w0、0 _ _00w0、2 _ _w0、1 _ _000w0、2 _ _00w1、0 _ _0w0、0 _ _0w1、1 _ _w1、0 _ _w0、1 _ _w0、0 _ _w1、2 _ _w1、1 _ _w0、2 _ _w0、1 _ _0w1、2 _ _0w0、2 _ _w2、0 _ _0w1、0 _ _0w2、1 _ _w2、0 _ _w1、1 _ _w1、0 _ _w2、2 _ _w2、1 _ _w1、2 _ _w1、1 _ _0w2、2 _ _0w1、2 _ _00w2、0 _ _000w2、1 _ _w2、0 _ _00w2、2 _ _w2、1 _ _000w2、2 _ _ 対応する出力行列の出力は次のとおりです。

出力 = [ y 0 y 1 y 2 y 3 ] 出力 =\left[\begin{array}{ccc}y_0 & y_1 \\ y_2 & y_3\end{array}\right]出力する_ _ _=[y0y2y1y3]出力行列を列ベクトルYYY Y = [ y 0 y 1 y 2 y 3 ] Y=\left[\begin{array}{ccc}y_0 \\ y_1 \\y_2 \\ y_3\end{array}\right]Y= y0y1y2y3 上記の転置畳み込みの計算式に当てはめると、転置畳み込みの計算結果は次のようになります。CT y ' = [ w 0 , 0 y 0 w 0 , 1 y 0 + w 0 , 0 y 1 w 0 , 2 y 0 + w 0 , 1 y 1 w 0 , 2 y 1 w 1 , 0 y 0 + w 0 、0 y 2 w 1 、1 y 0 + w 1 、0 y 1 + w 0 、1 y 2 + w 0 、0 y 3 w 1 、2 y 0 + w 1 、1 y 1 + w 0 、 2 y 2 + w 0 、1 y 3 w 1 、2 y 1 + w 0 、2 y 3 w 2 、0 y 0 + w 1 、0 y 2 w 2 、1 y 0 + w 2 、0 y 1 + w 1 、1 y 2 + w 1 、0 y 3 w 2 、2 y 0 + w 2 、1 y 1 + w 1 、2 y 2 + w 1 、1 y 3 w 2 、2 y 1 + w 1 、 2 y 3 w 2 , 0 y 2 w 2 , 1 y 2 + w 2 , 0 y 3 w 2 , 2 y 2 + w 2 , 1 y 3 w 2 , 2 y 3 ] \scriptsize{ C^Ty'= \left[\begin{array}{ccc} w_{0,0}y_0 & w_{0,1}y_0+w_{0,0}y_1 & w_{0,2}y_0+w_{0,1}y_1 & w_{0,2}y_1 \\ w_{1,0}y_0+w_{0,0}y_2 & w_{1,1}y_0+w_{1,0}y_1+w_{0,1}y_2+ w_ {0,0}y_3 & w_{1,2}y_0+w_{1,1}y_1+w_{0,2}y_2+w_{0,1}y_3 & w_{1,2}y_1+w_{ 0 ,2}y_3 \\ w_{2,0}y_0+w_{1,0}y_2 & w_{2,1}y_0+w_{2,0}y_1+w_{1,1}y_2+w_{1 , 0}y_3 & w_{2,2}y_0+w_{2,1}y_1+w_{1,2}y_2+w_{1,1}y_3 & w_{2,2}y_1+w_{1,2}y_3 \\ w_{2,0 }y_2 & w_{2,1}y_2+w_{2,0}y_3 & w_{2,2}y_2+w_{2,1}y_3 & w_{2,2}y_3 \end{array}\right] }CTy _= w0、0 _ _y0w1、0 _ _y0+w0、0 _ _y2w2、0 _ _y0+w1、0 _ _y2w2、0 _ _y2w0、1 _ _y0+w0、0 _ _y1w1、1 _ _y0+w1、0 _ _y1+w0、1 _ _y2+w0、0 _ _y3w2、1 _ _y0+w2、0 _ _y1+w1、1 _ _y2+w1、0 _ _y3w2、1 _ _y2+w2、0 _ _y3w0、2 _ _y0+w0、1 _ _y1w1、2 _ _y0+w1、1 _ _y1+w0、2 _ _y2+w0、1 _ _y3w2、2 _ _y0+w2、1 _ _y1+w1、2 _ _y2+w1、1 _ _y3w2、2 _ _y2+w2、1 _ _y3w0、2 _ _y1w1、2 _ _y1+w0、2 _ _y3w2、2 _ _y1+w1、2 _ _y3w2、2 _ _y3 デフォルトのキーパディング = 2、設定: input = [ 0 0 0 0 0 0 0 0 0 0 0 0 0 y 0 y 1 0 0 0 0 y 2 y 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] input=\left[\begin{array}{ccc} 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & y_0 & y_1 & 0 & 0 \\ 0 & 0 & y_2 & y_3 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \ end{ array}\right]入れ_ _= 00000000000000y0y20000y1y300000000000000 同時に、標準の畳み込みカーネルが転置されます。

カーネル ' = [ w 2 , 2 w 2 , 1 w 2 , 0 w 1 , 2 w 1 , 1 w 1 , 0 w 0 , 2 w 0 , 1 w 0 , 0 ] カーネル'=\left[\begin{配列 {ccc} w_{2,2} & w_{2,1} & w_{2,0} \\ w_{1,2} & w_{1,1} & w_{1,0} \\ w_ {0,2} & w_{0,1} & w_{0,0} \end{array}\right]カーネル_ _ _ _= w2、2 _ _w1、2 _ _w0、2 _ _w2、1 _ _w1、1 _ _w0、1 _ _w2、0 _ _w1、0 _ _w0、0 _ _ 後続の標準畳み込みの結果、演算プロセスを以下の図に示します。

ここに画像の説明を挿入します

畳み込みカーネル サイズ k、ストライド = 1、パディング = 0 の標準畳み込みの場合、等価な転置畳み込みのサイズはi ' i'になります。'の入力行列に対して演算を実行しo ' o'ああ 为: o ′ = i ′ + ( k − 1 ) o' = i'+(k-1) ああ=+( k1 )同時に、転置畳み込みの入力行列をパディングする必要があります ' = k − 1 padding'=k−1パッドイングラム_ _ _=kパディング1枚

ストライド>1 の転置畳み込み

実際の使用では、ほとんどの場合、より大きなアップサンプリング比を得るために、ストライド > 1 の転置畳み込みを使用します。ここでは、入力サイズを 5×5 に設定し、標準の畳み込みカーネルを上記のように設定し、stride=2、padding=0 に設定します。標準の畳み込み演算後の出力サイズは 2×2 になります。Y = [ y 0 y 1 y 2 y 3 ] Y=\left[\begin{array}{ccc}y_0 \\ y_1 \\ y_2 \\ y_3\end{array}\right]Y= y0y1y2y3 ここでは、ストライド= 2 ストライド = 2ストライド_ _ _ _ _=2 の場合、変換されたスパース行列のサイズは25 × 4 25\times{4}25×4.マトリックスが大きすぎるため、ここでは展開されてリストされません。転置畳み込みの結果は次のようになります。CT y ' = [ w 0 , 0 y 0 w 0 , 1 y 0 w 0 , 2 y 0 + w 0 , 0 y 1 w 0 , 1 y 1 w 0 , 2 y 1 w 1 , 0 y 0 w 1 、1 y 0 w 1 、2 y 0 + w 1 、0 y 1 w 1 、1 y 1 w 1 、2 y 1 w 2 、0 y 0 + w 0 、0 y 2 w 2 、1 y 0 + w 0 、1 y 2 w 2 、2 y 0 + w 2 、0 y 1 + w 0 、2 y 2 + w 0 、0 y 3 w 2 、1 y 1 + w 0 、1 y 3 w 2 、2 y 1 + w 0 、2 y 3 w 1 、0 y 2 w 1 、1 y 2 w 1 、2 y 2 + w 1 、0 y 3 w 1 、1 y 3 w 1 、2 y 3 w 2 、0 y 2 w 2 , 1 y 2 w 2 , 2 y 2 + w 2 , 0 y 3 w 2 , 1 y 3 w 2 , 2 y 3 ] \scriptsize{ C^Ty'=\left[\begin{array}{ ccc} w_{0,0}y_0 & w_{0,1}y_0 & w_{0,2}y_0+w_{0,0}y_1 & w_{0,1}y_1 & w_{0,2}y_1\ \ w_{1,0}y_0 & w_{1,1}y_0 & w_{1,2}y_0+w_{1,0}y_1 & w_{1,1}y_1 & w_{1,2}y_1\\ w_{2,0}y_0+w_{0,0}y_2 & w_{2,1}y_0+w_{0,1}y_2 & w_{2,2}y_0+w_{2,0}y_1+w_{ 0,2}y_2+w_{0,0}y_3 & w_{2,1}y_1+w_{0,1}y_3 & w_{2,2}y_1+w_{0,2}y_3\\ w_{1,0}y_2 & w_{1,1}y_2 & w_{1,2}y_2+w_{1,0}y_3 & w_{1,1}y_3 & w_{1,2 }y_3\\ w_{2,0}y_2 & w_{2,1}y_2 & w_{2,2}y_2+w_{2,0}y_3 & w_{2,1}y_3 & w_{2,2} y_3\ \end{配列}\right] }CTy _= w0、0 _ _y0w1、0 _ _y0w2、0 _ _y0+w0、0 _ _y2w1、0 _ _y2w2、0 _ _y2w0、1 _ _y0w1、1 _ _y0w2、1 _ _y0+w0、1 _ _y2w1、1 _ _y2w2、1 _ _y2w0、2 _ _y0+w0、0 _ _y1w1、2 _ _y0+w1、0 _ _y1w2、2 _ _y0+w2、0 _ _y1+w0、2 _ _y2+w0、0 _ _y3w1、2 _ _y2+w1、0 _ _y3w2、2 _ _y2+w2、0 _ _y3w0、1 _ _y1w1、1 _ _y1w2、1 _ _y1+w0、1 _ _y3w1、1 _ _y3w2、1 _ _y3w0、2 _ _y1w1、2 _ _y1w2、2 _ _y1+w0、2 _ _y3w1、2 _ _y3w2、2 _ _y3  このとき、入力行列にホールとパディングを追加し、標準のコンボリューションカーネルを転置した結果と同等になります。操作手順を下図に示します。

ここに画像の説明を挿入します
畳み込みカーネル サイズ k、ストライド > 1、およびパディング = 0 の標準畳み込みの場合、等価な転置畳み込みのサイズはi ' i'になります。'の入力行列に対して演算を実行しo ' o'ああ 为: o ′ = s ( i ′ − 1 ) + k o' = s(i'-1)+k ああ=s (1 )+k同時に、転置畳み込みの入力行列をパディングする必要があります ' = k − 1 padding'=k−1パッドイングラム_ _ _=k1を埋める場合、隣接する要素間の穴のサイズは s-1 です。したがって、ステップ サイズを制御することでアップサンプリング レートを制御できます。

拡張畳み込み

Atrous コンボリューションの背景

ピクセルレベルの予測問題 (セマンティック セグメンテーションなど、ここでは FCN を例にします) では、画像がネットワークに入力され、FCN は最初に、従来の CNN ネットワークと同様に、画像に対して畳み込みとプーリングの計算を実行し、同時にサイズを削減します。特徴マップの受容野を増加させます。ただし、画像のセグメンテーションはピクセルレベルの予測問題であるため、アップサンプリングに転置畳み込み (Transpose Convolution) を使用して、出力画像のサイズを元の入力画像と一致させます。要約すると、このピクセル レベルの予測問題には 2 つの重要な手順があります: 1 つ目は、畳み込み演算またはプーリング演算を使用して画像サイズを縮小し、受容野を拡大します。2 つ目は、アップサンプリングを使用して画像サイズを拡大します。ただし、ダウンサンプリングに畳み込みまたはプーリング操作を使用すると、非常に深刻な問題が発生します。画像の詳細情報が失われ、小さなオブジェクトの情報が再構築できなくなります (ストライドが2 (2 4 2^より小さい) のプーリング層が 4 つあると仮定します)。424ピクセルのオブジェクト情報を再構築することは理論的に不可能です)。

Atrou 畳み込みとその応用

Dirated Convolution は、一部の文献では Atrous Deconvolution としても知られており、画像セマンティック セグメンテーションにおけるダウンサンプリングによって引き起こされる画像解像度の低下と情報損失の問題に対処するために提案された方法です。Atrous コンボリューションでは、パラメータ Dilation Rate を導入することで、同じサイズのコンボリューション カーネルでより大きな受容野を取得できます。同様に、同じ受容野サイズの下で、拡張畳み込みのパラメータを通常の畳み込みよりも少なくすることも可能です。

Atrous 畳み込みは、次のような特定の分野で非常に幅広い用途があります。

  • セマンティック セグメンテーションの分野: DeepLab シリーズと DUC。DeepLab v3 アルゴリズムでは、ResNet の最後の数ブロックが激しい畳み込みに置き換えられ、出力サイズがはるかに大きくなります。計算量を増やすことなく、解像度が維持され、より高密度の特徴応答が得られるため、元の画像に復元する際の詳細が向上します。

  • ターゲット検出フィールド: RFBNet。RFBNet アルゴリズムでは、拡張畳み込みを使用して人間の視覚野における pRF の離心率の影響をシミュレートし、RFB モジュールは軽量 CNN ネットワークの効果を強化するように設計されています。RFB ネットワークに基づく検出器が提案されています。これは、計算コストを制御しながら SSD の最上位畳み込み層を RFB に置き換えることにより、大幅なパフォーマンスの向上をもたらします。

  • 音声合成分野: WaveNet およびその他のアルゴリズム。

Atrous コンボリューションと標準コンボリューションの違い

サイズが 3×3 の標準的な畳み込みの場合、畳み込みカーネルのサイズは 3×3 で、畳み込みカーネルには合計 9 個のパラメーターが含まれています。畳み込み計算中、畳み込みカーネル内の要素は、入力行列要素はピクセルごとに乗算され、合計されます。標準のコンボリューションと比較して、拡張コンボリューションには、拡張率と呼ばれる追加パラメータがあります。拡張率は、コンボリューション カーネル内の隣接する要素間の距離を制御します。拡張率の変更により、コンボリューション カーネルの受容野のサイズを制御できます。サイズが3×3、拡大率が1、2、4の場合の拡張コンボリューションは下図のようになります。

ここに画像の説明を挿入します
拡張率が 1 の場合、アトラス コンボリューションは標準コンボリューションと同じ方法で計算されます。

ここに画像の説明を挿入します
拡張率 2 の 3*3 アトラス コンボリューション。
ここに画像の説明を挿入します

拡張率 4 の 3*3 アトラス コンボリューション。拡張率が 1 より大きい場合、標準の畳み込みに基づいてホールが注入され、ホール内のすべての値が 0 で埋められます。

拡張畳み込みの受容野

標準畳み込みの場合、標準畳み込みカーネル サイズが 3×3 の場合、入力行列に対して 2 つの標準畳み込み計算を継続的に実行して、2 つの特徴マップを取得します。以下の図に示すように、さまざまな層のコンボリューション カーネルの受容野サイズを観察できます。

ここに画像の説明を挿入します

そのうち、3 × 3 3\times33×3 つの畳み込みに対応する受容野のサイズは3 × 3 3\times33×3、および 2 つの層を通過3 × 3 3\times33×3 回の畳み込みの後、受容野のサイズは5 × 5 5\times55×5

拡張コンボリューションの受容野計算方法は、標準コンボリューションと同様です。Atrous コンボリューションは実際には標準コンボリューション カーネルに '0' を埋めているように見えるため、サイズを拡大した標準コンボリューション カーネルとして想像でき、標準コンボリューション カーネルを使用して受容野を計算できます。ひどい畳み込み。コンボリューションカーネルサイズ k と拡張率 r による拡張コンボリューションの場合、受容野 F の計算式は次のとおりです。F = k + ( k − 1 ) ( r − 1 ) F = k + (k-1)(r -1)F=k+( k1 ) ( r1 )コンボリューションカーネルサイズ k=3、拡大率 r=2 の場合、計算方法は下図のようになります。

ここに画像の説明を挿入します
このうち、1層のatrousたたみ込みを通過した後の受容野のサイズは5×5であり、2層のatrousたたみ込みを通過した後の受容野のサイズは9×9に増加します。

グループ畳み込み

グループ化された畳み込みの背景

グループ畳み込みは AlexNet に初めて登場しました。当時のハードウェア リソースの制限により、AlexNet ネットワークのトレーニング時にネットワーク全体を 1 つの GPU に配置してトレーニングすることは困難であったため、著者は畳み込み演算を複数の GPU に分割してそれぞれ計算し、最終的に複数の GPU の結果を結合しました。 . 融合を行う。そこで、グループ化畳み込みという概念が生まれました。

グループ化コンボリューションと標準コンボリューションの違い

寸法H 1 × W 1 × C 1 の場合 H_1×W_1×C_1H1×W1×C1標準コンボリューションカーネルのサイズがh 1 × w 1 × C 1 の場合の入力行列 h_1×w_1×C_1h1×w1×C1、合計C 2 C_2C2標準の畳み込みカーネルが使用される場合、標準の畳み込みは完全な入力データに対して演算され、最終的な出力行列のサイズはH 2 × W 2 × C 2 H_2×W_2×C_2となります。H2×W2×C2ここで、畳み込み演算の前後で特徴マップのサイズが変わらないと仮定すると、上記のプロセスは次の図のように表すことができます。

ここに画像の説明を挿入します

上記のプロセスが同じデバイス上で完全に実行されることを考慮すると、デバイスのパフォーマンスに対する要件も高くなります。

グループ化された畳み込みにより、このプロセスが改善されます。グループ化畳み込みでは、グループ番号ggを指定してgはグループの数を決定し、入力データをgggグループ。ここでのグループ化は深さのグループ化を指し、入力の幅と高さは変更されないことに注意してください。つまり、 C 1 g \frac {C_1} {g}ごとにgC1各チャネルのデータは 1 つのグループに分割されます。入力データが変化するため、対応するコンボリューション カーネルもそれに応じて変更する必要があります。つまり、各コンボリューション カーネルの入力チャネル数はC 1 g \frac {C_1} {g}になります。gC1、コンボリューション カーネルのサイズを変更する必要はありません。同時に、各グループの畳み込みカーネルの数も元のC 2 C_2から変更されます。C2C 2 g \frac {C_2} {g}になりますgC2各グループ内の畳み込み演算にも標準的な畳み込み演算の計算方法が使用されるため、ggを求めることができます。gグループのサイズはH 2 × W 2 × C 2 g H_2×W_2×\frac {C_2} {g}H2×W2×gC2出力行列は最終的にこのggになります。最終結果は、出力行列のgグループを結合することによって取得できます。スプライシングが完了した後、最終的な出力サイズは変更されず、H 2 × W 2 × C 2 H_2×W_2×C_2H2×W2×C2グループ化コンボリューションの演算過程を下図に示します。

ここに画像の説明を挿入します
標準的な畳み込みプロセス全体を、並行して実行される小さなサブ演算の g グループに分割するため、最終的には実行装置の要件が軽減されます。同時に、グループ畳み込みによりパラメータの数も減らすことができます。上記の標準畳み込みでは、パラメーター量は次のとおりです: h 1 × w 1 × C 1 × C 2 h_1 \times w_1 \times C_1 \times C_2h1×w1×C1×C2グループ化畳み込みを使用した後のパラメーター量は次のようになります: h 1 × w 1 × C 1 g × C 2 g × g = h 1 × w 1 × C 1 × C 2 × 1 g h_1 \times w_1 \times \ frac{C_1 }{g} \times \frac{C_2}{g} \times g = h_1 \times w_1 \times C_1 \times C_2 \times \frac{1}{g}h1×w1×gC1×gC2×g=h1×w1×C1×C2×g1

応用例

例:H×W×64サイズの場合 H×W×64H×W×64入力行列、標準コンボリューション カーネルのサイズが3 × 3 × 64 の場合 3×3×643×3×図64において、標準コンボリューションカーネルが64個あるとき、グループ数がg=2の場合のグループコンボリューション計算方法を次の図に示す。

ここに画像の説明を挿入します
このとき、各グループの入力チャネル数は32となり、コンボリューションカーネルチャネル数も32となります。したがって、標準コンボリューションに相当するパラメータ量は3×3×64×64=36864であるのに対し、グループコンボリューションのパラメータ量は3×3×32×32×2=18432となり、半分に減少する。

おすすめ

転載: blog.csdn.net/weixin_49346755/article/details/127484811