卷積神經網絡基礎之百度飛漿課程筆記

卷積神經網絡基礎之百度飛漿課程筆記

卷積神經網絡的基礎知識主要有卷積池化激活函數批歸一化Dropout等理論和技巧共五部分,下面將逐一展開進行介紹。(下文中可能部分公式沒法正常顯示,我有聯繫博客園客服,他們說在chrome和firefox瀏覽器上看都是正常的,但是我在chrome上看仍是有些問題,多方詢問求解也沒解決這個問題,很是抱歉,若是您有好的解決辦法請在評論區留言,很是感謝!!!)html

卷積(Convolution)

卷積計算

卷積在數學中是一種積分變換的方法,可能你們對這個也不太關心,在卷積神經網絡中,卷積層的實現方式其實是數學中定義的互相關運算,一般是用滑動窗口的點積運算來完成,以下圖 卷積計算過程(來自百度飛漿深度學習課程):chrome

1

上圖中的0、一、二、3組成的矩陣就叫作卷積核,一個卷積算子除了進行上述的卷積計算以外,還包括加上偏置項的操做,即在卷積計算的結果基礎上加上一個常數項。數組

卷積輸出特徵圖的尺寸計算公式以下:瀏覽器

\[\begin{aligned} H_{\text {out}} &=H-k_{h}+1 \\ W_{\text {out}} &=W-k_{w}+1 \end{aligned} \]

\(H\)表示輸入圖片的高度,\(W\)表示輸入圖片的寬度,\(k_{h}\) 表示卷積核的高度,\(k_{w}\)表示卷積核的寬度,\(1\) 表示偏置項,\(H_{out}\)表示輸出尺寸的高,\(W_{out}\)表示輸出尺寸的寬。(尺寸計算必定要會,很基礎也很重要)網絡

填充(padding)

在卷積計算中,咱們知道通過卷積以後,輸出尺寸是在變小的,爲了不卷積以後圖片尺寸不斷變小,一般會在圖片的外圍進行填充操做,從而保證尺寸的固定,以下圖所示(來源於百度飛漿):ide

如上圖(a)所示,填充的大小爲1,使得輸入圖片尺寸由4 x 4變爲6 x 6,根據上述卷積尺寸計算公式,通過卷積以後輸出尺寸變爲4 x 4。函數

加入padding後卷積輸出特徵圖的尺寸計算公式以下:學習

若是在圖片高度方向,在第一行以前填充 \(p_{h1}\) 行,在最後一行以後填充 \(p_{h2}\) 行;在圖片的寬度方向,在第1列以前填充\(p_{w1}\)列,在最後1列以後填充\(p_{w2}\)列;則填充以後的圖片尺寸爲\((H+p_{h1}+p_{h2})×(W+p_{w1}+p_{w2})\)。通過大小爲\(k_h\times k_w\)的卷積核操做以後,輸出圖片的尺寸爲:測試

\[\begin{array}{l} H_{\text {out}}=H+p_{h 1}+p_{h 2}-k_{h}+1 \\ W_{\text {out}}=W+p_{w 1}+p_{\text {w} 2}-k_{w}+1 \end{array} \]

在卷積計算過程當中,一般會在高度或者寬度的兩側採起等量填充,即\(p_{h1} = p_{h2} = p_h\),\(p_{w1} = p_{w2} = p_w\),,上面計算公式也就變爲:spa

\[\begin{aligned} H_{\text {out}} &=H+2 p_{h}-k_{h}+1 \\ W_{\text {out}} &=W+2 p_{w}-k_{w}+1 \end{aligned} \]

這應該是常常會看到的公式的樣子,實際中,卷積核一般使用1,3,5,7這樣的奇數,經過上述等式,若是咱們想要卷積後的圖像尺寸不變,則能夠獲得填充大小爲\(p_h=(k_h-1)/2\)\(p_w=(k_w-1)/2\),這也是咱們常常會在設計卷積網絡模型時須要進行的尺寸計算。

步幅(stride)

卷積層的參數步幅簡單來講就是在卷積計算中,滑動窗口每次滑動的距離,很好理解,直觀來看以下圖:

步幅分爲兩個方向,分別是高\(s_h\)和寬\(s_w\),一般都設置爲同樣的大小。

加入stride後卷積輸出特徵圖的尺寸計算公式以下:

\[\begin{aligned} H_{\text {out}} &=\frac{H+2 p_{h}-k_{h}}{s_{h}}+1 \\ W_{\text {out}} &=\frac{W+2 p_{w}-k_{w}}{s_{w}}+1 \end{aligned} \]

感覺野(Receptive Field)

輸出特徵圖上每一個點的數值,是由輸入圖片上大小爲\(k_h\times k_w\)的區域的元素與卷積核每一個元素相乘再相加獲得的,因此輸入圖像上\(k_h\times k_w\)區域內每一個元素數值的改變,都會影響輸出點的像素值。咱們將這個區域叫作輸出特徵圖上對應點的感覺野。感覺野內每一個元素數值的變更,都會影響輸出點的數值變化。好比\(3\times 3\)卷積對應的感覺野大小就是\(3\times 3\)

多通道操做

實際應用中一般都是多通道進行卷積,如圖像的RGB三個通道,這樣的數據輸入和輸出都是多通道的,因此須要可以處理多通道的場景,除此以外,神經網絡中多采用批訓練的方式,因此卷積算子須要具備批量處理多通道的能力。

  • 多輸入通道場景

    假設圖片的通道數爲\(C_{in}\),輸入數據的形狀爲\(C_{in}\times H_{in}\times W_{in}\) ,則計算過程以下圖所示:

    1. 對每個通道分別設計一個2維數組卷積核,因此卷積核數組的形狀爲\(C_{in}\times k_{h}\times k_w\)
    2. 對任意一個通道,分別用對應通道的卷積核進行卷積運算。
    3. 將這\(C_{in}\) 個通道各自的卷積計算結果相加,獲得一個形狀爲\(H_{out}\times W_{out}\) 的二維數組。
    4. 其中\(H_{out}\times W_{out}\) 的大小依據單通道的公式計算便可。

  • 多輸出通道場景

    通常來講,卷積操做的輸出特徵圖也具備多通道\(C_{out}\) ,這時咱們須要設計\(C_{out}\) 個維度爲\(C_{in}\times k_h\times k_w\) 的卷積核,這裏可能不太好理解,不過只要多一點點思考就能夠想明白了,其實只是在維度上增長了而已,不過實際中一般咱們將多通道輸出個數叫作卷積核個數,由於四維空間較爲抽象,卷積核數組的最終維度爲\(C_{out}\times C_{in}\times k_h\times k_w\) ,以下圖:

    1. 對任一輸出通道\(c_{o u t} \in\left[0, C_{o u t}\right)\) ,都是使用上面描述的\(C_{in}\times k_h\times k_w\) 卷積覈對圖像作卷積獲得的。
    2. \(C_{out}\)個形狀爲\(H_{out} \times W_{out}\) 二維數組拼在一塊兒,就獲得\(C_{out}\times H_{out}\times W_{out}\) 形狀的多通道輸出。
    3. 對這個的理解,須要一步步的,首先掌握單通道的卷積尺寸計算,而後掌握多輸入通道場景的計算,再而後就能夠很好理解多輸出通道場景的計算了。

  • 批量操做

    卷積神經網絡中,一般進行多樣本一塊兒訓練,即輸入數據的維度爲\(N\times C_{in}\times H_{in}\times W_{in}\) 。因爲會對每張圖片使用一樣的卷積核進行卷積操做,因此卷積核的計算和上述多輸出通道同樣,卷積核的維度仍然是\(C_{out}\times C_{in}\times k_h\times k_w\) ,輸出維度爲\(N\times C_{out}\times H_{out}\times W_{out}\) ,以下圖所示:

池化(Pooling)

簡介:池化是使用某一位置的相鄰輸出的整體特徵代替網絡在該位置的輸出,通過池化操做後,特徵圖的尺寸會變得很小,必定程度上能夠減小神經元的個數,節省空間提升效率。

方法:平均池化和最大池化。平均池化即取池化窗口區域數值的平均值做爲池化結果,最大池化即取池化窗口區域的最大值做爲池化結果。圖例以下:

輸出尺寸計算:池化層與卷積層相似,也能夠進行Padding,也有步長,也有池化窗口,這裏設步長爲\(s_h\)\(s_w\) ,高度上填充爲\(p_{h1}\)\(p_{h2}\) ,寬度上填充爲\(p_{w1}\)\(p_{w2}\) ,則池化層輸出尺寸爲:

\[\begin{aligned} H_{\text {out}} &=\frac{H+p_{h 1}+p_{h 2}-k_{h}}{s_{h}}+1 \\ W_{\text {out}} &=\frac{W+p_{w 1}+p_{w 2}-k_{w}}{s_{w}}+1 \end{aligned} \]

激活函數

