---
# System prepended metadata

title: lecture5_note
tags: [Lecture5]

---

# lecture5_note
###### tags: `Lecture5`

介紹一下什麼是CNN
![](https://i.imgur.com/WEWJrca.png)
CNN就是輸入是image的神經網路
當input固定是影像的時候
就會有特有的性質出現
所以對於CNN來講
他的輸入就會是3維度的矩陣
而非像是其他的神經網路輸入是一個又臭又長的向量
這件事情可以使CNN得到更高效的演算效率
以下的右圖是CNN的想法
左圖是一般的神經網路

![](https://i.imgur.com/ir74ots.png)


在神經網路中，有三個主要的東西來建構CNN
## Convolutional Layer
這一層有幾個作用
第一件事情是
比如說當我們要分辨一張圖片裡面有沒有鳥的時候，我們可能會去找說是否在這張圖中有鳥嘴（舉例），而且對於一般的情況來講，你要找的pattern的大小通常都比整張圖片小，所以對於只是在整張圖片裡面找一小部分的pattern來說，他其實就不需要去看整張圖片，他其實只要去看image的一個小部分就可以決定這件事情了
![](https://i.imgur.com/Cw2KsBj.png)

第二件事情是，同樣的pattern可能會出現在image的不同的地方，比如說

| 鳥嘴在中間 | 鳥嘴在左上 | 
| -------- | -------- |
| ![](https://i.imgur.com/lhv8Zc6.png)     | ![](https://i.imgur.com/YrBGZMA.png)     |

我們只需要一個 node 去偵測他就好了 ，這樣的話可以節省非常多的 node（或是 weight），這稱為 **shared weight**。
等等例子做介紹

此時，就需要convolution的介入，我們舉一個例子：
![](https://i.imgur.com/eiq5CIx.png)有兩個fillter可以用
接下來我們設定stride為1(可以自己假設)
stride其實就是filter移動的距離

對於第一個filter來說（先算他）
你把它擺到左上角（第一個正方形紅框框）
![](https://i.imgur.com/klsRp56.png)
針對他跟它蓋住的矩陣做elementwise的乘積然後加起來
（就是做標準內積啦），出來是3
然後再來，你將filter往右邊移動stride=1單位
變這樣
![](https://i.imgur.com/YbU8Jj3.png)
然後一樣內積，再加起來，得到-1
依此類推，你應該就可以得到一個矩陣
![](https://i.imgur.com/FKeQjjc.png)
請注意藍色部分
首先我們知道filter的權重部分以對角線為最高
也就是說，對於這個filter來說，他最注意就是對角線有沒有出現111ㄌ
從左上到右下的這種形狀是這個filter最重要的事情
他就是在找這個pattern
所以你就可以知道
因為再出來的矩陣中，以左上跟左下為最大
意思就是說這個pattern會出現在左上跟左下的矩陣之中
再對照左邊的圖，確實如此。
因此我們可以知道convolution可以解決剛剛討論的第二個問題
就是你這個pattern如果出現在不同的地方怎麼辦了
![](https://i.imgur.com/WtilVVF.png)
這邊告訴我們說，對於這種高維度的輸入（圖片）來說
不太會用full-connected network去接
相反來說，我們會讓neruon只跟局部的數據做連接
這就是local connectivity
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
另外，還記得剛剛還有一個filter嗎？
這個filter2也可以用一樣的卷積做法去找出對應的一組矩陣
如果今天還有很多filter
每一個不同的filter都有不同的結果
這些不同的結果統稱叫做feature map
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
receptive field則是在指filter的大小
這邊要特別注意的是，深度一定會跟輸入的東西一樣
給個例子
![](https://i.imgur.com/BzIJNT4.png)
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
接下來是zero-padding
上定義![](https://i.imgur.com/9ZE4mjR.png)
簡單來說，就是在你的輸入的矩陣之外再多加0
目的通常是為了讓輸入跟convolution layer的輸出的長寬高是一樣的
一樣舉個例子
![](https://i.imgur.com/Y50NwEk.png)
像是左圖，他的輸入跟輸出的長寬高就都一樣
因為他加了zero padding

假定輸入數组的spatial arrangement是正方形，就是高寬相等，輸出數據的尺寸為 
> ###          ***(W-F +2P)/S+1***
>
K是幾個filter的意思
比如輸入是7x7，filter是3x3，stride=1，zero-padding=0，就能得到一個5x5的輸出

### summary
所以你可以知道convolution layer其實是在擷取local的資訊，而非global

## Pooling Layer
> Its function(pooling layer) is to progressively reduce the spatial size of the representation to reduce the amount of parameters and computation in the network, and hence to also control overfitting.
> 
看起來其實就是針對input做subsampling，只是downsampling的方法不同罷了。

這邊可以看一個影片，簡單暴力又好懂。
{%youtube fApFKmXcp2Y %}

後面提到，pooling layer可以避免overfitting的原因猜測是因為當你把資料的特徵減少了，訓練出來的模型就能夠泛化，若資料feature多，訓練出來的模型會去努力擬合這些feature，使模型變複雜，泛化能力自然降低。

> It is worth noting that there are only two commonly seen variations of the max pooling layer found in practice: A pooling layer with F=3,S=2,(also called overlapping pooling), and more commonly F=2,S=2, Pooling sizes with larger receptive fields are too destructive.
> 
此段介紹的是：通常在pooling layer裡面，常用的stride跟receptive field

Q:實際的操作為何？
舉個例子
還記得剛剛在算feature map的例子嗎(with F=2,S=2)？
![](https://i.imgur.com/GLXOdL2.png)

最後是：
![](https://i.imgur.com/vVFBCCl.png)
文中提及，現在很多在做影像辨識的人越來越不喜歡把pooling layer丟進去network裡面(eg:alphago，可能因為subsampling對於棋盤這件事情來說，少一行少一列都會差很多，所以在alphago中是沒有用到max pooling的)，那麼要如何將資料降低維度呢？
他們利用在conv層中更大的stride來降低image的尺寸

### reference:
https://www.zhihu.com/question/36686900

## Fully-Connected Layer(跟普通的nerual network一樣)
此處提及，對於一個full connected layer和convolution layer來說，他們其實可以互相轉換，但是普遍來說我們會選擇把full connected layer轉成convolution layer，這樣聽說效率比較高（？

（這邊我真的看不太懂，求解釋）

至於如何轉換，我們先上一張圖
![](https://i.imgur.com/6PQHdrE.jpg)
這張圖同一個顏色的部份表示的意義就是share weights
卷積層的概念剛剛也有提及，其實就是局部的運算而已，全連接則是全部直接硬算，因此，***卷積層如果畫成全連接層的表示方法，其實就是把某一些參數設成0而已***（此處同色線共享一個neroun）

（這邊我真的看不太懂，求解釋）
回到史丹佛那邊，我們看一下比較普遍的例子
![](https://i.imgur.com/8pwT3K3.jpg)








