PythonとKerasによるDeepLearning個人的なまとめNo.03(CNN)

全結合での内部の行列演算

Denseの第1引数は変換あとの次元数に相当する.

inputs = Input(shape=(28,28))                         # shape =(28,28)
x1 = Flatten()(inputs)                                # shape (28,28)=>(784)
x2 = Dense(512, activation='relu')(x1)                # shape (784)=>(512)
x3 = Dense(512, activation='relu')(x2)                # shape (512)=>(512)
y = Dense(10, activation='softmax')(x3)         

行ベクトルが1つのサンプルを構成する特徴ベクトル

f:id:takaishi78:20200119144654p:plain
全結合

CNN

畳み込みでの行列計算

Conv2D第1引数は深さの次元数、第2引数は窓の大きさを表している.

inputs = Input(shape=(28,28,1))                        # shape =(28,28,1)
x1 = Conv2D(32, (3, 3), activation='relu')(inputs)     # shape (28,28,1)=>(26,26,32)
x2 = Conv2D(64, (3, 3), activation='relu')(x1)         # shape (26,26,32)=>(24,24,64)

入力に対して得られたマップのことを応答マップと言う.

f:id:takaishi78:20200119150815p:plain
CNN

パラメータの数の算出の仕方

畳み込みフィルターサイズを(L,L)(L,L)、入力チャンネルをMM、出力チャンネルをNNとすると直方体変形には(L⋅L⋅M⋅N+N)(L⋅L⋅M⋅N+N)がパラメータ数

Poolingと畳み込み

最大化Pooloingでは基本的にスライド=2, ウィンドウ=2x2 それに対して畳み込みではストライド=0、ウィンドウ=2x2 . またPoolingでは最大値が残る.

最大化Poolingを行うことでのメリット

パラメータを削減出来る

f:id:takaishi78:20200119154901p:plain
Maxpoolingあり

f:id:takaishi78:20200119155114p:plain
Maxpoolingなし

flattenで平滑化した後の全結合の部分でのパラメータ数が全然違うことがわかる.これはMaxPoolingしなかった場合、平滑化した際のベクトルの次元が30976になりそれを64次元に変換するために30976*64+64のパラメータが必要になり膨大、、、MaxPoolingすることでこれを防ぐことが出来る.(ちなみに活性化関数はReLu)

圧縮性

MaxPoolingしていないモデルでは初めの入力が(28, 28)で最終的に(22, 22)になっているので、(28,28)に(7,7)のウィンドウをかけているような物である.それに対してMaxPoolingしている方では(28,28)が(11, 11)になっていて(18,18)のウィンドウで見ていることになる.どれだけの情報が最後の層に圧縮されているかイメージしてみれば後者の方が優れていることがわかる.

出力フィルターサイズの計算の仕方

畳み込みを行なった後のFilterのサイズの計算の仕方 - In : 入力サイズ - Pad : Paddingのサイズ - F : 畳こみのフィルターサイズ - S : ストライドのサイズ(畳み込みを行う際どれだけfilterを移動させるか)

$$ \frac {In + 2Pad - F}{S} $$

参考

すごく参考になった↓ https://qiita.com/nishiha/items/bfd5dfcd7fffd3c529bc