ディープラーニングについてディープにラーニング。

思いっきり、自分が学んだことのアウトプットしていきますが、何分初心者。もし何かアドバイス等頂けましたら幸いです!

畳み込みの用語について

今回は、畳み込みの用語とかについて記載する

パディング

畳み込みの処理を行うで!の前に、入力データの修理の固定のデータを埋めること。
イメージはこんな感じ

f:id:kawam0t0:20191225210656p:plain

行う理由は、
例えば、入力データが4×4でフィルターが3×3だったとしよう。そこで移動間隔(ストライド)を1としたとき、
出力サイズが縮小してしまう。
このように畳み込みを行うにつれて、縮小されていったら、ある時点で1になって、それ以上畳み込みができなくなる。
そのため、パディングの幅を1にしておくと、入力サイズが4×4
であっても出力は4×4に保たれるって話。

ストライド

これはカーネルを適用するときの移動間隔のこと

f:id:kawam0t0:20191225211031p:plain


この図でも縦・横の2次元のデータでのサンプルだった。これがもし3次元(チャンネル数を持つ)データだった場合の畳み込みがある場合はどうするのか?

f:id:kawam0t0:20191225211234p:plain

こちらの図は3チャンネルを保持した3次元のデータ。
画像とかは基本3次元。

それぞれのチャネルごとに入力データと対応する各フィルターの畳み込み演算を行って
(それぞれ対応する数字を掛け算して、それから全ての数字を総和して)出力する。

f:id:kawam0t0:20191225211717p:plain

ここで注意が必要。
それは、入力データのチャンネル数と、フィルターのチャンネル数は同じでなければならない。
(もちろん縦×横は違っていてOK)

ブロックで考える

この畳み込み、ブロックで考えるとわかりやすい。
3次元(チャンネル数、縦、横)のデータを表現するときは直方体のブロックで表現できる。

f:id:kawam0t0:20191225212055p:plain

このデータはチャネル数(奥行き)が1のため、特徴マップ自体も1になる。
では、出力層に複数のチャネルを持つ出力データを出力するには、どうしたらよいか。

f:id:kawam0t0:20191226194138p:plain

結論はこうだ。
つまり、
FN個のフィルターを適用することで、出力もFN個できる。
つまり、フィルターの数 =出力データの数、になる。

入力データが(3 , 100 , 100)の時、フィルターが(2,3,3,3)と表示されていたら、
フィルターはチャネル数③つで、3×3のフィルターが2個ある、って話になる。
そこから、出力データも必然2個になる。
フィルターとは何度も言うが、重みのことだ。
そして、完成したブロックを次の層に渡していくのがCNN。
複数のフィルターがある場合は、もちろん、フィルターは4次元になる。

バッチ処理

全結合層のニューラルネットワークだろうが、
畳み込みネットワークだろうが、バッチ処理は行う。
バッチとは、小さな単位で塊を作って、バッチ単位で学習を行うってやつ。
こうすることで、精度、処理速度も向上が図れる。

覚えておかなければならないのは、バッチ処理を行う場合、
次元数を1、増やすことだ。

↓バッチ前
f:id:kawam0t0:20191226195202p:plain

↓バッチ後
f:id:kawam0t0:20191226195222p:plain

ちょっと、ここらで整理しよう。
図の中のFNはあくまでフィルターの数である。
kのフィルターの数によって、バイアス、出力の特徴マップのチャネル数が変わってくる。
つまり、フィルターの数だけ、出力の次元数も増えてくる。

一方バッチサイズは単純に一つの処理を行う際の塊みたいなものなので、
もちろん、バッチサイズでチャネル数が変わることはあり得ない。

バッチ処理によって、単純に次元数が増えるだけである。
(しかも初めに飛び込んでくる…)
確か、パイトーチのコードもそうだったな…

ちなみにバッチサイズが適応されるのは、
当たり前だが、パラメータ以外の要素になる。
ここでは、入力データ、出力データになる。
(バッチサイズ、チャネル数、縦、横)

では、また。