2020-12-09 深度学习 卷积神经网络结构分析
1. 結(jié)構(gòu)總覽
首先我們分析下傳統(tǒng)神經(jīng)網(wǎng)絡(luò)對(duì)于圖片的處理,如果還是用CIFAR-10上的圖片,共3072個(gè)特征,如果普通網(wǎng)絡(luò)結(jié)構(gòu)輸入那么第一層的每一個(gè)神經(jīng)單元都會(huì)有3072個(gè)權(quán)重,如果更大的像素的圖片進(jìn)入后參數(shù)更多,而且用于圖片處理的網(wǎng)絡(luò)一般深度達(dá)10層之上,加在一起參數(shù)的量實(shí)在太大,參數(shù)過多也會(huì)造成過擬合,而且圖片也有自身的特點(diǎn),我們需要利用這些特點(diǎn),將傳統(tǒng)網(wǎng)絡(luò)改革,加快處理速度和精確度。
我們注意到圖片的像素是由3個(gè)通道構(gòu)成的,我們就利用了這個(gè)特點(diǎn)將其神經(jīng)元安置到了三維空間(width, height, depth),分別對(duì)應(yīng)著圖片的32x32x3(以CIFAR為例)如下圖:
紅色是輸入層這里的深度是3,輸出層是1x1x10的結(jié)構(gòu)。其他幾層的含義后面會(huì)介紹,現(xiàn)在先知道每層都是height × width × depth結(jié)構(gòu)。
2. 卷積神經(jīng)網(wǎng)絡(luò)的層
卷積神經(jīng)網(wǎng)絡(luò)有三種層:卷積層、池化層和全連接層(Convolutional Layer, Pooling Layer, 及 Fully-Connected Layer)。
以處理CIFAR-10的卷積神經(jīng)網(wǎng)絡(luò)為例,簡(jiǎn)單的網(wǎng)絡(luò)應(yīng)包含這幾層:
[INPUT - CONV - RELU - POOL - FC]也就是[輸入-卷積-激活-池化-分類得分],各層分述如下:
- INPUT [32x32x3] 輸入長(zhǎng)32寬32帶有三個(gè)通道的圖片
- CONV :計(jì)算圖片的局部區(qū)域,如果我們想要使用12個(gè)過濾器fliters,他的體積將是 [32x32x12].
- RELU :還是一個(gè)激勵(lì)層max(0,x) ,尺寸還是 ([32x32x12]).
- POOL: 沿著圖片的(width, height)采樣, 減小長(zhǎng)寬的維度,例如得到的結(jié)果是 [16x16x12].
- FC (i.e. fully-connected) 計(jì)算分類得分最終尺寸是 [1x1x10], 這層是全連接的,每一個(gè)單元都與前一層的各個(gè)單元連接。
注意:
1. 卷及神經(jīng)網(wǎng)絡(luò)包含不同的層 (e.g. CONV/FC/RELU/POOL 也是最受歡迎的)
2. 每一層都輸入輸出3d結(jié)構(gòu)的數(shù)據(jù),除了最后一層
3. 有些層可能沒有參數(shù),有些層可能有參數(shù) (e.g. CONV/FC do, RELU/POOL don’t)
4. 有些層可能有超參數(shù)有些層也可能沒有超參數(shù)(e.g. CONV/FC/POOL do, RELU doesn’t)
下圖是一個(gè)例子,沒法用三維表示只能展成一列的形式了。
下面展開討論各層具體細(xì)節(jié):
2.1 卷積層
卷積層是卷積神經(jīng)網(wǎng)絡(luò)的核心層,大大提高了計(jì)算效率。
卷積層由很多過濾器組成,每個(gè)過濾器都只有一小部分,每次只與原圖像上的一小部分連接,UFLDL上的圖:
這是一個(gè)過濾器不停滑動(dòng)的結(jié)果,
我們這里要更深入些,我們輸入的圖像是一個(gè)三維的,那么每個(gè)過濾器也是有三個(gè)維度,假設(shè)我們的過濾器是5x5x3的那么我們也會(huì)得到一個(gè)類似于上圖的激活值的映射也就是convolved feature 下圖中叫作 activion map,其計(jì)算方法是wT×x+bwT×x+b其中w是5x5x3=75個(gè)數(shù)據(jù),也就是權(quán)重,他是可以調(diào)節(jié)的。
我們可以有多個(gè)過濾器:
更深入一些,當(dāng)我們滑動(dòng)的時(shí)候有三個(gè)超參數(shù):
1. 深度,depth,這是過濾器的數(shù)量決定的。
2. 步長(zhǎng),stride,每次滑動(dòng)的間隔,上面的動(dòng)畫每次只滑動(dòng)1個(gè)數(shù),也就是步長(zhǎng)為1.
3. 補(bǔ)零數(shù), zero-padding,有時(shí)候根據(jù)需要,會(huì)用零來(lái)拓展圖像的面積,如果補(bǔ)零數(shù)為1,變長(zhǎng)就+2,如下圖中灰色的部分就是補(bǔ)的0
下面是一個(gè)一維的例子:
其輸出的空間維度計(jì)算公式是
(W?F+2P)/S+1(W?F+2P)/S+1
其中w是輸入的尺寸,f是過濾器的尺寸,p是補(bǔ)零的尺寸,s是步長(zhǎng),圖中如果補(bǔ)零為1那么輸出為5個(gè)數(shù),步長(zhǎng)為2輸出為3個(gè)數(shù)。
到現(xiàn)在為止我們好像都沒有涉及到?神經(jīng)這個(gè)概念哇,現(xiàn)在我們就從神經(jīng)角度來(lái)理解:
上面提到每一個(gè)激活值都是:?wT×x+bwT×x+b,這個(gè)公式我們熟悉哇,這就是神經(jīng)元的得分公式呀,所以我們可以將每一個(gè) activation map 其看做是一個(gè)filter的杰作,如果有5個(gè)過濾器,就會(huì)有5個(gè)不同的filter同時(shí)連接一個(gè)部分。
卷積神經(jīng)網(wǎng)絡(luò)還有一個(gè)重要的特征:?權(quán)重共享:在同一個(gè)filter上的不同的神經(jīng)單元(滑動(dòng)窗口)的權(quán)重是相同的。這樣以來(lái)大大減少了權(quán)重的數(shù)量。
這樣每一層權(quán)重相同,每一個(gè)過濾器計(jì)算的結(jié)果都是一個(gè)卷積(后來(lái)還會(huì)加一個(gè)偏差b):
這也是卷積神經(jīng)網(wǎng)絡(luò)的名字的來(lái)源。
下面這張圖是錯(cuò)誤的,請(qǐng)看官網(wǎng)?http://cs231n.github.io/convolutional-networks/#conv,找出其中的錯(cuò)誤就明白卷積的工作原理了。
雖然這里吧每一個(gè)filter的權(quán)重w變?yōu)槎鴣?lái)三部分,但是在神經(jīng)元里還是用了wx+b的形式。
- 反向傳播:這種卷積的反向傳播還是卷積,計(jì)算過程也比較簡(jiǎn)便
- 1x1 convolution:一些文章用了1*1的卷積, 比如最開始的?Network in Network. 這樣可以有效的做多個(gè)內(nèi)積, 輸入有三層,那么每層至少要有三個(gè)w,也就是把上面的動(dòng)態(tài)圖的filter變?yōu)?x1x3.
-Dilated convolutions.最近又有研究(?e.g. see paper by Fisher Yu and Vladlen Koltun) 對(duì)卷積層添加了一個(gè)超參數(shù):dilation。這是對(duì)filter的進(jìn)一步控制,我們開一下效果:dilation等于0時(shí),這樣計(jì)算卷積w[0]x[0] + w[1]x[1] + w[2]x[2];dilation =1時(shí)變成了這樣w[0]x[0] + w[1]x[2] + w[2]x[4];也就是我們要處理的圖像中每個(gè)隔了個(gè)1. 這就允許了利用更少的層來(lái)融合空間信息. 例如我們用了兩個(gè) 3x3 CONV layers在最頂層 ,這是第二層起到了 感受5x5 ( effective receptive field)的作用. 如果使用dilated convolutions 那么這個(gè)effective receptive field會(huì)以指數(shù)形式增長(zhǎng).
?
2.2 池化層
上面可以知道在卷積層之后得到的結(jié)果還是挺多,而且由于滑動(dòng)窗口的存在,很多信息也有重合,于是有了池化pooling 層,他是將卷積層得到的結(jié)果無(wú)重合的分來(lái)幾部分,然后選擇每一部分的最大值,或者平均值,或者2范數(shù),或者其他你喜歡的值,我們以取最大值的max pool為例:
- 反向傳播:最大值的梯度我們之前在反向傳播的時(shí)候就已經(jīng)學(xué)習(xí)過了,這里一般都跟蹤最大的激活值,這樣在反向傳播的時(shí)候會(huì)提高效率.
- Getting rid of pooling. 一些人認(rèn)為pooling是沒有必要的,如The All Convolutional Net?,很多人認(rèn)為沒有池層對(duì)于生成式模型(generative models)很重要,似乎以后的發(fā)展中,池層可能會(huì)逐漸減少或者消失。
2.3 其他層
2.4 Converting FC layers to CONV layers
全連接層和卷積層除了連接方式不一樣,其計(jì)算方式都是內(nèi)積,可以相互轉(zhuǎn)換:
1. FC如果做CONV layer 的工作就相當(dāng)于其矩陣的多數(shù)位置都是0(稀疏矩陣)。
2. FC layer 如果被轉(zhuǎn)變?yōu)?CONV layer. 相當(dāng)于每一層的局部連接變?yōu)榱巳挎溄尤鏔C layer with K=4096的輸入是7×7×512那么對(duì)應(yīng)的卷積層為 F=7,P=0,S=1,K=4096輸出為1×1×4096。
例子:
假設(shè)一個(gè)cnn輸入 224x224x3圖像,經(jīng)過若干變化之后某一層輸出 7x7x512 到這里之后使用兩4096的FC layer及最后一個(gè)1000的FC計(jì)算分類得分下面是把這三層fc轉(zhuǎn)化為Conv 的過程:
1. 使用 F=7的conv layer 輸出為 [1x1x4096];
2. 使用F=1的過濾器,輸出為 [1x1x4096];
3. 使用F=1的卷積層,輸出為 [1x1x1000]。
每次轉(zhuǎn)化都會(huì)將FC的參數(shù)轉(zhuǎn)變?yōu)閏onv的參數(shù)形式. 如果在轉(zhuǎn)變后的系統(tǒng)中傳入更大的圖片,也會(huì)非常快速的向前運(yùn)算。例如將384x384的圖像輸入上面的系統(tǒng),會(huì)在最后三層之前得到[12x12x512]的輸出, 經(jīng)過上面轉(zhuǎn)化的conv 層會(huì)得到 [6x6x1000], ((12 - 7)/1 + 1 = 6). 我們一下就得出了6x6的分類結(jié)果。
這樣一次得到的比原來(lái)使用迭代36次得到的要快。這是實(shí)際應(yīng)用中的技巧。
另外我們可以用兩次步長(zhǎng)16的卷積層代替一次步長(zhǎng)為32的卷積層來(lái)輸入上面的圖片,提高效率。
3 搭建卷積神經(jīng)網(wǎng)絡(luò)
下面我們就用CONV, POOL,FC ,RELU 搭建一個(gè)卷積神經(jīng)網(wǎng)絡(luò):
3.1 層次結(jié)構(gòu)
我們按照以下結(jié)構(gòu)搭建
INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC- ?
其中N >= 0 (一般N <= 3), M >= 0, K >= 0 (一般K < 3).
這里要注意:我們更傾向于使用多層小size的CONV。
為什么呢?
比如3個(gè)3x3的和一個(gè)7x7的conv層,他們都可以 得到7x7的receptive fields.但是3x3的有以下優(yōu)點(diǎn):
1. 3層的非線性組合要比一層線性組合表達(dá)能力強(qiáng);
2. 3層小尺寸的卷積層的參數(shù)數(shù)量要少,3x3x3<7x7;
3. 反向傳播中我們需要使用更多的內(nèi)存來(lái)儲(chǔ)存中間層結(jié)果。
值得注意的是Google’s Inception architectures 及Residual Networks from Microsoft Research Asia. Both 等創(chuàng)造了相比以上結(jié)構(gòu)更加復(fù)雜的連接結(jié)構(gòu)。
3.2 層的大小
3.3 案例
其中VGG的計(jì)算花費(fèi)為:
- ?
注意到內(nèi)存使用最多的時(shí)候在開始幾個(gè)CONV layers, 參數(shù)基本都在最后幾個(gè)FC層第一個(gè)FC有100M個(gè)!
3.4 內(nèi)存使用
內(nèi)存主要在以下幾個(gè)方面消耗較多
1. 大量的激活值和梯度值。測(cè)試時(shí)可以只儲(chǔ)存當(dāng)前的激活值丟棄之前的在下方幾層激活值會(huì)大大減少激活值的儲(chǔ)存量。
2. 參數(shù)的儲(chǔ)存,在反向傳播時(shí)的梯度及使用 momentum, Adagrad, or RMSProp時(shí)的緩存都會(huì)占用儲(chǔ)存,所以估計(jì)參數(shù)使用的內(nèi)存時(shí)一般至少要乘以3倍
3. 每次網(wǎng)絡(luò)運(yùn)行都要記住各種信息比如圖形數(shù)據(jù)的批量等
如果估計(jì)網(wǎng)絡(luò)需要的內(nèi)存太大,可以適當(dāng)減小圖片的batch,畢竟激活值占用了大量的內(nèi)存空間。
其他資料
?
總結(jié)
以上是生活随笔為你收集整理的2020-12-09 深度学习 卷积神经网络结构分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020-12-09 深度学习 卷积核/
- 下一篇: 2020-12-09 深度学习 经典CN