卷積神經網絡 CNN 學習筆記
激活函數Relu
最近幾年卷積神經網絡中,激活函數往往不選擇sigmoid或tanh函數,而是選擇relu函數。Relu函數的定義
$$f(x)= max(0,x)$$
Relu函數圖像如下圖所示:
CNN示例
上圖是一個CNN的示意圖,一個卷積神經網絡由若幹卷積層、Pooling層、全連接層組成。你可以構建各種不同的卷積神經網絡,它的常用架構模式為:
INPUT -> [[CONV]*N -> POOL?]*M -> [FC]*K
也就是N個卷積層疊加,然後(可選)疊加一個Pooling層,重復這個結構M次,最後疊加K個全連接層。
Convolution Layer
Pooling Layer 表示池化
Convolution Layer
卷積層的主要是作用是對數據進行卷積操作。
卷積操作可以理解為,將數據特種進行提取的一個過程。
比如 一張圖片,要檢測圖片中存在的邊緣,也就是邊緣檢測,那麽首先建立兩個filter,分別代表橫豎邊緣,然後拿著filte去跟input的image進行計算,得到卷積後的結果,根據卷積後的結果進行判斷是否存在邊緣情況。
另一種情況,一張手寫數字的圖片,需要進行識別,那麽需要對該圖片進行特種提取,建立特種提取的方式就是建立filter的過程,然後用filter去對該image進行計算,得到我們想要提取的特種數據。
卷積層輸出值的計算
我們用一個簡單的例子來講述如何計算卷積,然後,我們抽象出卷積層的一些重要概念和計算方法。
假設有一個55的圖像,使用一個33的filter進行卷積,想得到一個3*3的Feature Map,如下所示:
公式如下:
$$a_{i,j}=f(\sum_{m=0}^{2}\sum_{n=0}^{2}w_{m,n}x_{i+m,j+n}+w_b)\qquad(式1)$$
詳細參考:https://www.zybuluo.com/hanbingtao/note/485480
Pooling Layer
池化主要的作用是對卷積後的數據進行整合的一個過程,同時對數據進行降維的操作。
比如在上面的距離過程中,兩張圖片都會在卷積後形成特征數據,但是這些特征數據中,有很多數據對我們的結果影響可以並不大,那麽我們可以對特征數據進行池化後,形成新的特征數據。
Pooling層輸出值的計算
Pooling層主要的作用是下采樣,通過去掉Feature Map中不重要的樣本,進一步減少參數數量。Pooling的方法很多,最常用的是Max Pooling。Max Pooling實際上就是在nn的樣本中取最大值,作為采樣後的樣本值。下圖是22 max pooling:
##卷積神經網絡的訓練
卷積層訓練
訓練公式:
$$\delta^{l-1}=\sum_{d=0}^D\delta_d^l*W_d^l\circ f‘(net^{l-1})\qquad(式9)$$
符號$\circ$表示element-wise product,即將矩陣中每個對應元素相乘,$d$表示深度$D$的實力,$l$表示層。
$\delta_d^l$表示$d$深度下$l$層的誤差項
$W_d^l$表示$d$深度下$l$層的權重
$net^{l-1}$表示$d$深度下$l$層的加權輸入
加權輸入公式:
\begin{align}
net^l&=conv(W^l, a^{l-1})+w_b\
a^{l-1}{i,j}&=f^{l-1}(net^{l-1}{i,j})
\end{align}
Pooling層的訓練
無論max pooling還是mean pooling,都沒有需要學習的參數。因此,在卷積神經網絡的訓練中,Pooling層需要做的僅僅是將誤差項傳遞到上一層,而沒有梯度的計算。
Max Pooling誤差項的傳遞
對於max pooling,下一層的誤差項的值會原封不動的傳遞到上一層對應區塊中的最大值所對應的神經元,而其他神經元的誤差項的值都是0。如下圖所示(假設$a^{l-1}{1,1}、a^{l-1}{1,4}、a^{l-1}{4,1}a^{l-1}{4,4}$為所在區塊中的最大輸出值):
對於mean pooling,下一層的誤差項的值會平均分配到上一層對應區塊中的所有神經元。如下圖所示:
PS:上面兩個圖示的流向應該是從 layer L 到 layer L-1 ,傳遞過程中,Max pooling 采用
上面這個算法可以表達為高大上的克羅內克積(Kronecker product)的形式,有興趣的讀者可以研究一下。
$$\delta^{l-1} = \delta^l\otimes(\frac{1}{n^2})_{n\times n}$$
卷積神經網絡 CNN 學習筆記