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