卷積神經網路(CNN)基礎
Padding and stride
一個N*N的影象,使用f*f的卷積核,會得到(n-f+1)*(n-f+1)的大小
但是邊緣的影象 使用了一次,而且整個影象縮小了
因此,可以增加一圈padding,假設增加的padding 的長度為p
會得到(n+2p-f+1)*(n+2p-f+1)的影象
通常由兩種卷積方式
“Valid”:不填充
“Same”:填充2p,使得輸入輸出相同大小
(n+2p-f+1)==n→2p+1-f==0→p=(f-1)/2
所以f通常情況下為奇數
如果加入了Stride
那麼輸出的影象大小就變成[(n+2p-f)/s+1]* [(n+2p-f)/s+1]
//n+2p-f 剩餘長度 /s 移動個數 +1 初始位置
如果除法(n+2p-f)/s不是一個整數,一般向下取整數,即放棄最後一個不完全的框
三維卷積
計算方式:對應位置的數字相乘,將乘積的和放在對應的位置
可以為三個通道的過濾器,設定不同的過濾器,但是過濾器的通道數必須和原圖一樣
我們可以設定多個過濾器,例如相對Red層即檢測垂直邊界,又檢測水平邊界,那麼我們可以選擇通過兩個立體過濾器,如下圖中,橙色和黃色為不同的過濾器,將結果組合,就得到下一層的輸入
Summary:
N*N*n_channels * f*f*n_channels → (n-f+1)*(n-f+1)*number of n_channels
6*6*3 3*3*3 4 * 4 * 2
單層卷積網路
Input: Nh[l-1]* Nw[l-1]*Nc[l-1] width*height*channels_num in layer l-1
Output: Nh[l]* Nw[l]*Nc[l] width*height*channels_num in layer l
Each filter is: f[l]*f[l]*Nc[l-1] f*f* channels_num in layer l-1
Activations: a[l]= Nh[l]* Nw[l]*Nc[l] A[l]= m*Nh[l]* Nw[l]*Nc[l]
Weight: Each filter * filter_num f[l]
Bias: (1,1,1,Nc[l]) 橫向排列組合的一排小立方體
為什麼使用卷積
卷積可以減少引數量
引數共享
同一個卷積核可以在不同區域中使用,例如垂直邊界卷積核可以在多次使用
稀疏連結
每一層中的輸出僅僅和上一層中的幾個引數相關,例如一個3*3的filter僅僅涉及9個引數
池化
特殊的過濾器,對一個塊內的資訊做不同的操作,eg,max、average,
Hyperparameter超參:filter size、stride
全連線
引數=filter_size*filter_size+bias || Activation size(L-1)*Actication size(L)+bias 偏置一般就是1