{eval=Array;=+count(Array);}
我們通常看到的卷積過濾器示意圖是這樣的:
(圖片來源:cs231n)
這其實是把卷積過濾器“壓扁”了,或者說“拍平”了。比如,上圖中粉色的卷積過濾器是3x3x3,也就是長3寬3深3,但是示意圖中卻畫成二維——這是省略了深度(depth)。
實際上,卷積過濾器是有深度的,深度值和輸入圖像的深度相同。也正因為卷積過濾器的深度和輸入圖像的深度相同,因此,一般在示意圖中就不把深度畫出來了。如果把深度也畫出來,效果大概就是這樣:
(圖片來源:mlnotebook)
如前所述,卷積過濾器的深度和輸入圖像的深度相同,都是3。
順便說下,輸入圖像深度為3,是因為輸入圖像是彩色圖像,深度為3,分別為R、G、B值。
作為對比,灰度圖像的卷積過濾器是這樣的(真2D):
(圖片來源:mlnotebook)
總之,卷積過濾器的深度和輸入數(shù)據(jù)的深度保持一致就可以了。
濾波器是一種3維結(jié)構(gòu)(濾波器的概念其實就是層),它由多個卷積核組成,所以具有深度。這里的深度是對于通道而言,比如彩色圖像是3通道,黑白圖像是1通道,所以彩色圖像的深度是3,黑白是1。當(dāng)輸入C*H*W的圖像時(H:長,W:寬,C:通道數(shù)),那么濾波器如何對這張圖像進行特征提取呢?就是用每個卷積核和圖像的每個通道的空域進行計算。由于輸入了C通道的圖像,所以為了所有通道都能參與進來,所以需要C個卷積核,也就是說1個濾波器的深度和輸入圖像的深度是相同的。C個卷積核一一對應(yīng)著C個通道,計算出了C個結(jié)果后,通過一定的機制融合,最終1個濾波器輸出了1個結(jié)果。當(dāng)然,卷積操作會有多個濾波器參與,這樣就可以提取到不同尺度的特征。
簡單來說,濾波器的深度就是卷積核的數(shù)量,值相等于輸入數(shù)據(jù)的通道數(shù)。
謝邀!
什么是卷積神經(jīng)網(wǎng)絡(luò)?
它們基本上只是使用卷積層的神經(jīng)網(wǎng)絡(luò),即基于卷積數(shù)學(xué)運算的Conv層。 Conv圖層由一組濾鏡組成,你可以將其看作是數(shù)字的二維矩陣。 這里有一個例子3x3過濾器:
我們可以使用一個輸入圖像和一個過濾器通過將過濾器與輸入圖像進行卷積來生成一個輸出圖像。這包括
旁注:我們(以及許多CNN實現(xiàn))實際上在技術(shù)上使用的是互相關(guān)而不是卷積,但它們做的幾乎是一樣的。我不會在這篇文章中詳細討論它們之間的區(qū)別,因為這并不重要。
這四步描述有點抽象,我們來做個例子。看下這個微小的4x4灰度圖像和這個3x3濾鏡:
圖像中的數(shù)字表示像素強度,其中0為黑色,255為白色。我們將卷積輸入圖像和過濾器產(chǎn)生一個2x2輸出圖像:
首先,讓我們將濾鏡疊加在圖片的左上角:
接下來,我們在重疊圖像值和過濾器值之間執(zhí)行逐元素乘法。 以下是結(jié)果,從左上角開始向右,然后向下:
接下來,我們總結(jié)所有的結(jié)果。這是很容易:
最后,我們將結(jié)果放入輸出圖像的目標(biāo)像素中。由于我們的過濾器覆蓋在輸入圖像的左上角,我們的目標(biāo)像素是輸出圖像的左上角像素:
我們做同樣的事情來生成輸出圖像的其余部分:
3.1這有什么用?
讓我們縮小一下,在更高的層次上看這個。將圖像與過濾器進行卷積會做什么?我們可以從我們一直使用的例子3x3過濾器開始,它通常被稱為垂直Sobel過濾器:
下面是一個垂直Sobel過濾器的例子:
同樣,還有一個水平Sobel過濾器:
看發(fā)生了什么?Sobel過濾器是一種邊緣檢測器。垂直Sobel過濾器檢測垂直邊緣,水平Sobel過濾器檢測水平邊緣。輸出圖像現(xiàn)在很容易解釋:輸出圖像中的亮像素(高值像素)表示在原始圖像中有一個強邊緣。
你能看出為什么邊緣檢測圖像可能比原始圖像更有用嗎? 回想一下我們的MNIST手寫數(shù)字分類問題。 在MNIST上訓(xùn)練的CNN可以尋找數(shù)字1,例如,通過使用邊緣檢測過濾器并檢查圖像中心附近的兩個突出的垂直邊緣。 通常,卷積有助于我們查找特定的本地化圖像特征(如邊緣),我們可以在以后的網(wǎng)絡(luò)中使用。
3.2填充
還記得以前將4x4輸入圖像與3x3濾波器卷積得到2x2輸出圖像嗎?通常,我們希望輸出圖像與輸入圖像的大小相同。為此,我們在圖像周圍添加零,這樣我們就可以在更多的地方覆蓋過濾器。一個3x3的過濾器需要1像素的填充:
這稱為"相同"填充,因為輸入和輸出具有相同的尺寸。 不使用任何填充,這是我們一直在做的,并將繼續(xù)為這篇文章做,有時被稱為"有效"填充。
3.3 Conv層(Conv Layers)
現(xiàn)在我們知道了圖像卷積是如何工作的以及它為什么有用,讓我們看看它在CNN中的實際應(yīng)用。如前所述,CNN包括conv層,它使用一組過濾器將輸入圖像轉(zhuǎn)換為輸出圖像。conv層的主要參數(shù)是它擁有的過濾器的數(shù)量。
對于MNIST CNN,我們將使用一個帶有8個過濾器的小conv層作為網(wǎng)絡(luò)的初始層。這意味著它將把28x28的輸入圖像轉(zhuǎn)換成26x26x8的容量:
提醒:輸出是26x26x8,而不是28x28x8,因為我們使用了有效的填充,這將輸入的寬度和高度降低了2。
conv層中的4個過濾器每個都產(chǎn)生一個26x26的輸出,因此它們疊加在一起構(gòu)成一個26x26x8。所有這些都是因為3×3(過濾器大小) × 8(過濾器數(shù)量)= 72個權(quán)重!
3.4實施卷積
是時候把我們學(xué)到的東西寫進代碼里了!我們將實現(xiàn)conv層的前饋部分,它負責(zé)將過濾器與輸入圖像進行卷積以生成輸出卷。為了簡單起見,我們假設(shè)過濾器總是3x3(這并不是真的,5x5和7x7過濾器也很常見)。
讓我們開始實現(xiàn)一個conv層類:
Conv3x3類只接受一個參數(shù):過濾器的數(shù)量。在構(gòu)造函數(shù)中,我們存儲過濾器的數(shù)量,并使用NumPy的randn()方法初始化一個隨機過濾器數(shù)組。
注意:如果初始值過大或過小,訓(xùn)練網(wǎng)絡(luò)將無效。
接下來,實際的卷積:
iterate_regions()是一個輔助發(fā)生器的方法,收益率為我們所有有效3 x3的圖像區(qū)域。這對于以后實現(xiàn)該類的向后部分非常有用。
上面突出顯示了實際執(zhí)行卷積的代碼行。讓我們來分解一下:
對輸出中的每個像素執(zhí)行上面的序列,直到得到最終的輸出卷為止!讓我們測試一下我們的代碼:
目前看起來不錯。
注意:在Conv3x3實現(xiàn)中,為了簡單起見,我們假設(shè)輸入是一個2d numpy數(shù)組,因為MNIST圖像就是這樣存儲的。這對我們有用,因為我們使用它作為我們網(wǎng)絡(luò)的第一層,但大多數(shù)cnn有更多的Conv層。如果我們要構(gòu)建一個更大的網(wǎng)絡(luò),需要多次使用Conv3x3,那么我們必須將輸入設(shè)置為3d numpy數(shù)組。
更多有關(guān)人工智能的資訊、深度報道、采訪歡迎關(guān)注AI中國,無論你是小白還是大神,你想要的這里都有!
3
回答0
回答0
回答0
回答0
回答9
回答0
回答0
回答0
回答5
回答