Deeplearnng.AI第四部分第一周、卷积神经网络
文章目錄
- 1.2邊緣檢測
- 1.3更多邊緣檢測內容(More edge detection)
- 1.4 Padding
- 1.5 卷積步長(Strided convolutions)
- 1.6 三維卷積(Convolutions over volumes)
- 1.7 單層卷積網絡(One layer of a convolutional network)
- 1.8 簡單卷積網絡示例(A simple convolutional network example)
- 1.9池化層(Pooling layers)
- 1.10 卷及神經網絡例子(Convolutional neural network example)
- *1.11為什么使用卷積?
1.2邊緣檢測
在數學中“?”就是卷積的標準標志,但是在Python中,這個標識常常被用來表示乘法或者元素乘法。
為了計算第一個元素,在4×4左上角的那個元素,使
用3×3的過濾器,將其覆蓋在輸入圖像,如下圖所示。然后進行元素乘法(element-wise products)運算,所以[3?10?01?(?1)1?15?08?(?1)1?27?02?(?1)]=[30(?1)10(?8)20(?2)]\begin{bmatrix} 3*1\ \ 0*0\ \ 1*(-1)\\ 1*1\ \ 5*0\ \ 8*(-1)\\ 1*2\ \ 7*0\ \ 2*(-1) \end{bmatrix}= \begin{bmatrix} 3\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-8)\\ 2\ \ 0\ \ (-2) \end{bmatrix}???3?1??0?0??1?(?1)1?1??5?0??8?(?1)1?2??7?0??2?(?1)????=???3??0??(?1)1??0??(?8)2??0??(?2)????,然后將矩陣每個元素相加得到最左上角的元素,即 -5.
同理,得到第二個元素-4,
以此類推得到:
在不同的編程語言要實現這個運算,會有不同的函數。所以在編程練習中,你會使用一個叫conv_forward的函數。如果在tensorflow下,這個函數叫tf.conv2d,在其他深度學習框架中,如Keras,這個框架下用Conv2D實現卷積運算。所有編程框架都有函數來實現卷積運算。
以上是“卷積”的計算過程,那么什么是垂直邊緣檢測呢。下面來看另外一個例子。這是一個簡單的6×6圖像,左邊的一半是10,右邊一般是0。如果你把它當成一個圖片,左邊那部分看起來是白色的,像素值10是比較亮的像素值,右邊像素值比較暗,我使用灰色來表示0,盡管它也可以被畫成黑的。圖片里,有一個特別明顯的垂直邊緣在圖像中間,這條垂直線是從黑到白的過渡線,或者從白色到深色。
如果把最右邊的矩陣當成圖像,它是這個樣子。在中間有段亮一點的區域,對應檢查到這個6×6圖像中間的垂直邊緣。這里的維數似乎有點不正確,檢測到的邊緣太粗了。因為在這個例子中,圖片太小了。如果你用一個1000×1000的圖像,而不是6×6的圖片,你會發現其會很好地檢測出圖像中的垂直邊緣。在這個例子中,在輸出圖像中間的亮處,表示在圖像中間有一個特別明顯的垂直邊緣。從垂直邊緣檢測中可以得到的啟發是,因為我們使用3×3的矩陣(過濾器),所以垂直邊緣是一個3×3的區域,左邊是明亮的像素,中間的并不需要考慮,右邊是深色像素。在這個6×6圖像的中間部分,明亮的像素在左邊,深色的像素在右邊,就被視為一個垂直邊緣,卷積運算提供了一個方便的方法來發現圖像中的垂直邊緣。
1.3更多邊緣檢測內容(More edge detection)
這里還有個更復雜的例子,左上方和右下方都是亮度為10的點。如果你將它繪成圖片,右上角是比較暗的地方,這邊都是亮度為0的點,我把這些比較暗的區域都加上陰影。而左上方和右下方都會相對較亮。如果你用這幅圖與水平邊緣過濾器卷積,就會得到右邊這個矩陣。
再次強調,我們現在所使用的都是相對很小的圖片,僅有6×6。但這些中間的數值,比如說這個10(右邊矩陣中黃色方框標記元素)代表的是左邊這塊區域(左邊6×6矩陣中黃色方框標記的部分)。這塊區域左邊兩列是正邊,右邊一列是負邊,正邊和負邊的值加在一起得到了一個中間值。但假如這個一個非常大的1000×1000的類似這樣棋盤風格的大圖,就不會出現這些亮度為10的過渡帶了,因為圖片尺寸很大,這些中間值就會變得非常小。
總而言之,通過使用不同的過濾器,你可以找出垂直的或是水平的邊緣。但事實上,對于這個3×3的過濾器來說,我們使用了其中的一種數字組合。
但在歷史上,在計算機視覺的文獻中,曾公平地爭論過怎樣的數字組合才是最好的,所以你還可以使用這種:[10(?1)20(?2)10(?1)]\begin{bmatrix} 1\ \ 0\ \ (-1)\\ 2\ \ 0\ \ (-2)\\ 1\ \ 0\ \ (-1) \end{bmatrix}???1??0??(?1)2??0??(?2)1??0??(?1)????,叫做sobelsobelsobel的過濾器,它的優點在于增加了中間一行元素的權重,這使得結果的魯棒性會更高一些。
但計算機視覺的研究者們也會經常使用其他的數字組合,比如這種:[30(?3)100(?10)30(?3)]\begin{bmatrix} 3\ \ \ 0\ \ (-3)\\ 10\ \ 0\ \ (-10)\\ 3\ \ \ 0\ \ (-3) \end{bmatrix}???3???0??(?3)10??0??(?10)3???0??(?3)????這種叫做ScharrScharrScharr過濾器,它有著和之前完全不同的特性,實際上也是一種垂直邊緣檢測,如果你將其翻轉90度,你就能得到對應水平邊緣檢測。
1.4 Padding
為了構建深度神經網絡,你需要學會使用的一個基本的卷積操作就是padding,讓我們來看看它是如何工作的。
在前面的學習,我們知道對于一個是6x6的圖像,通過一個3x3的卷積之后會得到4x4的圖像。如果我們有n?nn*nn?n的圖像,同f?ff*ff?f的卷積核過濾器做卷積,那么輸出的維度就是:(n?f+1)?(n?f+1)(n-f+1)*(n-f+1)(n?f+1)?(n?f+1)。
但是這么卷積會使每次做卷積的時候圖像縮小。如果不想讓你的圖像在每次卷積之后縮小,可以這樣:
先在圖像邊緣填充一些像素,如上圖,那么6?66*66?6的圖像就編程8?88*88?8的圖像,再用卷積核卷積作用之后會得到(8?3+1)?(8?3+1)(8-3+1)*(8-3+1)(8?3+1)?(8?3+1),即還是6?66*66?6的圖像,這樣你就得到了一個尺寸和原圖像相等的圖像。習慣上,你可以用0去填充,如果ppp是填充的數量,在這個案例中,p=1p=1p=1,因為我們在周圍都填充了一個像素點,輸出也就變成了(n+2p?f+1)?(n+2p?f+1)(n+2p-f+1)*(n+2p-f+1)(n+2p?f+1)?(n+2p?f+1),所以就變成了,和輸入的圖像一樣大。這個涂綠的像素點(左邊矩陣)影響了輸出中的這些格子(右邊矩陣)。這樣一來,丟失信息或者更準確來說角落或圖像邊緣的信息發揮的作用較小的這一缺點就被削弱了。
卷積的padding通常有兩種選擇:分別是Valid卷積和Same卷積Valid卷積和 Same卷積Valid卷積和Same卷積,
- Valid卷積,即,不填充,如果有一個n?nn*nn?n的圖像,用一個f?ff*ff?f的過濾器卷積,它將會輸出(n?f+1)?(n?f+1)(n-f+1)*(n-f+1)(n?f+1)?(n?f+1)維的圖像。
- Same卷積,即填充后輸出和輸入大小一樣。根據公式n+2p?f+1n+2p-f+1n+2p?f+1,如果有一個n?nn*nn?n的圖像,同ppp個像素填充,輸出大小就是(n+2p?f+1)?(n+2p?f+1)(n+2p-f+1)*(n+2p-f+1)(n+2p?f+1)?(n+2p?f+1)。如果想讓n+2p?f+1=nn+2p-f+1=nn+2p?f+1=n,使得輸入輸出相等,那么用此等式求解p,p=f?12p=\frac{f-1}{2}p=2f?1?。所以當卷積核尺寸fff是一個奇數的時候,只要選擇相應的填充尺寸ppp,你就能確保得到和輸入相同尺寸的輸出。
1.5 卷積步長(Strided convolutions)
如果你想用3×3的過濾器卷積這個7×7的圖像,和之前不同的是,我們把步幅設置成了2。你還和之前一樣取左上方的3×3區域的元素的乘積,再加起來,最后結果為91。
計算第二個值的時候和之前有所不同,之前我們移動藍框的步長是1,現在移動的步長是2,我們讓過濾器跳過2個步長,注意一下左上角,這個點移動到其后兩格的點,跳過了一個位置。然后你還是將每個元素相乘并求和,你將會得到的結果是100。
以此類推計算出卷積后的值:
所以在這個例子中,我們用3×3的矩陣卷積一個7×7的矩陣,得到一個3×3的輸出。輸入和輸出的維度是由下面的公式決定的。如果你用一個f?ff*ff?f的過濾器卷積一個n?nn*nn?n的圖像,你的padding為ppp,步幅為s,在這個例子中s=2s=2s=2,你會得到一個輸出,因為現在你不是一次移動一個步子,而是一次移動sss個步子,輸出于是變為(n+2p?fs+1)?(n+2p?fs+1)(\frac{n+2p-f}{s}+1)*(\frac{n+2p-f}{s}+1)(sn+2p?f?+1)?(sn+2p?f?+1)
此例中,n = 7, p = 0, f = 3, s = 2, 代入公式得(7-3)/2 + 1 = 3。
現在只剩下最后的一個細節了,如果商不是一個整數怎么辦?在這種情況下,我們向下取整。?x?\lfloor x \rfloor?x?這是向下取整的符號,這意味著x向下取整到最近的整數。這個原則實現的方式是,你只在藍框完全包括在圖像或填充完的圖像內部時,才對它進行運算。如果有任意一個藍框移動到了外面,那你就不要進行相乘操作,這是一個慣例。你的3×3的過濾器必須完全處于圖像中或者填充之后的圖像區域內才輸出相應結果,這就是慣例。因此正確計算輸出維度的方法是向下取整,以免n+2p?fs+1\frac{n+2p-f}{s}+1sn+2p?f?+1不是整數。
從技術上講,我們實際上做的,我們在前面視頻中使用的操作,有時被稱為互相關(cross-correlation)而不是卷積(convolution)。但在深度學習文獻中,按照慣例,我們將這(不進行翻轉操作)叫做卷積操作。
1.6 三維卷積(Convolutions over volumes)
從一個例子開始,假如說你不僅想檢測灰度圖像的特征,也想檢測RGB彩色圖像的特征。彩色圖像如果是6×6×36×6×36×6×3,這里的3指的是三個顏色通道,你可以把它想象成三個6×66×66×6圖像的堆疊。為了檢測圖像的邊緣或者其他的特征,不是把它跟原來的3×33×33×3的過濾器做卷積,而是跟一個三維的過濾器,它的維度是3×3×33×3×33×3×3,這樣這個過濾器也有三層,對應紅綠、藍三個通道。
給這些命個名字(原圖像),這里的第一個6代表圖像高度,第二個6代表寬度,這個3代表通道的數目。同樣你的過濾器也有一個高,寬和通道數,并且圖像的通道數必須和過濾器的通道數匹配,所以這兩個數(紫色方框標記的兩個數)必須相等。下一張圖里,我們就會知道這個卷積操作是如何進行的了,這個的輸出會是一個4×44×44×4的圖像,注意是4×4×14×4×14×4×1,最后一個數不是333了。
上面左邊的圖像是6x6x36x6x36x6x3,中間是3x33x33x3的filter,為了簡化這個3x3x33x3x33x3x3的卷積核,我們將它畫成一個三維的立方體。
為了計算這個卷積操作的輸出,先把這個3x3x33x3x33x3x3的卷積核放到最左上角的位置,這個卷積核有3x3x3=273x3x3=273x3x3=27個數,依次取這272727個數,然后乘以相應的RGB通道中的數字,先是紅色通道的前999個數字,然后是綠色通道,然后再是藍色通道,乘以左邊黃色立方體覆蓋的對應的272727個數,然后把這些數都加起來,就得到了輸出的第一個數字。
要計算下一個輸出,你把這個立方體滑動一個單位,再與這272727個數相乘,把它們都加起來,就得到了下一個輸出,以此類推。
- 例如這個過濾器是3×3×33×3×33×3×3的,你只想檢測圖像紅色通道的邊緣,那么你可以將第一個過濾器設為[10(?1)10(?1)10(?1)]\begin{bmatrix} 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1) \end{bmatrix}???1??0??(?1)1??0??(?1)1??0??(?1)????,和之前一樣,而綠色通道全為000,[000000000]\begin{bmatrix} 0\ \ 0\ \ 0\\ 0\ \ 0\ \ 0\\ 0\ \ 0\ \ 0 \end{bmatrix}???0??0??00??0??00??0??0????,藍色的通道也全為零,如果你把這三個堆疊在一起形成一個3×3×33×3×33×3×3的過濾器,那么這就是一個檢測垂直邊界的過濾器,但只對紅色通道有用。
- 或
者如果你不關心垂直邊界在哪個顏色通道里,那么你可以用一個這樣的過濾器,[10(?1)10(?1)10(?1)]\begin{bmatrix} 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1) \end{bmatrix}???1??0??(?1)1??0??(?1)1??0??(?1)????,[10(?1)10(?1)10(?1)]\begin{bmatrix} 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1) \end{bmatrix}???1??0??(?1)1??0??(?1)1??0??(?1)????,[10(?1)10(?1)10(?1)]\begin{bmatrix} 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1) \end{bmatrix}???1??0??(?1)1??0??(?1)1??0??(?1)????,所有三個通道都一樣。所以通過設置第二個過濾器參數,你就有了一個邊界檢測器,3×3×33×3×33×3×3的邊界檢測器,用來檢測任意顏色通道里的邊界。參數的選擇不同,你就可以得到不同的特征檢測器,所有的都是3×3×33×3×33×3×3的過濾器。按照計算機視覺的慣例,當你的輸入有特定的高寬和通道數時,你的過濾器可以有不同的高,不的寬,但是必須一樣的通道數。理論上,我們的過濾器只關注紅色通道,或者只關注綠色或者藍色通道也是可行的。再注意一下這個卷積立方體,一個6×6×66×6×66×6×6的輸入圖像卷積上一個3×3×33×3×33×3×3的過濾器,得到一個4×44×44×4的二維輸出?,F在你已經了解了如何對立方體卷積,還有最后一個概念,對建立卷積神經網絡至關重要。就是,如果我們不僅僅想要檢測垂直邊緣怎么辦?如果我們同時檢測垂直邊緣和水平邊緣,還有45°45°45°傾斜的邊緣,還有70°70°70°傾斜的邊緣怎么做?換句話說,如果你想同時用多個過濾器怎么辦?這是我們上一張幻燈片的圖片,我們讓這個6×6×36×6×36×6×3的圖像和這個3×3×33×3×33×3×3的過濾器卷積,得到4×44×44×4的輸出。(第一個)這可能是一個垂直邊界檢測器或者是學習檢測其他的特征。第二個過濾器可以用橘色來表示,它可以是一個水平邊緣檢測器。
和第一個卷積核卷積,可以得到第一個4×44×44×4的輸出,然后卷積第二個過濾器,得到一個不同的4×44×44×4的輸出。把這兩個輸出堆疊在一起,這樣你就都得到了一個4×4×24×4×24×4×2的輸出立方體,一個立方盒子,所以這就是一個4×4×24×4×24×4×2的輸出立方體。它用6×6×36×6×36×6×3的圖像,然后卷積上這兩個不同的3×3×33×3×33×3×3的過濾器,得到兩個4×44×44×4的輸出,它們堆疊在一起,形成一個4×4×24×4×24×4×2的立方體,這里的2的來源于我們用了兩個不同的過濾器。
現在總結一下維度,如果你有一個n?n?nc(通道數)n*n*n_c(通道數)n?n?nc?(通道數)的輸入圖像,在這個例子中就是6?6?36*6*36?6?3,其中ncn_cnc?就是通道數,然后卷積上一個f?f?ncf*f*n_cf?f?nc?的卷積核,最后得到了(n?f+1)?(n?f+1)?nc′(n-f+1)*(n-f+1)*n_c'(n?f+1)?(n?f+1)?nc′?,其中nc′n_c'nc′?就是下一層的通道數,就是你所用的卷積核的個數(一個卷積核有RBG三層),此例中就是4?4?24*4*24?4?2。此時的步長是222,無padding。
現在你可以用它的一小部分直接在三個通道的RGB圖像上進行操作。更重要的是,你可以檢測兩個特征,比如垂直和水平邊緣或者10個或者128個或者幾百個不同的特征,并且輸出的通道數會等于你要檢測的特征數。
對于這里的符號,吳恩達先生常用通道數(ncn_cnc?)來表示最后一個維度,在文獻里大家也把它叫做333維立方體的深度。這兩個術語,即通道或者深度,經常被用在文獻中。
1.7 單層卷積網絡(One layer of a convolutional network)
前面已經講了如何通過兩個過濾器卷積處理一個三維圖像,并輸出兩個不同的4×44×44×4矩陣。假設使用第一個過濾器進行卷積,得到第一個4×44×44×4矩陣。使用第二個過濾器進行卷積得到另外一個4×44×44×4矩陣。
形成一個卷積神經網絡層,然后加入偏差b1b_1b1?,它是一個實數,通過Python的廣播機制給這161616個元素都加上同一偏差。然后應用非線性激活函數ReLU,輸出結果是一個4×4矩陣。
同樣,對于第二個4?44*44?4矩陣,我們加上不同的偏差,它也是一個實數,161616個數字都加上同一個實數,然后應用非線性激活函數ReLU,最終得到另一個4×44×44×4矩陣。然后重復我們之前的步驟,把這兩個矩陣堆疊起來,最終得到一個4×4×24×4×24×4×2的矩陣。我們通過計算,從6×6×36×6×36×6×3的輸入推導出一個4×4×24×4×24×4×2矩陣,它是卷積神經網絡的一層,把它映射到標準神經網絡中四個卷積層中的某一層或者一個非卷積神經網絡中。
注意前向傳播中一個操作就是z[1]=W[1]a[0]+b[1]z^{[1]}=W^{[1]}a^{[0]}+b^{[1]}z[1]=W[1]a[0]+b[1],其中a[0]=xa^{[0]}=xa[0]=x,執行激活函數操作得a[1]a^{[1]}a[1],即a[1]=g(z[1])a^{[1]}=g(z^{[1]})a[1]=g(z[1])。這里的輸入是a[0]a^{[0]}a[0],即xxx,卷積核用變量W[1]W^{[1]}W[1]表示。
這就是a[0]a^{[0]}a[0]到a[1]a^{[1]}a[1]的操作,即卷積神經網絡的一層。
- 為了加深理解,我們來做一個練習。
假設你有101010個過濾器,而不是222個,神經網絡的一層是3×3×33×3×33×3×3,那么,這一層有多少個參數呢?每一層都是一個3?3?33*3*33?3?3的矩陣,就有272727個參數,再加入一個偏差就是28個,如果是10個卷積核,那就有28*10=280個參數。 - 最后我們總結一下用于描述卷積神經網絡中的一層(以lll層為例),也就是卷積層的各種標記。
f[l]f^{[l]}f[l]表示卷積核的大小,為f?ff*ff?f,
上標[l]^{[l]}[l]表示lll層,
p[l]p^{[l]}p[l]表示padding的填充像素數量,可以指定為(Valid or Same),
s[l]s^{[l]}s[l]表示步長。
該層的輸入表示為n?n?ncn*n*n_cn?n?nc?,ncn_cnc?表示該層的顏色通道數。此時需要對其進行修改,增加上標[l?1][l-1][l?1],即n[l?1]?n[l?1]?nc[l?1]n^{[l-1]}*n^{[l-1]}*n_c^{[l-1]}n[l?1]?n[l?1]?nc[l?1]?,因為它是上一層的激活值。由于有時候所用圖片高度和寬度可能不等,分別用下標H,WH,WH,W標記,即,nH[l?1]?nW[l?1]?nc[l?1]n_H^{[l-1]}*n_W^{[l-1]}*n_c^{[l-1]}nH[l?1]??nW[l?1]??nc[l?1]?。那么在第lll層,圖片的維數是nH[l?1]?nW[l?1]?nc[l?1]n_H^{[l-1]}*n_W^{[l-1]}*n_c^{[l-1]}nH[l?1]??nW[l?1]??nc[l?1]?,第lll層的輸入就是上一層的激活輸出。而此層的輸出其圖片的維數是nH[l]?nW[l]?nc[l]n_H^{[l]}*n_W^{[l]}*n_c^{[l]}nH[l]??nW[l]??nc[l]?。
在第lll層的輸出圖像維數中:
nH[l]=?nH[l?1]+2p[l]?f[l]s[l]+1?n_H^{[l]}=\lfloor \frac{n_H^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}} +1\rfloornH[l]?=?s[l]nH[l?1]?+2p[l]?f[l]?+1?,
nW[l]=?nW[l?1]+2p[l]?f[l]s[l]+1?n_W^{[l]}=\lfloor \frac{n_W^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}} +1\rfloornW[l]?=?s[l]nW[l?1]?+2p[l]?f[l]?+1?,
下面確定卷積核的大小。一般用3?3?k3*3*k3?3?k大小的卷積核(當然也可以是5?5?k5*5*k5?5?k等等),那么kkk如何確定?輸入的通道數必須和卷積核的通道數一致。因此卷積核的維度就是
f[l]?f[l]?nc[l?1]f^{[l]}*f^{[l]}*n_c^{[l-1]}f[l]?f[l]?nc[l?1]?。
應用偏差和非線性函數之后,這一層的輸出等于它的激活值a[l]a^{[l]}a[l],其維度是nH[l]?nW[l]?nc[l]n_H^{[l]}*n_W^{[l]}*n_c^{[l]}nH[l]??nW[l]??nc[l]?。當我們有m個例子,就有輸出A[l]=m?nH[l]?nW[l]?nc[l]A^{[l]}=m*n_H^{[l]}*n_W^{[l]}*n_c^{[l]}A[l]=m?nH[l]??nW[l]??nc[l]?。了解了卷積神經網絡中某一卷積層的工作原理,我們就可以把它們堆疊起來形成一個深度卷積神經網絡。
1.8 簡單卷積網絡示例(A simple convolutional network example)
直接看1.10即可
1.9池化層(Pooling layers)
除了卷積層,卷積網絡也經常使用池化層來縮減模型的大小,提高計算速度,同時提高所提取特征的魯棒性,我們來看一下。先舉一個池化層的例子,然后我們再討論池化層的必要性。假如輸入是一個4×44×44×4矩陣,用到的池化類型是最大池化(max pooling)。執行最大池化的操作是一個2×22×22×2矩陣。執行過程非常簡單,把4×44×44×4的輸入拆分成不同的區域,我把這些區域用不同顏色來標記。對于2×22×22×2的輸出,輸出的每個元素都是其對應顏色區域中的最大元素值。
左上區域的最大值是9,右上區域的最大元素值是2,左下區域的最大值是6,右下區域的最大值是3。為了計算出右側這4個元素值,我們需要對輸入矩陣的2×2區域做最大值運算。這就像是應用了一個規模為2的過濾器,因為我們選用的是2×2區域,步幅是2,這些就是最大池化的超參數。因為我們使用的過濾器為2×2,最后輸出是9。然后向右移動2個步幅,計算出最大值2。然后是第二行,向下移動2步得到最大值6。最后向右移動3步,得到最大值3。這是一個2×2矩陣,即f=2f=2f=2,步幅是2,即s=2s=2s=2。
之前講的計算卷積層輸出大小的公式同樣適用于最大池化,即n+2p?fs+1\frac{n+2p-f}{s}+1sn+2p?f?+1
下面來看另一個例子:
此例是計算3?33*33?3輸出的每個元素,我們看左上角這些元素 ,注意這是一個3?33*33?3 區域,因為有 3 個過濾器,取最大值 9。然后移動一個元素,因為步幅是 1,藍色區域的最大值是 9.繼續向右移動,藍色區域的最大值是 5。然后移到下一行,因為步幅是 1,我們只向下移動一個格,所以該區域的最大值是 9。這個區域也是 9。這兩個區域的最大值都是 5。最后這三個區域的最大值分別為 8,68,68,6 和 999。超參數f=3,s=1f = 3,s = 1f=3,s=1,最終輸出如下圖所示。
以上就是一個二維輸入的最大池化的演示,如果輸入是三維的,那么輸出也是三維的。
例如,輸入是 5×5×25×5×25×5×2,那么輸出是 3×3×23×3×23×3×2。計算最大池化的方法就是分別對每個通道執行剛剛的計算過程。如上圖所示,第一個通道依然保持不變。對于第二個通道,我剛才畫在下面的,在這個層做同樣的計算,得到第二個通道的輸出。一般來說,如果輸入是5x5xncn_cnc?,輸出就是3x3xncn_cnc?,ncn_cnc?個通道中每個通道都單獨執行最大池化計算,以上就是最大池化算法。
另外還有一種池化類型,平均池化,但是它不太常用。這種運算取的不是每個過濾器的最大值,而是平均值。如下圖所示
示例中,紫色區域的平均值是 3.75,后面依次是 1.25、4 和 2。這個平均池化的超級參數f=2,s=2,f = 2,s = 2,f=2,s=2,我們也可以選擇其它超參數。
總結一下,池化的超級參數包括過濾器大小fff和步幅sss,常用的參數值為f=2,s=2,f = 2,s = 2,f=2,s=2,應用頻率非常高,其效果相當于高度和寬度縮減一半。也有使用f=3,s=2f = 3,s = 2f=3,s=2的情況。至于其它超級參數就要看你用的是最大池化還是平均池化了。你也可以根據自己意愿增加表示padding 的其他超級參數,雖然很少這么用。最大池化時,往往很少用到超參數 padding,當然也有例外的情況,我們下周會講。大部分情況下,最大池化很少用 padding。目前p最常用的值是 0,即 p=0。最大池化的輸入就是nH?nW?ncn_H*n_W*n_cnH??nW??nc?,假設沒有 padding,則輸出?nH?fs+1???nW?fs+1??nc\lfloor \frac{n_{_H}-f}{s}+1\rfloor *\lfloor \frac{n_{_W}-f}{s}+1\rfloor*n_c?snH???f?+1???snW???f?+1??nc?
1.10 卷及神經網絡例子(Convolutional neural network example)
-
假設,有一張大小為 32×32×332×32×332×32×3 的輸入圖片,這是一張 RGB 模式的圖片,你想做手寫體數字識別。32×32×3 的 RGB 圖片中含有某個數字,比如 7,你想識別它是從 0-9 這 10 個數字中的哪一個,我們構建一個神經網絡來實現這個功能。
下面這個網絡模型和經典網絡 LeNet-5 非常相似,靈感也來源于此。LeNet-5 是多年前 Yann LeCun 創建的,我所采用的模型并不是 LeNet-5,但是受它啟發,許多參數選擇都與LeNet-5 相似。
該網絡的輸入是 32×32×3 的矩陣,假設第一層使用過濾器大小為 5×5,步幅是 1, padding是 0,過濾器個數為 6,那么輸出為 28×28×6。將這層標記為 CONV1,它用了 6 個過濾器,增加了偏差,應用了非線性函數,可能是 ReLU 非線性函數,最后輸出 CONV1 的結果。
然后構建一個池化層,這里我選擇用最大池化,參數f = 2, s = 2,因為 padding 為 0?,F在開始構建池化層,最大池化使用的過濾器為 2×2,步幅為 2,表示層的高度和寬度會減少一半。因此,28×28 變成了 14×14,通道數量保持不變,所以最終輸出為 14×14×6,將該輸出標記為 POOL1。
人們發現在卷積神經網絡文獻中,卷積有兩種分類。一類卷積是一個卷積層和一個池化層一起作為一層,這就是神經網絡的 Layer1。另一類卷積是把卷積層作為一層,而池化層單獨作為一層。人們在計算神經網絡有多少層時,通常只統計具有權重和參數的層。因為池化層沒有權重和參數,只有一些超參數。這里,我們把 CONV1和 POOL1 共同作為一個卷積,并標記為 Layer1。在此例中,Layer1的輸出為14x14x6
接著構建第二個卷積層大小為 5×5,步幅為 1,這次我們用 10 個過濾器,最后輸出一個 10×10×10 的矩陣,標記為 CONV2。然后加入最大池化超參數f = 2,s = 2。最后輸出為 5×5×10,標記為 POOL2,這就是神經網絡的第二個卷積層,即 Layer2。
現在將 POOL2 平整化為一個大小為 400 的一維向量??梢园哑秸Y果想象成這樣的一個神經元集合,然后利用這 400 個單元構建下一層。下一層含有 120 個單元,這就是我們第一個全連接層,標記為 FC3。這 400 個單元與 120 個單元緊密相連,這就是全連接層。它很像我們在第一和第二門課中講過的單神經網絡層,這是一個標準的神經網絡。它的權重矩陣為W[3]W^{[3]}W[3] ,維度為 120×40。這就是所謂的“全連接”,因為這 400 個單元與這 120 個單元的每一項連接,還有一個偏差參數。輸出 120 個維度,因為有 120 個輸出。
然后我們對這個 120 個單元再添加一個全連接層,這層更小,假設它含有 84 個單元,標記為 FC4。
最后,用這 84 個單元后面接一個 softmax 單元。如果我們想通過手寫數字識別來識別手寫 0-9 這 10 個數字,這個 softmax 就會有 10 個輸出。 -
接下來我們講神經網絡的激活值形狀,激活值大小和參數數量。輸入為 32×32×3,這些數做乘法,結果為 3072,所以激活值a[0]a^{[0]}a[0]有 3072 維,激活值矩陣為 32×32×3,輸入層沒有參數。計算其他層的時候,試著自己計算出激活值,這些都是網絡中不同層的激活值形狀和激活值大小。
第二卷積層的參數相對較少,前面課上我們提到過,其實許多參數都存在于神經網絡的全連接層。觀察可發現,隨著神經網絡的加深,激活值尺寸會逐漸變小,如果激活值尺寸下降太快,也會影響神經網絡性能。示例中,激活值尺寸在第一層為 6000+,然后減少到 1600左右,慢慢減少到 84,最后輸出 softmax結果。我們發現,許多卷積網絡都具有這些屬性,模式上也相似。
*1.11為什么使用卷積?
這是本周最后一節課,我們來分析一下卷積在神經網絡中如此受用的原因,然后對如何整合這些卷積,如何通過一個標注過的訓練集訓練卷積神經網絡做個簡單概括。和只用全連接層相比,卷積層的兩個主要優勢在于參數共享和稀疏連接,舉例說明一下。
假設有一張 32×32×3 維度的圖片,這是上節課的示例,假設用了 6 個大小為 5×5 的過濾器,輸出維度為 28×28×6。32×32×3=3072,28×28×6=4704。我們構建一個神經網絡,其中一層含有 3072 個單元,下一層含有 4074 個單元,兩層中的每個神經元彼此相連,然后計算權重矩陣,它等于 4074×3072≈1400 萬,所以要訓練的參數很多。雖然以現在的技術,我們可以用 1400 多萬個參數來訓練網絡,因為這張 32×32×3 的圖片非常小,訓練這么多參數沒有問題。如果這是一張 1000×1000 的圖片,權重矩陣會變得非常大。我們看看這個卷積層的參數數量,每個過濾器都是 5×5,一個過濾器有 25 個參數,再加上偏差參數,那么每個過濾器就有 26 個參數,一共有 6 個過濾器,所以參數共計 156 個,參數數量還是很少。
卷積網絡映射這么少參數有兩個原因,一是參數共享。觀察發現,特征檢測如垂直邊緣檢測如果適用于圖片的某個區域,那么它也可能適用于圖片的其他區域。也就是說,如果你用一個 3×3 的過濾器檢測垂直邊緣,那么圖片的左上角區域,以及旁邊的各個區域(左邊矩陣中藍色方框標記的部分)都可以使用這個 3×3 的過濾器。每個特征檢測器以及輸出都可以在輸入圖片的不同區域中使用同樣的參數,以便提取垂直邊緣或其它特征。它不僅適用于邊緣特征這樣的低階特征,同樣適用于高階特征,例如提取臉上的眼睛,貓或者其他特征對象。即使減少參數個數,這 9 個參數同樣能計算出 16 個輸出。直觀感覺是,一個特征檢測器,如垂直邊緣檢測器用于檢測圖片左上角區域的特征,這個特征很可能也適用于圖片的右下角區域。因此在計算圖片左上角和右下角區域時,你不需要添加其它特征檢測器。假如有一個這樣的數據集,其左上角和右下角可能有不同分布,也有可能稍有不同,但很相似,整張圖片共享特征檢測器,提取效果也很好。
使得卷積網絡參數相對較少的第二個方法是使用稀疏連接,我來解釋下。這個 0 是通過3×3 的卷積計算得到的,它只依賴于這個 3×3 的輸入的單元格,右邊這個輸出單元(元素 0)僅與 36 個輸入特征中 9 個相連接。而且其它像素值都不會對輸出產生任影響,這就是稀疏連接的概念。
再舉一個例子,這個輸出(右邊矩陣中紅色標記的元素 30)僅僅依賴于這 9 個特征(左邊矩陣紅色方框標記的區域),看上去只有這 9 個輸入特征與輸出相連接,其它像素對輸出沒有任何影響。
神經網絡可以通過這兩種機制減少參數,以便我們用更小的訓練集來訓練它,從而預防過度擬合。你們也可能聽過,卷積神經網絡善于捕捉平移不變。通過觀察可以發現,向右移動兩個像素,圖片中的貓依然清晰可見,因為神經網絡的卷積結構使得即使移動幾個像素,這張圖片依然具有非常相似的特征,應該屬于同樣的輸出標記。實際上,我們用同一個過濾器生成各層中,圖片的所有像素值,希望網絡通過自動學習變得更加健壯,以便更好地取得所期望的平移不變屬性。這就是卷積或卷積網絡在計算機視覺任務中表現良好的原因。
最后,我們把這些層整合起來,看看如何訓練這些網絡。比如我們要構建一個貓咪檢測,xxx表示一張圖片y^\hat{y}y^? 是二進制標記或某個重要標記。我們選定一個卷及神經網絡,輸入圖片,增加卷積層和池化層,然后添加全連接層,最后輸出一個 softmax,即y^\hat yy^?。卷積層和全連接層有不同的參數www和偏差bbb,我們可以用任何參數集合來定義代價函數。一個類似于我們之前講過的那種代價函數,并隨機初始化其參數www和bbb,代價函數JJJ等于神經網絡對整個訓練集的預測的損失總和再除以mmm(即CostJ=1m∑i=1mL(y^(i),y(i))Cost\ J=\frac{1}{m}\sum^m_{i=1}L(\hat y^{(i)},y^{(i)})Cost?J=m1?∑i=1m?L(y^?(i),y(i))。所以訓練神經網絡,你要做的就是使用梯度下降法,或其它算法,例如 Momentum 梯度下降法,含 RMSProp 或其它因子的梯度下降來優化神經網絡中所有參數,以減少代價函數JJJ的值。通過上述操作你可以構建一個高效的貓咪檢測器或其它檢測器。
總結
以上是生活随笔為你收集整理的Deeplearnng.AI第四部分第一周、卷积神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu16.04安装R及RStud
- 下一篇: Deeplearnng.AI第四部分第二