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