回覆列表
  • 1 # 論智

    我們通常看到的卷積過濾器示意圖是這樣的:

    這其實是把卷積過濾器“壓扁”了,或者說“拍平”了。比如,上圖中粉色的卷積過濾器是3x3x3,也就是長3寬3深3,但是示意圖中卻畫成二維——這是省略了深度(depth)。

    實際上,卷積過濾器是有深度的,深度值和輸入影象的深度相同。也正因為卷積過濾器的深度和輸入影象的深度相同,因此,一般在示意圖中就不把深度畫出來了。如果把深度也畫出來,效果大概就是這樣:

    如前所述,卷積過濾器的深度和輸入影象的深度相同,都是3。

    順便說下,輸入影象深度為3,是因為輸入影象是彩色影象,深度為3,分別為R、G、B值。

    作為對比,灰度影象的卷積過濾器是這樣的(真2D):

    總之,卷積過濾器的深度和輸入資料的深度保持一致就可以了。

  • 2 # AI中國

    什麼是卷積神經網路?

    它們基本上只是使用卷積層的神經網路,即基於卷積數學運算的Conv層。 Conv圖層由一組濾鏡組成,你可以將其看作是數字的二維矩陣。 這裡有一個例子3x3過濾器:

    我們可以使用一個輸入影象和一個過濾器透過將過濾器與輸入影象進行卷積來生成一個輸出影象。這包括

    將過濾器覆蓋在影象的某個位置上。在過濾器中的值與其在影象中的對應值之間執行元素級乘法。總結所有元素產品。這個和是輸出影象中目標畫素的輸出值。對所有位置重複。

    旁註:我們(以及許多CNN實現)實際上在技術上使用的是互相關而不是卷積,但它們做的幾乎是一樣的。我不會在這篇文章中詳細討論它們之間的區別,因為這並不重要。

    這四步描述有點抽象,我們來做個例子。看下這個微小的4x4灰度影象和這個3x3濾鏡:

    影象中的數字表示畫素強度,其中0為黑色,255為白色。我們將卷積輸入影象和過濾器產生一個2x2輸出影象:

    首先,讓我們將濾鏡疊加在圖片的左上角:

    接下來,我們在重疊影象值和過濾器值之間執行逐元素乘法。 以下是結果,從左上角開始向右,然後向下:

    接下來,我們總結所有的結果。這是很容易:

    最後,我們將結果放入輸出影象的目標畫素中。由於我們的過濾器覆蓋在輸入影象的左上角,我們的目標畫素是輸出影象的左上角畫素:

    我們做同樣的事情來生成輸出影象的其餘部分:

    3.1這有什麼用?

    讓我們縮小一下,在更高的層次上看這個。將影象與過濾器進行卷積會做什麼?我們可以從我們一直使用的例子3x3過濾器開始,它通常被稱為垂直Sobel過濾器:

    下面是一個垂直Sobel過濾器的例子:

    同樣,還有一個水平Sobel過濾器:

    看發生了什麼?Sobel過濾器是一種邊緣檢測器。垂直Sobel過濾器檢測垂直邊緣,水平Sobel過濾器檢測水平邊緣。輸出影象現在很容易解釋:輸出影象中的亮畫素(高值畫素)表示在原始影象中有一個強邊緣。

    你能看出為什麼邊緣檢測影象可能比原始影象更有用嗎? 回想一下我們的MNIST手寫數字分類問題。 在MNIST上訓練的CNN可以尋找數字1,例如,透過使用邊緣檢測過濾器並檢查影象中心附近的兩個突出的垂直邊緣。 通常,卷積有助於我們查詢特定的本地化影象特徵(如邊緣),我們可以在以後的網路中使用。

    3.2填充

    還記得以前將4x4輸入影象與3x3濾波器卷積得到2x2輸出影象嗎?通常,我們希望輸出影象與輸入影象的大小相同。為此,我們在影象周圍新增零,這樣我們就可以在更多的地方覆蓋過濾器。一個3x3的過濾器需要1畫素的填充:

    這稱為"相同"填充,因為輸入和輸出具有相同的尺寸。 不使用任何填充,這是我們一直在做的,並將繼續為這篇文章做,有時被稱為"有效"填充。

    3.3 Conv層(Conv Layers)

    現在我們知道了影象卷積是如何工作的以及它為什麼有用,讓我們看看它在CNN中的實際應用。如前所述,CNN包括conv層,它使用一組過濾器將輸入影象轉換為輸出影象。conv層的主要引數是它擁有的過濾器的數量。

    對於MNIST CNN,我們將使用一個帶有8個過濾器的小conv層作為網路的初始層。這意味著它將把28x28的輸入影象轉換成26x26x8的容量:

    提醒:輸出是26x26x8,而不是28x28x8,因為我們使用了有效的填充,這將輸入的寬度和高度降低了2。

    conv層中的4個過濾器每個都產生一個26x26的輸出,因此它們疊加在一起構成一個26x26x8。所有這些都是因為3×3(過濾器大小) × 8(過濾器數量)= 72個權重!

    3.4實施卷積

    是時候把我們學到的東西寫進程式碼裡了!我們將實現conv層的前饋部分,它負責將過濾器與輸入影象進行卷積以生成輸出卷。為了簡單起見,我們假設過濾器總是3x3(這並不是真的,5x5和7x7過濾器也很常見)。

    讓我們開始實現一個conv層類:

    Conv3x3類只接受一個引數:過濾器的數量。在建構函式中,我們儲存過濾器的數量,並使用NumPy的randn()方法初始化一個隨機過濾器陣列。

    注意:如果初始值過大或過小,訓練網路將無效。

    接下來,實際的卷積:

    iterate_regions()是一個輔助發生器的方法,收益率為我們所有有效3 x3的影象區域。這對於以後實現該類的向後部分非常有用。

    上面突出顯示了實際執行卷積的程式碼行。讓我們來分解一下:

    我們有im_region,一個包含相關影象區域的3x3陣列。我們有self.filters,一個3d陣列。我們做im_region * self.filters,它使用numpy的廣播機制以元素方式乘以兩個陣列。 結果是一個3d陣列,其尺寸與self.filters相同。我們np.sum()上一步的結果使用axis =(1,2),它產生一個長度為num_filters的1d陣列,其中每個元素包含相應過濾器的卷積結果。我們將結果分配給輸出[i,j],其中包含輸出中畫素(i,j)的卷積結果。

    對輸出中的每個畫素執行上面的序列,直到得到最終的輸出卷為止!讓我們測試一下我們的程式碼:

    目前看起來不錯。

    注意:在Conv3x3實現中,為了簡單起見,我們假設輸入是一個2d numpy陣列,因為MNIST影象就是這樣儲存的。這對我們有用,因為我們使用它作為我們網路的第一層,但大多數cnn有更多的Conv層。如果我們要構建一個更大的網路,需要多次使用Conv3x3,那麼我們必須將輸入設定為3d numpy陣列。

  • 中秋節和大豐收的關聯?
  • 皮卡10萬內選擇哪個牌子,汽油還是柴油?