1. 程式人生 > >DeepLearning.ai筆記:(4-1)-- 卷積神經網路(Foundations of CNN)

DeepLearning.ai筆記:(4-1)-- 卷積神經網路(Foundations of CNN)


title: ‘DeepLearning.ai筆記:(4-1)-- 卷積神經網路(Foundations of CNN)’
id: dl-ai-4-1
tags:

  • dl.ai
    categories:
  • AI
  • Deep Learning
    date: 2018-09-30 10:20:54

首發於個人部落格:fangzh.top,歡迎來訪
第四門課開始就學習深度學習關於計算機視覺的重要應用—卷積神經網路。

第一週主要是對卷積神經網路的基本構造和原理做了介紹。

計算機視覺

計算機視覺是深度學習的一個非常重要的應用。比如影象分類,目標檢測,圖片風格遷移等。

用傳統的深度學習演算法,假設你有一張 64 × 64 64×64 的貓片,又有RGB三通道,那麼這個時候是 64 × 64

× 3 = 12288 64×64×3=12288 ,input layer的維度就是12288,這樣其實也還可以,因為圖片很小。那麼如果你有 1000 ×
1000 1000×1000
的照片呢,你的向量就會有300萬!假設有1000個隱藏神經元,那麼就是第一層的引數矩陣 W W 有30億個引數!算到地老天荒。所以用傳統的深度學習演算法是不現實的。

邊緣檢測

如圖,這些邊緣檢測中,用水平檢測和垂直檢測會得到不同的結果。

垂直檢測如下圖,用一個 3 × 3 3×3 的過濾器(filter),也叫卷積核,在原圖片 6 × 6 6×6 的對應地方按元素相乘,得到 4 × 4 4×4 的圖片。

可以看到,用垂直邊緣的filter可以將原圖片中間的邊緣區分出來,也就是得到了最右圖中最亮的部分即為檢測到的邊緣。

當然,如果左圖的亮暗分界線反過來,則輸出圖片中最暗的部分表示邊緣。

也自然有水平的邊緣分類器。

還有更復雜的,但是我們不需要進行人工的決定這些filter是什麼,因為我們可以通過訓練,讓機器自己學到這些引數。

padding

padding是填充的意思。

  • 我們可以從之前的例子看到,每經過一次卷積運算,圖片的畫素都會變小,從 6 × 6 > 4 × 4 6×6 ---> 4×4 ,這樣子圖片就會越來越小,後面就毛都不剩了。

  • 還有一點就是,從卷積的運算方法來看,邊緣和角落的位置卷積的次數少,會丟失有用資訊。

所以就有padding的想法了,也就是在圖片四周填補上畫素。

填充後從,經過卷積後,還是

計算方法如下,

原資料是 n × n n \times n ,filter為 f × f f \times f ,padding為 p × p p \times p

那麼得到的矩陣大小是 ( n + 2 p f + 1 ) × ( n + 2 p f + 1 ) (n + 2p -f +1)\times(n + 2p -f +1)

padding有兩種:

  • valid:也就是不填充
  • same:輸入與輸出大小相同的圖片, p = ( f 1 ) / 2 p=(f - 1) / 2 ,一般padding為奇數,因為filter是奇數

stride(步長)

卷積的步長也就是每一次運算後平移的距離,之前使用都是stride=1。

假設stride=2,就會得到:

得到的矩陣大小是

n + 2 p f s + 1 × n + 2 p f s + 1 \lfloor \frac{n+2p-f}{s}+1\rfloor \times \lfloor \frac{n+2p-f}{s}+1\rfloor

向下取整: 59/60 = 0

立體卷積

之前都是單通道的圖片進行卷積,如果有RGB三種顏色的話,就要使用立體卷積了。

這個時候的卷積核就變成了 3 × 3 × 3 3 \times 3 \times 3 的三維卷積核,一共27個引數,每次對應著原圖片上的RGB一共27個畫素運算,然後求和得到輸出圖片的一個畫素。因為只有一個卷積核,這個時候輸出的還是 4 × 4 × 1 4 \times 4 \times 1 的圖片。

多個卷積核

因為不同的卷積核可以提取不同的圖片特徵,所以可以有很多個卷積核,同時提取圖片的特徵,如分別提取圖片的水平和垂直邊緣特徵。

因為有了兩個卷積核,這時候輸出的圖片就是有兩通道的圖片 4 × 4 × 2 4\times 4 \times 2

這裡要搞清兩個概念,卷積核的通道數和個數:

  • 通道數channel:即卷積核要作用在原圖片上,原圖片的通道處 n c n_c ,卷積核的通道數必須和原圖片通道數相同
  • 個數:即要使用多少個這樣的卷積核,使用 n c n_{c}^{\prime} 表示,卷積核的個數也就是輸出圖片的通道數,如有兩個卷積核,那麼生成了 4 × 4 × 2 4\times 4 \times 2 的圖片,2 就是卷積核的個數
  • n × n × n c n \times n \times n_c ,乘上的 n c n_{c}^{\prime} 個卷積核 $ f \times f \times n_c ,得到 (n -f +1)\times (n - f +1 ) \times n_{c}^{\prime}$的新圖片

卷積神經網路

單層卷積網路

如圖是單層卷積的基本過程,先經過兩個卷積核,然後再加上bias進行relu啟用函式。

那麼假設某層卷積層有10個 3 × 3 × 3 3 \times 3 \times 3 的卷積核,那麼一共有 ( 3 × 3 × 3 + 1 ) × 10 = 280 (3\times3\times3+1) \times10=280 個引數,加1是加上了bias

在這裡總結了各個引數的表示方法:

簡單神經網路

一般卷積神經網路層的型別有:

  • convolution卷積層
  • pool池化層
  • fully connected全連線層

池化層

pooling 的作用就是用來壓縮資料,加速運算,提高提取特徵的魯棒性

Max pooling

在範圍內取最大值

Average Pooling

取平均值

卷積神經網路示例

一般conv後都會進行pooling,所以可以把conv和pooling當做一層。

如上圖就是 c o n v p o o l c o n v p o o l f c f c f c s o f t m a x conv-pool-conv-pool-fc-fc-fc-softmax 的卷積神經網路結構。

各個層的引數是這樣的:

可以看到,在卷積層的引數非常少,池化層沒有引數,大量的引數在全連線層。

為何用卷積神經網路?

這裡給出了兩點主要原因:

  • 引數共享:卷積核的引數是原圖片中各個畫素之間共享的,所以大大減少了引數
  • 連線的稀疏性:每個輸出值,實際上只取決於很少量的輸入而已。