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