激活函數爲神經網絡提供了非線性的性質,提升了神經網絡的表現能力,因此在神經網絡中選擇合適的激活函數是十分重要的。經常使用的激活函數有sigmoid、tanh、Relu、Leaky Relu、MaxOut等,目前在深度學習中Relu的效果仍是較爲不錯的。關於激活函數更詳細的介紹能夠參考該博客《經常使用激活函數總結》 ,這裏就不過多贅述(其實我就是懶了,不想造輪子總結,拿來主義也挺好,而且我的以爲這個博客講的挺清晰明白的,但願讀者諒解呀^0^)。

批歸一化

模型的收斂須要穩定的數據分佈,歸一化(標準化)能夠將數據映射到一個穩定分佈的空間。對於淺層的神經網絡,可能只須要對輸入數據作歸一化就能夠獲得較好的結果,但對於深度神經網絡來講,僅僅對輸入數據作歸一化是不足夠的,咱們還須要對中間過程的輸出數據也作歸一化,從而讓深度網絡模型也能很好的收斂,提升模型的穩定性。詳細內容

批歸一化公式計算過程

  1. 計算mini-batch內樣本的均值

  2. 計算mini-batch內樣本的方差

  3. 計算標準化以後的輸出

  4. 對標準化的輸出進行平移和縮放

    若是強行限制輸出層的分佈是標準化的,可能會致使模型某些特徵模式的丟失,因此會緊接着須要進行平移和縮放

注:若是一個樣本具備多個特徵,則對每一個特徵分別計算均值和方差

批歸一化實踐技巧

上面講到的批歸一化計算過程,咱們是以一個batch爲例的,只是爲了講清楚具體的計算公式,但咱們在實際預測時候,若是是以一個batch的數據的均值和方差來歸一化,則會致使同一個樣本在不一樣的batch中歸一化結果不一樣,致使預測結果不一致,存在誤差,這並非咱們想要的結果,因此咱們須要在整個數據集上進行歸一化的操做,具體以下:

  1. 解決方案:訓練時計算在整個數據集上的均值和方差,並將結果保存,預測時不計算樣本內均值和方差,而是使用訓練時保存的值

  2. 計算方法:在訓練過程當中經過滾動平均的方式,計算在整個數據集上的均值和方差並保存,公式以下:

    \[\begin{array}{l} \text { saved } _{-}\mu_{B} \leftarrow \text { saved }_{-} \mu_{B} \times 0.9+\mu_{B} \times(1-0.9) \\ \text { saved }_{-} \sigma_{B}^{2} \leftarrow \text { saved_ } \sigma_{B}^{2} \times 0.9+\sigma_{B}^{2} \times(1-0.9) \end{array} \]

    \(saved_{-}\mu_{B}\) 表示訓練過程當中前面全部輪次的滾動的均值;

    \({ saved }_{-} \sigma_{B}^{2}\) 表示訓練過程當中前面全部輪次的滾動的方差;

    0.9表示滾動平均的動量係數(momentum);

    \(\mu_{B}\) 表示本輪batch數據的均值;

    \(\sigma_{B}^{2}\) 表示本輪batch數據的方差;

    按照上述公式不斷迭代,直到訓練過程結束,最後獲得的均值和方差保存下來,做爲預測數據歸一化的均值和方差。

注:也許你會以爲能夠直接針對整個數據集計算出均值和方差並保存下來,這樣確實是很直觀的一個方法,我我的剛開始也是這樣想的,但課程中老師並未詳細解釋,後續我會繼續跟蹤這個問題,若是您偶有所瞭解,很是歡迎在評論區留下您的看法!!!

丟棄(Dropout)

簡介

Dropout是一種抑制過擬合的方法

方法

  1. 訓練階段:每次隨機的刪除一部分神經元,不向前傳播所攜帶的信息,至關於每次都是讓不一樣的模型在學習
  2. 測試階段:向前傳播全部神經元的信息,至關於讓不一樣的模型一塊兒工做

直觀來看,以下圖所示:

若是須要進一步瞭解Dropout的原理和實踐操做,請參考該博客《Dropout原理解析》

總結

卷積神經網絡基礎的小結就到此結束了,很是感謝您能讀到這裏,也更加但願您能在看完本篇長文後有所收穫,你的進步和鼓勵就是我做爲知識搬運工的最大動力!!!

有任何疑問都歡迎在評論區提出討論,分享交流,共同進步!!!

參考資料

  1. 百度飛漿教程
相關文章
相關標籤/搜索