E資格合格に向けて　深層学習day4 （応用モデル）

#MobileNet
近年の画像認識タスクに用いられる最新のニューラルネットワークアーキテクチャは、多くのモバイルおよび組み込みアプリケーションの実行環境を上回る高い計算資源を必要とされる。
一般的な畳み込みレイヤーは計算量が多い。
MobileNetsは「Depthwise Convolution」と「Pointwise Convolution」の組み合わせで軽量化を実現

≪Depthwise Convolution≫
・入力マップのチャネルごとに畳み込みを実施
・出力マップをそれらと結合（入力マップのチャネル数と同じになる）
　→通常の畳み込みカーネルは全ての層にかかっていることを考えると計算量が大幅に削減可能
　→各層ごとの畳み込みなので層間の関係性は全く考慮されない。通常はPW畳み込みとセットで使うことで解決
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313001/b4c33504-881e-9ffb-ffc5-50bc90b11a22.png)

≪Pointwise Convolution≫
・1×1convとも呼ばれる
・入力マップのポイントごとに畳み込みを実施
・出力マップ（チャネル数）はフィルタ数分だけ作成可能（任意のサイズが指定可能）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313001/6075158b-80ce-8ef5-aa86-358287edf198.png)

Depthwise Convolutionはチャネル毎に空間方向へ畳み込む。
Pointwise Convolutionによって、チャンネル方向に畳み込む

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313001/cf2d88a5-d00b-2932-4afb-4a2ea83807ba.png)

#DenseNet
Dense Convolutional Networkは、畳込みニューラルネットワークアーキテクチャの一種である。ニューラルネットワークでは層が深くなるにつれて、学習が難しくなるという問題があったが、Residual NetworkなどのCNNアーキテクチャでは前方の層から後方の層へのアイデンティティ接続を介してパスを作ることで問題を対処した。DenseBlockと呼ばれるモジュールを用いた、DenseNetもそのアーキテクチャの一つ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313001/44b9caea-b975-6605-cdd1-1e41b29d57c4.png)

出力層に前の層の入力を足し合わせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313001/32f1715e-c87d-5075-c1ff-b7e21b184f85.png)

Transition Layerでダウンサンプリング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313001/c28828b3-ecc4-5fa6-728a-41fe5e2ae67f.png)

【実装例】Densnets

```
def dense_block(x, k, n_block):
  for i in range(n_block):
    main = x
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    #1x1
    x = Conv2D(filters = 64, kernel_size = (1, 1), padding = 'valid')(x)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    #3x3
    x = Conv2D(filters = k, kernel_size = (3, 3), padding = 'same')(x)
    #concatenate
    x = Concatenate()([main, x])

  return x

def transition_layer(inputs, compression = 0.5):
  n_channel = int(inputs.shape[3])
  filters = int(n_channel * compression)
  x = Conv2D(filters = filters, kernel_size = (1, 1))(inputs)
  outputs = AveragePooling2D(pool_size = (2, 2))(x)

  return outputs

def DenseNet():
  inputs = Input(shape = (28, 28, 1))

  x = dense_block(inputs, k = 16, n_block = 1)
  x = transition_layer(x, compression = 0.5)
  x = dense_block(x, k = 16, n_block = 2)
  x = transition_layer(x, compression = 0.5)
  x = dense_block(x, k = 16, n_block = 4)
  x = transition_layer(x, compression = 0.5)
  x = dense_block(x, k = 16, n_block = 3)

  x = GlobalAveragePooling2D()(x)

  x = Dense(512)(x)
  x = BatchNormalization()(x)
  x = Activation('relu')(x)

  x = Dense(n_class)(x)

  outputs = Activation('softmax')(x)

  return Model(inputs, outputs)
```

#BatchNorm
ミニバッチに含まれるsampleの同一チャネルが同一分布に従うように正規化
バッチサイズが小さい条件下では、学習が収束しないことがあり、代わりにLayerNorm等の正規化手法が使われることが多い。

#LayerNorm
それぞれのsampleの全てのpixelsが同一分布に従うように正規化

#Instance Norm
各Sampleの各チャネル毎に正規化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313001/926a7138-cf88-da7c-2e1f-a9fbce3490ce.png)

#WaveNet
音声生成モデル。Pixel CNN（※RNNではない）
時系列データに対して畳み込みを適用する
深層学習を用いて結合確率を学習する際に、効率的に学習が行えるアーキテクチャを提案したことがWaveNetの大きな貢献の1つである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313001/6734cdf1-9a04-f7a2-6b19-a5723b97166b.png)