神經網路之卷積篇:詳解單層卷積網路(One layer of a convolutional network)

Oten發表於2024-08-20

詳解單層卷積網路

如何構建卷積神經網路的卷積層,下面來看個例子。

已經寫了如何透過兩個過濾器卷積處理一個三維影像,並輸出兩個不同的4×4矩陣。假設使用第一個過濾器進行卷積,得到第一個4×4矩陣。使用第二個過濾器進行卷積得到另外一個4×4矩陣。

最終各自形成一個卷積神經網路層,然後增加偏差,它是一個實數,透過Python的廣播機制給這16個元素都加上同一偏差。然後應用非線性函式,為了說明,它是一個非線性啟用函式ReLU,輸出結果是一個4×4矩陣。

對於第二個4×4矩陣,加上不同的偏差,它也是一個實數,16個數字都加上同一個實數,然後應用非線性函式,也就是一個非線性啟用函式ReLU,最終得到另一個4×4矩陣。然後重複之前的步驟,把這兩個矩陣堆疊起來,最終得到一個4×4×2的矩陣。透過計算,從6×6×3的輸入推匯出一個4×4×2矩陣,它是卷積神經網路的一層,把它對映到標準神經網路中四個卷積層中的某一層或者一個非卷積神經網路中。

注意前向傳播中一個操作就是\(z^{[1]} = W^{[1]}a^{[0]} + b^{[1]}\),其中\(a^{[0]} =x\),執行非線性函式得到\(a^{[1]}\),即\(a^{[1]} = g(z^{[1]})\)。這裡的輸入是\(a^{\left\lbrack 0\right\rbrack}\),也就是\(x\),這些過濾器用變數\(W^{[1]}\)表示。在卷積過程中,對這27個數進行操作,其實是27×2,因為用了兩個過濾器,取這些數做乘法。實際執行了一個線性函式,得到一個4×4的矩陣。卷積操作的輸出結果是一個4×4的矩陣,它的作用類似於\(W^{[1]}a^{[0]}\),也就是這兩個4×4矩陣的輸出結果,然後加上偏差。

這一部分(圖中藍色邊框標記的部分)就是應用啟用函式ReLU之前的值,它的作用類似於\(z^{[1]}\),最後應用非線性函式,得到的這個4×4×2矩陣,成為神經網路的下一層,也就是啟用層。

這就是\(a^{[0]}\)\(a^{[1]}\)的演變過程,首先執行線性函式,然後所有元素相乘做卷積,具體做法是運用線性函式再加上偏差,然後應用啟用函式ReLU。這樣就透過神經網路的一層把一個6×6×3的維度\(a^{[0]}\)演化為一個4×4×2維度的\(a^{[1]}\),這就是卷積神經網路的一層。

示例中有兩個過濾器,也就是有兩個特徵,因此才最終得到一個4×4×2的輸出。但如果用了10個過濾器,而不是2個,最後會得到一個4×4×10維度的輸出影像,因為選取了其中10個特徵對映,而不僅僅是2個,將它們堆疊在一起,形成一個4×4×10的輸出影像,也就是\(a^{\left\lbrack1 \right\rbrack}\)

為了加深理解,來做一個練習。假設有10個過濾器,而不是2個,神經網路的一層是3×3×3,那麼,這一層有多少個引數呢?來計算一下,每一層都是一個3×3×3的矩陣,因此每個過濾器有27個引數,也就是27個數。然後加上一個偏差,用引數\(b\)表示,現在引數增加到28個。裡畫了2個過濾器,而現在有10個,加在一起是28×10,也就是280個引數。

請注意一點,不論輸入圖片有多大,1000×1000也好,5000×5000也好,引數始終都是280個。用這10個過濾器來提取特徵,如垂直邊緣,水平邊緣和其它特徵。即使這些圖片很大,引數卻很少,這就是卷積神經網路的一個特徵,叫作“避免過擬合”。這時已經知道到如何提取10個特徵,可以應用到大圖片中,而引數數量固定不變,此例中只有28個,相對較少。

最後總結一下用於描述卷積神經網路中的一層(以\(l\)層為例),也就是卷積層的各種標記。

這一層是卷積層,用\(f^{[l]}\)表示過濾器大小,說過過濾器大小為\(f×f\),上標\(\lbrack l\rbrack\)表示\(l\)層中過濾器大小為\(f×f\)。通常情況下,上標\(\lbrack l\rbrack\)用來標記\(l\)層。用\(p^{[l]}\)來標記padding的數量,padding數量也可指定為一個valid卷積,即無padding。或是same卷積,即選定padding,如此一來,輸出和輸入圖片的高度和寬度就相同了。用\(s^{[l]}\)標記步幅。

這一層的輸入會是某個維度的資料,表示為\(n \times n \times n_{c}\)\(n_{c}\)某層上的顏色通道數。

要稍作修改,增加上標\(\lbrack l -1\rbrack\),即\(n^{\left\lbrack l - 1 \right\rbrack} \times n^{\left\lbrack l -1 \right\rbrack} \times n_{c}^{\left\lbrack l - 1\right\rbrack}\),因為它是上一層的啟用值。

