如何理解卷积神经网络(CNN)中的卷积和池化?
要說明這個問題,首先要從計算機視覺中的“Hello World”問題說起:MNIST手寫數字的分類。給定圖像,將其分類。
來自MNIST數據集的圖片樣本
MNIST數據集中的每個圖像都是28x28像素,包含一個居中的灰度數字。
什么是卷積?
首先,介紹一下什么是卷積神經網絡。
它是使用卷積層(Convolutional layers)的神經網絡,基于卷積的數學運算。
卷積層由一組濾波器組成,濾波器可以視為二維數字矩陣。這是一個示例3x3濾波器:
我們可以將濾波器與輸入圖像進行卷積來產生輸出圖像,那么什么是卷積操作呢?具體的步驟如下:
這個4步描述有點抽象,所以讓我們舉個例子吧。看下面的4x4灰度圖像和3x3濾波器:
圖像中的數字表示像素亮度,0是黑色,255是白色。我們將對輸入圖像和濾波器進行卷積,生成2x2輸出圖像。
首先,讓我們將濾鏡覆蓋在圖片的左上角:
接下來,我們在重疊的圖像和濾波器元素之間逐個進行乘法運算,按照從左向右、從上到下的順序。
把最右列的乘積結果全部相加,得到:
由于濾波器覆蓋在輸入圖像的左上角,因此目標像素是輸出圖像的左上角像素:
用同樣的方式處理圖像剩下的區域:
求卷積有何用?
看完了基本概念,你可能會有疑問,對圖像求卷積有什么用嗎?
我們在前文中使用的那個3x3濾波器,通常稱為垂直**索伯濾波器**(Sobel filter):
看看用它來處理知名的Lena照片會得到什么:
看出來了嗎?其實,索伯濾波器是是邊緣檢測器。
現在可以解釋卷積操作的用處了:用輸出圖像中更亮的像素表示原始圖像中存在的邊緣。
你能看出為什么邊緣檢測圖像可能比原始圖像更有用嗎?
回想一下MNIST手寫數字分類問題。在MNIST上訓練的CNN可以找到某個特定的數字。比如發現數字1,可以通過使用邊緣檢測發現圖像上兩個突出的垂直邊緣。
通常,卷積有助于我們找到特定的局部圖像特征(如邊緣),用在后面的網絡中。
填充
在上面的處理過程中,我們用3x3濾波器對4x4輸入圖像執行卷積,輸出了一個2x2圖像。
通常,我們希望輸出圖像與輸入圖像的大小相同。因此需要在圖像周圍添加零,讓我們可以在更多位置疊加過濾器。3x3濾波器需要在邊緣多填充1個像素。
這種方法稱之為“相同”填充,因為輸入和輸出具有相同的大小。而不使用任何填充稱為“有效”填充。
池化
圖像中的相鄰像素傾向于具有相似的值,因此通常卷積層相鄰的輸出像素也具有相似的值。這意味著,卷積層輸出中包含的大部分信息都是冗余的。
如果我們使用邊緣檢測濾波器并在某個位置找到強邊緣,那么我們也可能會在距離這個像素1個偏移的位置找到相對較強的邊緣。但是它們都一樣是邊緣,我們并沒有找到任何新東西。
池化層解決了這個問題。這個網絡層所做的就是通過減小輸入的大小降低輸出值的數量。
池化一般通過簡單的最大值、最小值或平均值操作完成。以下是池大小為2的最大池層的示例:
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的如何理解卷积神经网络(CNN)中的卷积和池化?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch中的nn.Conv1d与n
- 下一篇: 端到端的解决方案