畳み込み演算
これを理解するのは難しくありません。コンピューターでは画像が個々のピクセルで構成されており、行列で表すことができることがわかっています。
5x5 の入力画像を想定して、3x3 行列 (ランダムに生成される値) を定義し、
このコンボリューション カーネルを入力画像で取り込み、左上隅の 3x3 行列を選択し、コンボリューションカーネルとこれ 行列の対応する位置を乗算し、9 つの数値を取得し、これらの 9 つの数値を加算して、最終的に結果を取得します。
次に、コンボリューション カーネルを 1 つ右に移動し、上記の計算を繰り返して、別の数値を取得します。
計算後、右に移動し続けて再計算します。3
つの計算で得られた値が
1 つ下のスペースに移動し、5x5 の入力画像全体を計算して 9 つの計算結果が得られるまで上記の操作を繰り返します。
これは畳み込みの結果であり、この操作全体が畳み込み操作です。
次に、いくつかの質問があります。
- Q1: 右への移動はそれぞれ1マスしかできませんか?
- A1: いいえ、1 マス移動するということは、ステップ サイズが 1 であることを意味します。ステップ サイズを 2 に設定すると、毎回 2 マス移動し、ステップ サイズは
stride
私たちが設定します。 - Q2: コンボリューションカーネルの値はどのように設定されますか?
- A2:最初はランダムに生成されました(後で学習して更新されます)
- Q3: では、畳み込みの後、画像は小さくなる必要がありますか?
- A3: いいえ、上の例では、5x5 の入力が畳み込まれて 3x3 になり、円を 5x5 の画像で塗りつぶすと 7x7 の画像になり、この畳み込みカーネルを畳み込みに使用します。5x5 が得られます。出力。実際にはこれを行います。
padding
塗りつぶすかどうかを示すパラメータがあり、塗りつぶしの範囲と塗りつぶしの値を設定できます。通常は 0 で塗りつぶされます。
ちなみに、式を追加します。
入力画像を W x W、コンボリューション カーネル サイズを FxF、ステップ サイズを stride=S、パディングを P (塗りつぶされたピクセルの数) に設定すると、
出力画像のサイズ = (W - F +2P)/S +1
そして、畳み込みプロセス全体を理解すると、次の図が理解できるようになります。
この図は、入力画像が 5x5、畳み込みカーネルが 3x3、ステップ サイズが 1、パディング = 1 であるため、出力が 5x5 であることを示しています。
実際の動作
畳み込み処理は上記の通りですが、実際にコードを書いてみると、各ステップはそれほど苦労せずに実装できます。
フレームワークは対応する関数をすでにカプセル化しているので、関数を呼び出して関連するパラメーターを渡すだけで済みます。
例として pytorch フレームワークを取り上げます (tensorflow も同様です)。Conv2d を
操作するときは、次のパラメータを設定する必要があります。
一般的に使用されるパラメータをいくつか説明しましょう。
- in_channels: 入力チャンネルの数
- out_channels: 出力チャンネルの数
- kernel_size: 畳み込みカーネルのサイズ。タイプは int またはタプルです。畳み込みが正方形の場合、整数辺の長さのみが必要です。畳み込みが正方形でない場合は、高さと幅を示すためにタプルを入力する必要があります。(コンボリューションカーネルはユーザーが設定する必要はありません。サイズを指定するだけでよく、内部の値はランダムに生成されます)
- stride: ステップ サイズ (つまり、毎回数ピクセルずつ移動します。デフォルトは 1)
- パディング: 塗りつぶす円の数、デフォルトは 0、パディングなし (パディングの値は 0)
- dilation: コンボリューション カーネル間の間隔を制御します (ホール コンボリューションを行うように設定します)。
- グループ: 入力と出力の間の接続を制御します。
- bias:bias、学習したバイアスを出力に追加するかどうか、デフォルトは True です
- padding_mode: パディングモードを設定します。
フィルターとカーネル
ここでは、次のチャネル数の説明に焦点を当てます。
画像が 6x6、チャネル数が 1 (白黒画像など)、コンボリューション カーネルのサイズが 3x3、ステップ サイズが 1、パディングなしであるとします。 (パディングは0です)
当面は考慮しませんout_channels
設定の問題は後述します
つまり、現在のパラメータ設定は、in_channels=1
kernel_size=3
stride=1
padding=0
これが計算でき、出力画像が4x4で、模式図を描きましたが、ご覧の
とおり、RGB 画像が 3 チャンネルであることもわかります。では、上の図が RGB 画像である場合、出力結果は何でしょうか? つまり、パラメータ設定は次のとおり
ですin_channels=3
kernel_size=3
stride=1
padding=0
。出力結果はまだ 1 チャンネルです。
ここで畳み込みカーネルが 3 つの重ね合わせに変化していることがわかります。
学生の中には、上記の単一チャネルの畳み込み演算は理解しているだけで、マルチチャネルの畳み込み演算は理解していない人もいます。
入力画像が 3 チャネルの場合、コンボリューション カーネルも 3 チャネルになります。
実際in_channels
、重要な点in_channels
は、入力チャンネル数であり、フィルターのチャンネル数でもあるということです。
kernel
これをコンボリューション カーネルと呼び、サイズは 3x3 で
、入力が 3 チャネル画像の場合、コンボリューション カーネルも 3 チャネルになります。
単層のコンボリューション カーネルをkernel
多層スタックと呼び、これは次のようになります。filter
フィルターといいます。
注:この説明は正確ではありません。理解を容易にするためのものです。
kernel
と の具体的な意味については、歴史的な理由があり、これらの用語も他の分野から借用したものであり、現在のニューラル ネットワークの学習では、これらが理解されている限り、詳細に学習したり参照したりする必要filter
はありません。コンボリューションカーネル。このブログ投稿のコメント欄では学生による説明もご覧いただけますkernel
filter
入力画像が 3 チャネルの場合、コンボリューション カーネルも 3 チャネルになります。
それらの間の演算は、この新しいコンボリューション カーネル (27 個の数値) と入力画像の対応する位置によって実行されます。
27 個の数値と入力画像内の 27 個の数値をそれぞれ乗算し、加算して数値を取得します。この計算を繰り返し、入力画像全体を調べて 16 個の数値を取得します。
図に示すように:
したがって、計算結果も一次元の結果、すなわち単一チャネルの結果となる。
したがって、カーネルとフィルターの概念は明確です。
kernel
: カーネルは長さ×幅の 2D マトリックスです。
filter
: フィルターは長さ × 幅 × 深さの 3 次元立方体で、深さはフィルターが構成されているカーネルの数です。
カーネルはフィルタの基本要素であると言え、複数のカーネルがフィルタを形成します。
実際、カーネルとフィルターはどちらも本質的にはコンボリューション カーネルですが、1 つは単一のチャネルに対応し、もう 1 つは複数のチャネルに対応するため、次元は
入力filter
チャネルの数に依存します。
次に、2 つの質問があります。
フィルターにはカーネルをいくつ含めるべきですか?
答えは、入力チャンネルの数によってin_channels
決まる
1 つのレイヤーにフィルターの数がいくつあるべきかということです。
答えは、抽出したい特徴の数に応じて、フィルターが特定の特徴の抽出を担当し、出力したいだけフィルターを設定できるということです。
では、フィルターを設定するためのパラメーターは何でしょうか?
これは前に説明しなかったものですout_channels
。手動で設定することもできることを忘れないでくださいout_channels
。上の図では、フィルター操作の結果は 1 つのチャンネルです。設定すると、出力チャンネルはout_channels=2
2 になります。写真が示すように:
それで。要約すると。
filter
出力チャネルの数を決定するものはいくつかあります
。コードを記述するとき、フィルタの数を指定する必要はありませんが、出力チャネルを直接指定するため、出力チャネルがハイパーパラメータになります。
in_channels
フィルタのチャネル数が決まり、out_channels
フィルタの設定によってフィルタの数が決まり、この層の畳み込みの結果がout_channels
次の層になりますin_channels
。
つまり、out_channels
と はin_channels
関係ありません。
1x1畳み込み層
1x1 畳み込み層は特別な畳み込み層です。
畳み込みカーネルの高さと幅は 1 に等しく、これは空間情報を認識しません。これは、一度に 1 つの空間ピクセルのみを参照するためです。チャネル内の空間情報。
しかし、チャネルをマージするためによく使用されます。その出力値は、対応する入力位置および1 1
で異なるチャネルの値を重み付けすることに相当します。コンボリューション カーネルの機能は、情報を融合することです異なるチャネルのマッチングは、入力層で入力チャネルと出力チャネルを直接融合するだけであり、入力全体をベクトルに取り込むことと同等であり、チャネル数は等しい1の畳み込み層は、全結合層と同等であり、制御情報をまったく考慮しません。これは、全結合層は空間情報を考慮せず、特徴次元での融合のみを考慮するためです (つまり、入力チャンネルの寸法)
視覚的な例
実際のネットワーク LeNET5 を使用して、今説明した内容を確認できます。
これは 32x32 の手書きデジタル画像を入力します
6@28x28 は次のことを意味します: 最初の畳み込み層の出力チャネルは 6、出力サイズは 28x28
2 番目はプーリング層、チャネル数は同じまま、または 6、サイズは半分になります、そしてそれは14x14になり、
3番目は依然として畳み込み層、16チャネル、サイズ10x10であり
、次に4番目はプーリング層、16チャネル、サイズ5x5
であり、最後に2つの完全に接続された層があり
、最後に出力結果です。
LeNET5 の最初の層は畳み込み層で、入力データは 32x32x1、畳み込みカーネル サイズは 5x5、ステップ サイズ = 1、パディング = 0、出力は 6 @ 28x28 です。ここでの入力は単一です-channel、つまり
、in_channels=1
フィルターの深さは 1 ですが、出力チャンネル要件は 6、つまりout_channels=6
6 つのフィルターが必要となり、最終的に 6 つの 28x28 画像が取得されます。
図に示すように: これは LeNET5 全体のネットワーク可視化モデルです。青い層は 32x32 です。畳み込みの後、次の層が得られます。黄色の層です。黄色の層が Cube であることがわかります。展開すると
、実際に 6 つの 28x28 の結果が表示されます。
この視覚化の Web サイトのアドレスは、https://tensorspace.org/index.html です。
プーリング
畳み込み演算を理解すると、プーリングははるかに簡単になります。プーリング操作では、3x3 などのカーネルを使用して、入力画像上の 3x3 に対応する位置に移動し、これら 9 つの数値のうち最大のものを出力結果として選択します。これは最大プーリングと呼ばれます。
出力チャンネル = 入力チャンネル
(複数のチャンネルが入力される場合、各チャンネルをプールする必要があります)
完全な接続
全結合層は通常、畳み込みニューラル ネットワークの最後にあります。彼の入力は、前の畳み込みプーリングによって得られた結果です。「平坦化」とは、得られた結果行列を列ベクトルに平坦化することです。では、完全な接続はこの列ベクトルに対してどのように動作するのでしょうか?
図に示すように、左側の x1、x2、x3 が平坦化後のベクトルであるとすると、x 1 × w 11 + x 2 × w 21 + x 3 × w 31 = b 1 x_1\ となります。 w_{11} 回 +x_2\w_{21}+x_3\w_{31} 回 =b_1バツ1×w11+バツ2×w21+バツ3×w31=b1
同様に、b2もこのようにして計算される。この計算プロセスは行列演算として表現でき、
この演算では、w 行列の列数を増やす限り、異なる数の結果を得ることができます。たとえば、w を 3x3 に設定すると、1x3 の結果が得られます。したがって、全結合層はベクトルの列と、定義できる最終結果の数を出力します。
それで、どういう意味ですか?
全結合層 (FC) は、畳み込みニューラル ネットワーク全体で「分類器」の役割を果たします。畳み込み層、プーリング層、活性化関数層などの演算が元のデータを隠れ層の特徴空間にマッピングする場合、全結合層は学習した「分散特徴表現」をサンプルのラベル空間にマッピングする役割を果たします。
そうすることで、特徴量の位置が分類に与える影響を軽減できます。本来、特徴量マップは行列であるため、特徴量の位置が分類に影響します。たとえば、画像内の猫を識別する場合、猫は次のようになります。画像の左上隅にある場合、左上隅は検出できますが、画像の右下隅にある場合は検出できません。この値は猫の予測確率であり、猫がどこにいても確率が大きければ猫は存在します。そうすることで空間構造の特徴が無視され、堅牢性が向上します。