1.7 单层卷积网络-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
| 1.6 三維卷積 | 回到目錄 | 1.8 簡單卷積網絡示例 |
單層卷積網絡 (One Layer of a Convolutional Network)
今天我們要講的是如何構建卷積神經網絡的卷積層,下面來看個例子。
上節課,我們已經講了如何通過兩個過濾器卷積處理一個三維圖像,并輸出兩個不同的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]z^{[1]}=W^{[1]}a^{[0]}+b^{[1]}z[1]=W[1]a[0]+b[1] ,其中 a[0]=xa^{[0]}=xa[0]=x ,執行非線性函數得到 a[1]a^{[1]}a[1] ,即 a[1]=g(z[1])a^{[1]}=g(z^{[1]})a[1]=g(z[1]) 。這里的輸入是 a[0]a^{[0]}a[0] ,也就是 xxx ,這些過濾器用變量 W[1]W^{[1]}W[1] 表示。在卷積過程中,我們對這27個數進行操作,其實是27×2,因為我們用了兩個過濾器,我們取這些數做乘法。實際執行了一個線性函數,得到一個4×4的矩陣。卷積操作的輸出結果是一個4×4的矩陣,它的作用類似于 W[1]a[0]W^{[1]}a^{[0]}W[1]a[0] ,也就是這兩個4×4矩陣的輸出結果,然后加上偏差。
這一部分(圖中藍色邊框標記的部分)就是應用激活函數ReLU之前的值,它的作用類似于,最后應用非線性函數,得到的這個4×4×2矩陣,成為神經網絡的下一層,也就是激活層。
這就是 a[0]a^{[0]}a[0] 到 a[1]a^{[1]}a[1] 的演變過程,首先執行線性函數,然后所有元素相乘做卷積,具體做法是運用線性函數再加上偏差,然后應用激活函數ReLU。這樣就通過神經網絡的一層把一個6×6×3的維度 a[0]a^{[0]}a[0] 演化為一個4×4×2維度的 a[1]a^{[1]}a[1] ,這就是卷積神經網絡的一層。
示例中我們有兩個過濾器,也就是有兩個特征,因此我們才最終得到一個4×4×2的輸出。但如果我們用了10個過濾器,而不是2個,我們最后會得到一個4×4×10維度的輸出圖像,因為我們選取了其中10個特征映射,而不僅僅是2個,將它們堆疊在一起,形成一個4×4×10的輸出圖像,也就是 a[1]a^{[1]}a[1] 。
為了加深理解,我們來做一個練習。假設你有10個過濾器,而不是2個,神經網絡的一層是3×3×3,那么,這一層有多少個參數呢?我們來計算一下,每一層都是一個3×3×3的矩陣,因此每個過濾器有27個參數,也就是27個數。然后加上一個偏差,用參數 bbb 表示,現在參數增加到28個。上一頁幻燈片里我畫了2個過濾器,而現在我們有10個,加在一起是28×10,也就是280個參數。
請注意一點,不論輸入圖片有多大,1000×1000也好,5000×5000也好,參數始終都是280個。用這10個過濾器來提取特征,如垂直邊緣,水平邊緣和其它特征。即使這些圖片很大,參數卻很少,這就是卷積神經網絡的一個特征,叫作“避免過擬合”。你已經知道到如何提取10個特征,可以應用到大圖片中,而參數數量固定不變,此例中只有28個,相對較少。
最后我們總結一下用于描述卷積神經網絡中的一層(以 lll 層為例),也就是卷積層的各種標記。
這一層是卷積層,用 f[l]f^{[l]}f[l] 表示過濾器大小,我們說過過濾器大小為 f?ff*ff?f ,上標 [l]{[l]}[l] 表示 lll 層中過濾器大小為 f?ff*ff?f 。通常情況下,上標 [l]{[l]}[l] 用來標記 lll 層。 p[l]p^{[l]}p[l] 用來標記padding的數量,padding數量也可指定為一個valid卷積,即無padding。或是same卷積,即選定padding,如此一來,輸出和輸入圖片的高度和寬度就相同了。用 s[l]s^{[l]}s[l] 標記步幅。
這一層的輸入會是某個維度的數據,表示為 n?n?ncn*n*n_cn?n?nc? , ncn_cnc? 某層上的顏色通道數。
我們要稍作修改,增加上標 [l?1][l-1][l?1] ,即 n[l?1]?n[l?1]?nc[l?1]n^{[l-1]}*n^{[l-1]}*n_c^{[l-1]}n[l?1]?n[l?1]?nc[l?1]? ,因為它是上一層的激活值。
此例中,所用圖片的高度和寬度都一樣,但它們也有可能不同,所以分別用上下標 HHH 和 WWW 來標記,即 nH[l?1]?nW[l?1]?nc[l?1]n_H^{[l-1]}*n_W^{[l-1]}*n_c^{[l-1]}nH[l?1]??nW[l?1]??nc[l?1]? 。那么在第 lll 層,圖片大小為 nH[l?1]?nW[l?1]?nc[l?1]n_H^{[l-1]}*n_W^{[l-1]}*n_c^{[l-1]}nH[l?1]??nW[l?1]??nc[l?1]? , lll 層的輸入就是上一層的輸出,因此上標要用 [l?1][l-1][l?1] 。神經網絡這一層中會有輸出,它本身會輸出圖像。其大小為 nH[l]?nW[l]?nc[l]n_H^{[l]}*n_W^{[l]}*n_c^{[l]}nH[l]??nW[l]??nc[l]? ,這就是輸出圖像的大小。
前面我們提到過,這個公式給出了輸出圖片的大小,至少給出了高度和寬度, ?n+2p?fs+1?\lfloor\frac{n+2p-f}{s}+1\rfloor?sn+2p?f?+1? (注意:( n+2p?fs+1\frac{n+2p-f}{s}+1sn+2p?f?+1 直接用這個運算結果,也可以向下取整)。在這個新表達式中, lll 層輸出圖像的高度,即 nH[l]=?nH[l?1]+2p[l]?f[l]s[l]+1?n_H^{[l]}=\lfloor\frac{n_H^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1\rfloornH[l]?=?s[l]nH[l?1]?+2p[l]?f[l]?+1? ,同樣我們可以計算出圖像的寬度,用 WWW 替換參數 HHH ,即 nW[l]=?nW[l?1]+2p[l]?f[l]s[l]+1?n_W^{[l]}=\lfloor\frac{n_W^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1\rfloornW[l]?=?s[l]nW[l?1]?+2p[l]?f[l]?+1? ,公式一樣,只要變化高度和寬度的參數我們便能計算輸出圖像的高度或寬度。這就是由 nH[l?1]n_H^{[l-1]}nH[l?1]? 推導 nH[l]n_H^{[l]}nH[l]? 以及 nW[l?1]n_W^{[l-1]}nW[l?1]? 推導 nW[l]n_W^{[l]}nW[l]? 的過程。
那么通道數量又是什么?這些數字從哪兒來的?我們來看一下。輸出圖像也具有深度,通過上一個示例,我們知道它等于該層中過濾器的數量,如果有2個過濾器,輸出圖像就是4×4×2,它是二維的,如果有10個過濾器,輸出圖像就是4×4×10。輸出圖像中的通道數量就是神經網絡中這一層所使用的過濾器的數量。如何確定過濾器的大小呢?我們知道卷積一個6×6×3的圖片需要一個3×3×3的過濾器,因此過濾器中通道的數量必須與輸入中通道的數量一致。因此,輸出通道數量就是輸入通道數量,所以過濾器維度等于 f[l]?f[l]?nc[l?1]f^{[l]}*f^{[l]}*n_c^{[l-1]}f[l]?f[l]?nc[l?1]? 。
應用偏差和非線性函數之后,這一層的輸出等于它的激活值 a[l]a^{[l]}a[l] ,也就是這個維度(輸出維度)。 a[l]a^{[l]}a[l] 是一個三維體,即 nH[l]?nW[l]?nc[l]n_H^{[l]}*n_W^{[l]}*n_c^{[l]}nH[l]??nW[l]??nc[l]? 。當你執行批量梯度下降或小批量梯度下降時,如果有 mmm 個例子,就是有 mmm 個激活值的集合,那么輸出 A[l]=m?nH[l]?nW[l]?nc[l]A^{[l]}=m*n_H^{[l]}*n_W^{[l]}*n_c^{[l]}A[l]=m?nH[l]??nW[l]??nc[l]? 。如果采用批量梯度下降,變量的排列順序如下,首先是索引和訓練示例,然后是其它三個變量。
該如何確定權重參數,即參數W呢?過濾器的維度已知,為 f[l]?f[l]?nc[l?1]f^{[l]}*f^{[l]}*n_c^{[l-1]}f[l]?f[l]?nc[l?1]? ,這只是一個過濾器的維度,有多少個過濾器,這( nc[l]n_c^{[l]}nc[l]? )是過濾器的數量,權重也就是所有過濾器的集合再乘以過濾器的總數量,即 f[l]?f[l]?nc[l?1]?nc[l]f^{[l]}*f^{[l]}*n_c^{[l-1]}*n_c^{[l]}f[l]?f[l]?nc[l?1]??nc[l]? ,損失數量L就是 lll 層中過濾器的個數。
最后我們看看偏差參數,每個過濾器都有一個偏差參數,它是一個實數。偏差包含了這些變量,它是該維度上的一個向量。后續課程中我們會看到,為了方便,偏差在代碼中表示為一個1×1×1×nc[l]n_c^{[l]}nc[l]?的四維向量或四維張量。
卷積有很多種標記方法,這是我們最常用的卷積符號。大家在線搜索或查看開源代碼時,關于高度,寬度和通道的順序并沒有完全統一的標準卷積,所以在查看GitHub上的源代碼或閱讀一些開源實現的時候,你會發現有些作者會采用把通道放在首位的編碼標準,有時所有變量都采用這種標準。實際上在某些架構中,當檢索這些圖片時,會有一個變量或參數來標識計算通道數量和通道損失數量的先后順序。只要保持一致,這兩種卷積標準都可用。很遺憾,這只是一部分標記法,因為深度學習文獻并未對標記達成一致,但課上我會采用這種卷積標識法,按高度,寬度和通道損失數量的順序依次計算。
我知道,忽然間接觸到這么多新的標記方法,你可能會說,這么多怎么記呢?別擔心,不用全都記住,你可以通過本周的練習來熟悉它們。而這節課我想講的重點是,卷積神經網絡的某一卷積層的工作原理,以及如何計算某一卷積層的激活函數,并映射到下一層的激活值。了解了卷積神經網絡中某一卷積層的工作原理,我們就可以把它們堆疊起來形成一個深度卷積神經網絡,我們下節課再講。
課程板書
| 1.6 三維卷積 | 回到目錄 | 1.8 簡單卷積網絡示例 |
總結
以上是生活随笔為你收集整理的1.7 单层卷积网络-深度学习第四课《卷积神经网络》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.6 三维卷积-深度学习第四课《卷积神
- 下一篇: 1.8 简单卷积网络示例-深度学习第四课