深層学習 Day 2 - Section 4 畳み込みニューラルネットワークの概念 のまとめ

この記事は個人的なお勉強用のメモです。

# このお勉強の位置

深層学習 Day 2

Section 1 勾配消失問題
Section 2 学習率最適化手法
Section 3 過学習
**Section 4 畳み込みニューラルネットワークの概念**　←　これ
Section 5 最新のCNN

# 講義

## CNN

畳み込みニューラルネットワーク
CNN（Convolutional Neural Network）

- 入力層（入力画像）
- 畳み込み層 * N
- プーリング層 * M
- 全結合層
- 出力層（出力画像）

主に画像データで使われる。
音声データでも使われる場合がある。

## 畳み込み層

1. 入力値をフィルター（全結合でいう重み）に通す。  
それぞれの要素とフィルターを掛けてすべて足す。
2. 出力された値にバイアスを加える。  
それぞれの要素にバイアスの値を加える。
3. 活性化関数を実行する。

→ 出力値が出力される。

縦、横、チャンネルの3次元データをそのまま学習し、
次に伝えられる。（＝3次元の空間情報の学習が可能）

## パディング

一般的にはゼロパティングが使われる。
入力画像の周りをゼロで埋める。

パディングの目的：
出力サイズを調整するため。
（パディング無しの場合、出力サイズがどんどん小さくなってしまう）

## ストライド

フィルターをいくつずらすか、という数値。
ストライドを大きくすると、出力サイズが小さくなる（画像が小さくなる）。


## チャンネル

奥行きを処理するもの。
入力データのチャンネル数＝フィルターのチャンネル数

チャンネルの例：
RGBの計3チャンネル

## im2col

4次元の画像データを2次元の行列に変換する関数。

4次元とは
1：画像データの個数（1つのバッチ内での画像データの個数）
2：チャンネル数（例：3(＝RGB)）
3：縦のサイズ
4：横のサイズ

画像データの個数を次元に加えることで、複数の画像データを
まとめて変換できることがメリット。

## プーリング層

- Maxプーリング  
対象領域の最大値
- Averageプーリング  
対象領域の平均値

# 実装演習

### im2colの動作確認

#### col.transposeありで実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/cc2e1be2-f257-3b09-e126-d927fe9a6ffa.png)


col.transposeするとデータの入れ替えが発生する。
入力データ内のフィルターサイズに相当する(3,3)のデータを1行に変換している。
フィルターで処理しやすくするためか。

#### col.transposeをコメントアウトして実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/eb62dcfd-fac5-e9a6-96e3-8912aa6cecb5.png)


こちらはデータの1行に、入力データ内で重複したデータが出力されている。
これではおそらくフィルターの処理が効かない。


### col2imの使用例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/31db1ad1-bdaa-4769-a771-4af3da38f405.png)

変数の存在をすっかり忘れていた。
模範解答はこちら。（ただし、実行結果は同じ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/402e09f5-6b8a-2eb7-6614-22c985dab2a7.png)

### CNNの実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/5794fa22-3409-df82-21e2-525a59acb52f.png)

このCNNでは画像データを扱っているが、これまで勉強してきたNNと同様に、
学習できていることがわかる。

CNNのポイントはim2col関数。
forward関数からim2col関数を呼び出している。

※学習データの正解率が1に近いので一見過学習かと思われるが
　学習データの精度とテストデータの精度に開きがないので、これは過学習ではない。
※ 実行が遅い場合はGPUを使うという方法がある。


# 確認テスト

## 出力サイズの計算

入力サイズ：6×6
フィルターサイズ：2×2
ストライド：1
パディング：1

```math
\begin{align}
出力サイズ幅&＝\frac{入力サイズ幅+パディング\times 2-フィルターサイズ幅}{ストライド}+1
\\
&=\frac{6+1\times 2 -2}{1}+1\\
&=7\\
出力サイズ高さ&＝\frac{入力サイズ高さ+パディング\times 2-フィルターサイズ高さ}{ストライド}+1
\\
&=\frac{6+1\times 2 -2}{1}+1\\
&=7\\
\end{align}
```


# 修了テスト～練習問題～

### 問題64（畳み込み演算）

元のサイズ：224×224
チャンネル数：3
パディング：0
ストライド幅：1
フィルターサイズ：11×11


```math
\begin{align}
出力サイズ高さ&=\frac{元のサイズ高さ+パティング\times 2 - フィルターサイズ高さ}{ストライド}+1\\
&=\frac{224+0\times 2-11}{1}+1\\
&=214\\
出力サイズ幅&=\frac{元のサイズ幅+パティング\times 2 - フィルターサイズ幅}{ストライド}+1\\
&=\frac{224+0\times 2-11}{1}+1\\
&=214\\
\end{align}
```

チャンネル数は3のまま。

### 問題65（畳み込み演算）

元のサイズ：224×224
チャンネル数：3
パディング：0
ストライド幅：4
フィルターサイズ：4×4


```math
\begin{align}
出力サイズ高さ&=\frac{元のサイズ高さ+パティング\times 2 - フィルターサイズ高さ}{ストライド}+1\\
&=\frac{224+0\times 2-4}{4}+1\\
&=56\\
出力サイズ幅&=\frac{元のサイズ幅+パティング\times 2 - フィルターサイズ幅}{ストライド}+1\\
&=\frac{224+0\times 2-4}{4}+1\\
&=56\\
\end{align}
```

### 問題66（Maxプーリング）

|2|4|3|2|
|---|---|---|---|
|4|6|3|4|
|4|6|5|4|
|10|24|1|2|

フィルター：2×2
ストライド幅：1
パディング：0
Maxプーリング

|6|6|4|
|---|---|---|
|6|6|5|
|24|24|5|

### 問題67（Averageプーリング）

|2|4|3|2|
|---|---|---|---|
|4|6|3|4|
|4|6|5|4|
|10|24|1|2|

フィルター：2×2
ストライド幅：2
パディング：0
Averageプーリング

|4|3|
|---|---|---|
|11|3|