吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

邊緣檢測

卷積運算是卷積神經網絡最基本的組成部分,使用邊緣檢測作為入門樣例。在這個筆記中,你會看到卷積是如何進行運算的。

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

在之前的筆記中,我說過神經網絡的前幾層是如何檢測邊緣的,然後,後面的層有可能檢測到物體的部分區域,更靠後的一些層可能檢測到完整的物體,這個例子中就是人臉。在這個視頻中,你會看到如何在一張圖片中進行邊緣檢測。

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

讓我們舉個例子,給了這樣一張圖片,讓電腦去搞清楚這張照片裡有什麼物體,你可能做的第一件事是檢測圖片中的垂直邊緣。

比如說,在這張圖片中的欄杆就對應垂直線,與此同時,這些行人的輪廓線某種程度上也是垂線,這些線是垂直邊緣檢測器的輸出。同樣,你可能也想檢測水平邊緣,比如說這些欄杆就是很明顯的水平線,它們也能被檢測到,結果在這。

所以如何在圖像中檢測這些邊緣?

看一個例子,這是一個6×6的灰度圖像。因為是灰度圖像,所以它是6×6×1的矩陣,而不是6×6×3的,因為沒有RGB三通道。為了檢測圖像中的垂直邊緣,你可以構造一個3×3矩陣。在共用習慣中,在卷積神經網絡的術語中,它被稱為過濾器(或者叫做卷積核)。我要構造一個3×3的過濾器,像這樣

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

在論文它有時候會被稱為核,而不是過濾器,但在這個筆記中,我將使用過濾器這個術語。對這個6×6的圖像進行卷積運算,卷積運算用“*”來表示,用3×3的過濾器對其進行卷積。

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

關於符號表示,有一些問題,在數學中“*”就是卷積的標準標誌,但是在Python中,這個標識常常被用來表示乘法或者元素乘法。所以這個“*”有多層含義,它是一個重載符號,在這個視頻中,當“*”表示卷積的時候我會特別說明。

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

這個卷積運算的輸出將會是一個4×4的矩陣,你可以將它看成一個4×4的圖像。

下面來說明是如何計算得到這個4×4矩陣的。

為了計算第一個元素,在4×4左上角的那個元素,使用3×3的過濾器,將其覆蓋在輸入圖像,如下圖所示。然後進行元素乘法(element-wise products)運算,所以

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

然後將該矩陣每個元素相加得到最左上角的元素,即3+1+2+0+0+0+(-1)+(-8)+(-2)=-5。

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

把這9個數加起來得到-5,當然,你可以把這9個數按任何順序相加,我只是先寫了第一列,然後第二列,第三列。

接下來,為了弄明白第二個元素是什麼,你要把藍色的方塊,向右移動一步,像這樣,把這些綠色的標記去掉:

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

繼續做同樣的元素乘法,然後加起來,所以是 0×1+5×1+7×1+1×0+8×0+2×0+2×(-1)+9×(-1)+5×(-1)=-4。

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

接下來也是一樣,繼續右移一步,把9個數的點積加起來得到0。

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

繼續移得到8,驗證一下:2×1+9×1+5×1+7×0+3×0+1×0+4×(-1)+1×(-1)+3×(-1)=8。

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

接下來為了得到下一行的元素,現在把藍色塊下移,現在藍色塊在這個位置:

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

重複進行元素乘法,然後加起來。通過這樣做得到-10。再將其右移得到-2,接著是2,3。以此類推,這樣計算完矩陣中的其他元素。

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

為了說得更清楚一點,這個-16是通過底部右下角的3×3區域得到的。

因此6×6矩陣和3×3矩陣進行卷積運算得到4×4矩陣。

這些圖片和過濾器是不同維度的矩陣,但左邊矩陣容易被理解為一張圖片,中間的這個被理解為過濾器,右邊的圖片我們可以理解為另一張圖片。這個就是垂直邊緣檢測器,後面你就會明白。

在往下講之前,多說一句,如果你要使用編程語言實現這個運算,不同的編程語言有不同的函數,而不是用“*”來表示卷積。所以在編程練習中,你會使用一個叫conv_forward的函數。如果在tensorflow下,這個函數叫tf.conv2d。在其他深度學習框架中,在後面的課程中,你將會看到Keras這個框架,在這個框架下用Conv2D實現卷積運算。所有的編程框架都有一些函數來實現卷積運算。

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

為什麼這個可以做垂直邊緣檢測呢?

讓我們來看另外一個例子。為了講清楚,我會用一個簡單的例子。這是一個簡單的6×6圖像,左邊的一半是10,右邊一般是0。如果你把它當成一個圖片,左邊那部分看起來是白色的,像素值10是比較亮的像素值,右邊像素值比較暗,我使用灰色來表示0,儘管它也可以被畫成黑的。圖片裡,有一個特別明顯的垂直邊緣在圖像中間,這條垂直線是從黑到白的過渡線,或者從白色到深色。

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

所以,當你用一個3×3過濾器進行卷積運算的時候,這個3×3的過濾器可視化為下面這個樣子,在左邊有明亮的像素,然後有一個過渡,0在中間,然後右邊是深色的。卷積運算後,你得到的是右邊的矩陣。如果你願意,可以通過數學運算去驗證。舉例來說,最左上角的元素0,就是由這個3×3塊(綠色方框標記)經過元素乘積運算再求和得到的,10×1+10×1+10×1+10×0+10×0+10×0+10×(-1)+10×(-1)+10×(-1)=0

。相反這個30是由這個(紅色方框標記)得到的,

10×1+10×1+10×1+10×0+10×0+10×0+0×(-1)+0×(-1)+0×(-1)=30。

吳恩達深度學習筆記(72)-卷積網絡的邊緣檢測

如果把最右邊的矩陣當成圖像,它是這個樣子。

在中間有段亮一點的區域,對應檢查到這個6×6圖像中間的垂直邊緣。這裡的維數似乎有點不正確,檢測到的邊緣太粗了。因為在這個例子中,圖片太小了。如果你用一個1000×1000的圖像,而不是6×6的圖片,你會發現其會很好地檢測出圖像中的垂直邊緣。

在這個例子中,在輸出圖像中間的亮處,表示在圖像中間有一個特別明顯的垂直邊緣。從垂直邊緣檢測中可以得到的啟發是,因為我們使用3×3的矩陣(過濾器),所以垂直邊緣是一個3×3的區域,左邊是明亮的像素,中間的並不需要考慮,右邊是深色像素。在這個6×6圖像的中間部分,明亮的像素在左邊,深色的像素在右邊,就被視為一個垂直邊緣,卷積運算提供了一個方便的方法來發現圖像中的垂直邊緣。

所以你已經瞭解卷積是怎麼工作的,在下一個筆記中,你將會看到如何使用卷積運算作為卷積神經網絡的基本模塊的。


分享到:


相關文章: