社群計算機視覺課程文件

卷積神經網路簡介

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

卷積神經網路簡介

在上一單元中,我們學習了視覺、影像和計算機視覺的基礎知識。我們還探索了視覺特徵作為藉助計算機分析影像的關鍵部分。

我們討論的方法現在通常被稱為“經典”計算機視覺。雖然在許多小型和受限的資料集和設定中執行良好,但經典方法在處理大規模真實世界資料集時會暴露出其侷限性。

在本單元中,我們將學習卷積神經網路,這是計算機視覺在規模和效能方面向前邁出的重要一步。

卷積:基本概念

卷積是一種用於從資料中提取特徵的操作。資料可以是 1D、2D 或 3D。我們將透過一個具體的例子來解釋這個操作。現在你只需要知道,這個操作只是簡單地取一個由數字組成的矩陣,在資料中移動它,並計算資料與該矩陣之間的乘積之和。這個矩陣被稱為核或濾波器。你可能會說,“這與特徵提取有什麼關係,我該如何應用它呢?”別慌!我們正在講到。

為了闡明直覺,我們來看一個例子。我們有這個一維資料,並將其視覺化。視覺化將有助於理解卷積操作的效果。

Kernel Image

我們有這個核 [-1, 1]。我們將從最左邊的元素開始,放置核,將重疊的數字相乘,然後求和。核有中心;它是其中一個元素。在這裡,我們將中心選為 1(右邊的元素)。我們在這裡選擇中心為 1,假設左邊有一個虛構的零,這被稱為填充,你稍後會看到。現在,核的中心必須接觸每個元素,所以為了方便起見,我們在元素的左邊放置一個零。如果我們不填充,我就必須用 -1 乘以最左邊的元素,而 1 不會接觸最左邊的元素,所以我們應用填充。讓我們看看它是什麼樣子。

1D Conv

我將最左邊的元素(當前是填充)乘以 -1,將第一個元素(零)乘以 1,然後將它們相加,得到 0,並記錄下來。現在,我們將核移動一個位置,並重復相同的操作。再次記錄下來,這種移動稱為步幅,通常透過將核移動一個畫素來完成。你也可以移動更多畫素。結果(卷積資料)目前是一個數組 [0, 0]。

1D Conv Multiplication

我們將重複此操作,直到核的右側元素接觸到每個元素,從而得到以下結果。

1D Conv Result

你注意到什麼了嗎?該濾波器給出了資料的變化率(導數!)。這是我們可以從資料中提取的一個特徵。讓我們將其視覺化。

Convolved Illustrated

卷積資料(卷積的結果)稱為特徵圖。這很有道理,因為它顯示了我們可以提取的特徵、與資料相關的特性以及變化率。

這正是邊緣檢測濾波器所做的工作!讓我們在二維資料中看看它。這次,我們的核將有所不同。它將是一個 3x3 的核(只是為了讓你知道它也可以是 2x2)。

2D Conv

這個濾波器其實很有名,但我們現在不告訴你它的名字 :)。之前的濾波器是 [-1 1]。而這個是 [-1 0 1]。它只是 3x3 的形狀,沒有什麼不同,它顯示了水平軸上的增量和減量。讓我們看一個例子並應用卷積。下面是我們的二維資料。

2D Conv

把這看作一張圖片,我們想提取水平變化。現在,濾波器的中心必須接觸到每個畫素,所以我們對圖片進行填充。

Padding

特徵圖將與原始資料大小相同。卷積的結果將被寫入到核中心在原始矩陣中接觸到的相同位置,這意味著對於這個,它將接觸最左邊和頂部位置。

2D Conv

如果我們持續應用卷積,我們將得到以下特徵圖。

2D Feature Map

這向我們展示了水平變化(邊緣)。這個濾波器實際上叫做 Prewitt 濾波器。

Prewitt and Sobel

你可以翻轉 Prewitt 濾波器 以獲取垂直方向的變化。Sobel 濾波器 是另一個著名的邊緣檢測濾波器。

卷積神經網路

好的,但這與深度學習有什麼關係呢?嗯,暴力破解濾波器來提取特徵對每張圖片都不適用。想象一下,如果我們可以以某種方式找到最優濾波器來提取重要資訊甚至檢測影像中的物體。這就是卷積神經網路發揮作用的地方。我們用各種濾波器對影像進行卷積,特徵圖中的這些畫素最終將成為我們要最佳化的引數,最終,我們將為我們的問題找到最佳濾波器。

其思想是,我們將使用濾波器來提取資訊。我們將隨機初始化多個濾波器,建立我們的特徵圖,將它們輸入分類器,然後進行反向傳播。在深入研究之前,我想向你介紹我們稱之為“池化”的東西。

如上圖所示,有許多畫素顯示特徵圖中的變化。要知道存在邊緣,我們只需要看到存在變化(邊緣、拐角,任何東西),僅此而已。

