如圖示,之前課程中介紹的都是64* 64 3的影象,而一旦影象質量增加,例如變成1000 1000 * 3的時候那麼此時的神經網路的計算量會巨大,顯然這不現實。所以需要引入其他的方法來解決這個問題。
邊緣檢測可以是垂直邊緣檢測,也可以是水平邊緣檢測,如上圖所示。
至於演算法如何實現,下面舉乙個比較直觀的例子:
可以很明顯的看出原來6 * 6的矩陣有明顯的垂直邊緣,通過3 * 3的過濾器(也叫做「核」)卷積之後,仍然保留了原來的垂直邊緣特徵,雖然這個邊緣貌似有點大,這是因為資料不夠大的原因,如果輸入資料很大的話這個不是很明顯了。
除了上面的垂直,水平邊緣檢測,其實也可以檢測初顏色過度變化,例如是亮變暗,還是暗變亮?
下面是一些常見的過濾器,第二個是sobel filter,具有較強的魯棒性,第三個是schoss filter。
其實過濾器的9個引數也可以通過學習的方式獲得,雖然比較費勁,但是可能會學到很多其他除了垂直,水平的邊緣特徵,例如45°,70°等各種特徵。
之所以運用padding(填充)主要是為了解決如下兩個缺點:
1.由前面的例子可以看到,每經過一次卷積計算,原資料都會減小,但有的時候我們並不希望這樣。舉個比較極端的例子:假設原資料是30 * 30的乙隻貓的影象,經過10次卷積(過濾器是3 * 3)後,最後影象只剩下了10 * 10了,此時不就剩下馬賽克了嗎23333
2.由卷積的計算方法可以知道,影象邊緣特徵計算次數顯然少於影象中間位置的畫素點,如下圖示(綠色的位置明顯是冷宮)
所以為了解決上=上面兩個問題,引入了padding,一般是padding=1,填充的資料是0。效果如下:
原來的6 * 6填充後變成了8 * 8,此時在經過一次卷積得到的仍舊是6 * 6的矩陣。
下面總結一下卷積之後得到矩陣大小的計算方法,假設:
得到的矩陣大小是 (n+2p-f+1)*(n+2p-f+1)
對於第二個缺點,雖然邊緣畫素點仍舊計算的比較少,但是這個缺點至少一定程度上被削弱了。
兩種選擇:valid 卷積和same 卷積
即不新增padding。
即保持原影象矩陣的大小。滿足 (n+2p-f+1) = n ,即
p=f−12」 role=」presentation」 style=」position: relative;」>p=f
−12p=f−12
為了滿足上式,f一般奇數。
過濾器縱向,橫向都需要按步長s來移動,如圖示
結合之前的內容,輸出矩陣大小計算公式方法為,假設:
得到的矩陣大小是 ⌊
n+2p−fs」 role=」presentation」 style=」position: relative;」>n+2
p−fs
n+2p−fs
+1⌋⌊⌋: 向下取整符號 ⌊59/60⌋=0
⌈⌉:向上取整符號 ⌈59/60⌉=1
這一節用立體卷積來解釋。
如圖示,輸入矩陣是 6 * 6 * 3(height * width * channels),過濾器是3 * 3 * 3,計算方法是一一對應相乘相加,最後得到4 * 4的二維矩陣。
有時可能需要檢測橫向邊緣和縱向邊緣,或者其他特徵,所以我們可以使用多個過濾器。
上圖則使用了兩個過濾器,得到的特徵矩陣大小為 4 * 4 * 2.
如圖示得到4 * 4的矩陣後還需要加上乙個變差
bn」 role=」presentation」 style=」position: relative;」>bnbn
個引數。
下面總結了各項引數的大小和表示方法:
輸出矩陣(height* width* channels):
nhl∗nwl∗ncl」 role=」presentation」 style=」position: relative;」>nlh
∗nlw
∗nlc
nhl∗nwl∗ncl
輸出層與輸入層計算公式:
nh/w[l]=[nh/w[l−1]+2p[l]−f[l]s[l]+1]」 role=」presentation」 style=」position: relative;」>n[l
]h/w
=[n[
l−1]
h/w+
2p[l
]−f[
l]s[
l]+1
]nh/w[l]=[nh/w[l−1]+2p[l]−f[l]s[l]+1]
上圖簡單介紹了卷積網路的計算過程,需要再介紹的一點是最後一層的全連線層,即將7 * 7 * 40的輸出矩陣展開,得到1960個節點,然後再採用邏輯回歸或softmax來進行**。
另外從上面的例子還可以看到,在一般的卷積神經網路中,每一層的矩陣的height和width是逐漸減小的,而channel則是增加的。
卷積神經網路中常見的三中型別的layer:
pooling layer(池化層)的作用是壓縮資料,加速運算,同時提高所提取特徵的魯棒性。
注意:一般來說池化層是不需要padding的,所以p都會置為0
卷積相比於全連線的好處最直觀的就是使用的引數更少:
如圖示,加入我們有乙個32 * 32 * 3的,經過6個5 * 5的過濾器後可以得到28 * 28 * 6的矩陣,此時我們只需要
5∗5∗6=150」 role=」presentation」 style=」position: relative;」>5∗5
∗6=150
5∗5∗6=150
個引數就可以了。而如果不用卷積呢?
首先32 * 32 3 = 3072,假如輸出矩陣也要是28 28 * 6,即4704個節點,如果全連線的話那麼就需要4704 * 3072個權
重引數,所以這個對比還是很明顯的了。
至於為什麼可以保證引數少的同時也保證了有效性,是因為如下兩個原因
引數共享:例如我們希望獲取影象的豎向特徵,那麼我們只需加入乙個可以檢測豎向特徵的過濾器就夠了。
稀疏連線:如上圖所示,輸出矩陣左上角的0只與輸入矩陣左上角的9個元素有關,其他的值不會干擾。輸出矩陣其他位置也一樣。所以這就是為什麼卷積網路也可以捕捉到影象平移的特徵,例如將中的貓向左平移幾個畫素點後,依然能夠識別正確。
吳恩達《卷積神經網路》
一 yolo algorithm 把輸入的分割成3x3個格仔或19x19個格仔,每個格仔進行檢測輸出八個特徵,3x3就輸出3x3x8個向量。yolo演算法的優點是不需要乙個演算法跑很多次。相反這是單次卷積實現,在處理計算時很多步驟都是共享的,而且執行速度非常快可以達到實時識別。物件中點的座標在哪個格...
吳恩達 卷積神經網路
卷積神經網路 卷積操作 設輸入n,filter為f,padding為p,步長 stride 為s 則卷積 不滿足結合律,滿足結合律還需要對filter進行水平和垂直翻轉 之後影象大小為 n 2p f s 1 向下取整 rgb影象卷積操作 同時相乘相加,三個channel輸出乙個值 為什麼cnn可以避...
吳恩達 卷積神經網路
1 灰度影象,邊緣檢測,使用核函式的缺點,影象的向量會不斷的縮小,另外乙個就是邊緣的向量相比於中間的向量被覆蓋的次數會少很多。解決這個的方法就是padding在影象的周圍再新增一圈向量。2 核函式通常是奇數維向量 3 卷積層,池化層 選出某一區域的最大值,另外還有 平均池化,就是求乙個小區域的均值 ...