此例中,所用圖片的高度和寬度都一樣,但它們也有可能不同,所以分別用上下標\(H\)\(W\)來標記,即\(n_{H}^{\left\lbrack l - 1 \right\rbrack} \times n_{W}^{\left\lbrack l - 1 \right\rbrack} \times n_{c}^{\left\lbrack l - 1\right\rbrack}\)。那麼在第\(l\)層,圖片大小為\(n_{H}^{\left\lbrack l - 1 \right\rbrack} \times n_{W}^{\left\lbrack l - 1 \right\rbrack} \times n_{c}^{\left\lbrack l - 1\right\rbrack}\)\(l\)層的輸入就是上一層的輸出,因此上標要用\(\lbrack l - 1\rbrack\)。神經網路這一層中會有輸出,它本身會輸出影像。其大小為\(n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]}\),這就是輸出影像的大小。

前面提到過,這個公式給出了輸出圖片的大小,至少給出了高度和寬度,\(\lfloor\frac{n+2p - f}{s} + 1\rfloor\)(注意:(\(\frac{n + 2p - f}{s} +1)\)直接用這個運算結果,也可以向下取整)。在這個新表示式中,\(l\)層輸出影像的高度,即\(n_{H}^{[l]} = \lfloor\frac{n_{H}^{\left\lbrack l - 1 \right\rbrack} +2p^{[l]} - f^{[l]}}{s^{[l]}} +1\rfloor\),同樣可以計算出影像的寬度,用\(W\)替換引數\(H\),即\(n_{W}^{[l]} = \lfloor\frac{n_{W}^{\left\lbrack l - 1 \right\rbrack} +2p^{[l]} - f^{[l]}}{s^{[l]}} +1\rfloor\),公式一樣,只要變化高度和寬度的引數便能計算輸出影像的高度或寬度。這就是由\(n_{H}^{\left\lbrack l - 1 \right\rbrack}\)推導\(n_{H}^{[l]}\)以及\(n_{W}^{\left\lbrack l - 1\right\rbrack}\)推導\(n_{W}^{[l]}\)的過程。

那麼通道數量又是什麼?這些數字從哪兒來的?來看一下。輸出影像也具有深度,透過上一個示例,知道它等於該層中過濾器的數量,如果有2個過濾器,輸出影像就是4×4×2,它是二維的,如果有10個過濾器,輸出影像就是4×4×10。輸出影像中的通道數量就是神經網路中這一層所使用的過濾器的數量。如何確定過濾器的大小呢?知道卷積一個6×6×3的圖片需要一個3×3×3的過濾器,因此過濾器中通道的數量必須與輸入中通道的數量一致。因此,輸出通道數量就是輸入通道數量,所以過濾器維度等於\(f^{[l]} \times f^{[l]} \times n_{c}^{\left\lbrack l - 1 \right\rbrack}\)

應用偏差和非線性函式之後,這一層的輸出等於它的啟用值\(a^{[l]}\),也就是這個維度(輸出維度)。\(a^{[l]}\)是一個三維體,即\(n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]}\)。當執行批次梯度下降或小批次梯度下降時,如果有\(m\)個例子,就是有\(m\)個啟用值的集合,那麼輸出\(A^{[l]} = m \times n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]}\)。如果採用批次梯度下降,變數的排列順序如下,首先是索引和訓練示例,然後是其它三個變數。

該如何確定權重引數,即引數W呢?過濾器的維度已知,為\(f^{[l]} \times f^{[l]} \times n_{c}^{[l - 1]}\),這只是一個過濾器的維度,有多少個過濾器,這(\(n_{c}^{[l]}\))是過濾器的數量,權重也就是所有過濾器的集合再乘以過濾器的總數量,即\(f^{[l]} \times f^{[l]} \times n_{c}^{[l - 1]} \times n_{c}^{[l]}\),損失數量L就是\(l\)層中過濾器的個數。

最後看看偏差引數,每個過濾器都有一個偏差引數,它是一個實數。偏差包含了這些變數,它是該維度上的一個向量。為了方便,偏差在程式碼中表示為一個1×1×1×\(n_{c}^{[l]}\)的四維向量或四維張量。

卷積有很多種標記方法,這是最常用的卷積符號。大家線上搜尋或檢視開原始碼時,關於高度,寬度和通道的順序並沒有完全統一的標準卷積,所以在檢視GitHub上的原始碼或閱讀一些開源實現的時候,會發現有些作者會採用把通道放在首位的編碼標準,有時所有變數都採用這種標準。實際上在某些架構中,當檢索這些圖片時,會有一個變數或引數來標識計算通道數量和通道損失數量的先後順序。只要保持一致,這兩種卷積標準都可用。很遺憾,這只是一部分標記法,因為深度學習文獻並未對標記達成一致,但會採用這種卷積標識法,按高度,寬度和通道損失數量的順序依次計算。

相關文章