Pooling

在上面的例子中,我們只需要獲得其中一個就足夠了。這樣,我們將儲存更少的引數,並且仍然擁有特徵。這種獲取特徵圖中最重要的元素的操作稱為池化。透過池化,我們失去了邊緣存在的精確畫素位置,但我們儲存了更少的引數。此外,這樣,我們的特徵提取機制對微小變化將更具魯棒性,例如,我們只需要知道圖片中有兩隻眼睛、一個鼻子和一張嘴,就知道它是一張臉,這些元素之間的距離和這些元素的大小在不同的臉之間往往會發生變化,而池化使模型能夠對這些變化更具魯棒性。池化的另一個好處是它幫助我們處理不同的輸入大小。下面是最大池化操作,每四個畫素中,我們取最大的畫素。池化有多種型別,例如平均池化、加權池化或 L2 池化。

讓我們構建一個簡單的 CNN 架構。我們將使用 Keras 示例(為了說明),我們將引導你瞭解正在發生的事情。下面是我們的模型(再次,不要驚慌,我們將引導你瞭解正在發生的事情)。

如果你不知道 Keras Sequential API 在做什麼,它就像樂高積木一樣堆疊層並連線它們。每層都有不同的超引數,Conv2D 層接受卷積濾波器數量、核大小和啟用函式作為引數,而 MaxPooling2D 接受池化大小,全連線層接受輸出單元數量(再次,不要驚慌)。

大多數卷積網路實現為了讓核以影像處理的方式接觸每個畫素而不進行填充。零填充的假設是,我們可能在邊界處有特徵,並且它增加了計算的複雜性。這就是為什麼你看到第一個輸入大小是 (26,26),我們在邊界處丟失了資訊。

model = keras.Sequential(
    [
        keras.Input(shape=input_shape),
        layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
        layers.MaxPooling2D(pool_size=(2, 2)),
        layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
        layers.MaxPooling2D(pool_size=(2, 2)),
        layers.Flatten(),
        layers.Dropout(0.5),
        layers.Dense(num_classes, activation="softmax"),
    ]
)
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 26, 26, 32)        320       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 13, 13, 32)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 11, 11, 64)        18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64)          0         
_________________________________________________________________
flatten (Flatten)            (None, 1600)              0         
_________________________________________________________________
dropout (Dropout)            (None, 1600)              0         
_________________________________________________________________
dense (Dense)                (None, 10)                16010     
=================================================================
Total params: 34,826
Trainable params: 34,826
Non-trainable params: 0
_________________________________________________________________

卷積神經網路從輸入層和卷積層開始。Keras Conv2D 層接受核的數量和核的大小作為引數。發生的事情如下圖所示。在這裡,我們將影像與 32 個核進行卷積,最終得到 32 個特徵圖,每個特徵圖的大小與影像相同。

Network

在卷積層之後,我們放置一個最大池化層,以減少儲存的引數數量,並使模型對變化具有魯棒性,如上所述。這將減少計算的引數數量。

Network
然後,這些特徵圖被連線在一起並展平。
Network
之後,我們使用一種稱為 dropout 的方法來丟棄一部分引數,以避免過擬合。最後,權重的最終形式將透過一個全連線層進行分類,並進行反向傳播。

卷積神經網路中的反向傳播理論

反向傳播在這裡如何工作?我們想要最佳化最佳的核值,所以它們就是我們的權重。最後,我們期望分類器找出畫素值、核和類別之間的關係。因此,我們有一個非常長的展平陣列,其中包含經過池化和啟用的畫素元素,這些元素與初始權重(核元素)進行卷積。我們更新這些權重,以便回答“我應該應用哪些核來區分貓和狗的照片?”這個問題。訓練 CNN 的目的是找出最佳核,而這些核是透過反向傳播找到的。在 CNN 之前,人們會嘗試在影像上嘗試很多濾波器來自己提取特徵,而大多數通用濾波器(如我們上面看到的,例如 Prewitt 或 Sobel)不一定適用於所有影像,因為即使在同一資料集中,影像也可能非常不同。這就是為什麼 CNN 優於傳統的影像處理技術。

當我們使用卷積神經網路時,在儲存方面有幾個優點。

引數共享

在卷積神經網路中,我們對所有畫素、所有通道和所有影像使用相同的濾波器進行卷積,這比使用密集神經網路遍歷影像更有效,從而在儲存引數方面具有優勢。這被稱為“權重繫結”,這些權重被稱為“繫結權重”。這也在自動編碼器中出現。

稀疏互動

在密集連線的神經網路中,我們一次性輸入所有資料——由於影像有成百上千個畫素,這非常耗費資源——而在卷積神經網路中,我們使用較小的核來提取特徵。這稱為稀疏互動,它有助於我們使用更少的記憶體。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.