cnn stride and padding_卷积神经网络(CNN) 第 4 课(上)
點此親啟
致各位
之前感覺深度學習高深莫測,paper中的各種名詞讓人望而生畏,高端落地應用絡繹不絕,說實話有些恐懼,但是當你一點一點地開始接觸它,慢慢了解到每個名詞的含義,心里一句“昂~也不過如此”飄過······
這種撥云見霧的感覺,值得自律。
此致
1 卷積神經(jīng)網(wǎng)絡
1.1 計算機視覺
計算機視覺(Computer Vision)是深度學習應用的主要方向之一。一般的CV問題包括以下三類:- Image Classification
- Object detection
- Neural Style Transfer
使用傳統(tǒng)神經(jīng)網(wǎng)絡處理計算機視覺的一個主要問題是輸入層維度很大。一是導致神經(jīng)網(wǎng)絡結構復雜,數(shù)據(jù)量相對不夠,容易出現(xiàn)過擬合;二是所需內(nèi)存、計算量較大。解決這一問題的方法就是使用卷積神經(jīng)網(wǎng)絡(CNN)。
1.2~1.3 邊緣檢測實例
最常檢測的圖片邊緣有兩類:一是垂直邊緣(vertical edges),二是水平邊緣(horizontal edges)。圖片的邊緣檢測可以通過與相應濾波器進行卷積來實現(xiàn)。除了提到的這種簡單的Vertical、Horizontal濾波器之外,還有其它常用的filters,例如Sobel filter和Scharr filter。這兩種濾波器的特點是增加圖片中心區(qū)域的權重。
上圖展示的是垂直邊緣檢測算子,水平邊緣檢測算子只需將上圖順時針翻轉90度即可。在深度學習中,如果我們想檢測圖片的各種邊緣特征,而不僅限于垂直邊緣和水平邊緣,那么filter的數(shù)值一般需要通過模型訓練得到,類似于標準神經(jīng)網(wǎng)絡中的權重W一樣由梯度下降算法反復迭代求得。CNN的主要目的就是計算出這些filter的數(shù)值。確定得到了這些filter后,CNN淺層網(wǎng)絡也就實現(xiàn)了對圖片所有邊緣特征的檢測。
1.4~1.5 Padding/Strided Convoluitons
按照我們上面講的圖片卷積,如果原始圖片尺寸為n x n,filter尺寸為f x f,則卷積后的圖片尺寸為(n-f+1) x (n-f+1),注意f一般為奇數(shù)。這樣會帶來兩個問題:卷積運算后,輸出圖片尺寸縮小
原始圖片邊緣信息對輸出貢獻得少,輸出圖片丟失邊緣信息
沒有padding操作,即p=0,我們稱之為“Valid convolutions”;有padding操作,p=(f-1)/2,我們稱之為“Same convolutions”。Stride表示filter在原圖片中水平方向和垂直方向每次的步進長度。之前我們默認stride=1。若stride=2,則表示filter每次步進長度為2,即隔一點移動一次。
我們用s表示stride長度,p表示padding長度,如果原始圖片尺寸為n x n,filter尺寸為fx f,則卷積后的圖片尺寸為:
1.6 三維卷積
對于3通道的RGB圖片,其對應的濾波器算子同樣也是3通道的。例如一個圖片是6x6x3,分別表示圖片的高度(height)、寬度(weight)和通道(#channel)。3通道圖片的卷積運算與單通道圖片的卷積運算基本一致。過程是將每個單通道(R,G,B)與對應的filter進行卷積運算求和,然后再將3通道的和相加,得到輸出圖片的一個像素值。為了對同一圖片進行多個卷積運算,實現(xiàn)更多不同類型的邊緣檢測,可以增加更多的濾波器組。例如設置第一個濾波器組實現(xiàn)垂直邊緣檢測,第二個濾波器組實現(xiàn)水平邊緣檢測。這樣,不同濾波器組卷積得到不同的輸出,個數(shù)由濾波器組決定。
1.7~1.8 單層卷積網(wǎng)絡/簡單卷積網(wǎng)絡實例
卷積神經(jīng)網(wǎng)絡的單層結構如下所示:相比之前的卷積過程,CNN的單層結構多了激活函數(shù)ReLU和偏移量b。整個過程與標準的神經(jīng)網(wǎng)絡單層結構非常類似:總結一下CNN單層結構的所有標記符號,設層數(shù)為l:
下面介紹一個簡單的CNN網(wǎng)絡模型:
CNN有三種類型的layer:
1.9 Pooling Layers
Pooling layers是CNN中用來縮減模型大小,提高運算速度,同樣能減小noise影響,提高所提取特征的魯棒性。Pooling layers的做法比convolution layers簡單許多,沒有卷積運算,僅僅是在濾波器算子滑動區(qū)域內(nèi)取最大值,即max pooling,這是最常用的做法。注意,超參數(shù)p很少在pooling layers中使用(p=0)。池化可分為 Max Pooling 和 Average Pooling:Max pooling的好處是只保留區(qū)域內(nèi)的最大值(特征),忽略其它值,降低noise影響,提高模型健壯性。而且,max pooling需要的超參數(shù)僅為濾波器尺寸f和濾波器步長s,沒有其他參數(shù)需要通過模型訓練得到,計算量很小。如果是多個通道,那么每個通道單獨進行max pooling操作。除了max pooling之外,還有一種做法:average pooling。顧名思義,average pooling就是在濾波器算子滑動區(qū)域計算平均值。實際應用中,max pooling比average pooling更為常用。
1.10~1.11 CNN example
圖中,CON層后面緊接一個POOL層,CONV1和POOL1構成第一層,CONV2和POOL2構成第二層。特別注意的是FC3和FC4為全連接層FC,它跟標準的神經(jīng)網(wǎng)絡結構一致。最后的輸出層(softmax)由10個神經(jīng)元構成。相比標準神經(jīng)網(wǎng)絡,CNN的優(yōu)勢之一就是超參數(shù)數(shù)目要少得多。參數(shù)數(shù)目少的原因有兩個:參數(shù)共享:一個特征檢測器(例如垂直邊緣檢測)對圖片某塊區(qū)域有用,同時也可能適用于圖片的其它區(qū)域。稀疏連接:因為濾波器算子尺寸限制,每一層的每個輸出只與輸入的部分區(qū)域有關。除此之外,由于CNN參數(shù)數(shù)目較小,所需的訓練樣本就相對較少,從而一定程度上不容易發(fā)生過擬合現(xiàn)象。而且,CNN比較擅長捕捉區(qū)域位置偏移。也就是說CNN進行物體檢測時,不太受物體所處圖片位置的影響,增加檢測的準確性和系統(tǒng)的健壯性。構建一個圖片分類器的步驟:選定一個卷積神經(jīng)網(wǎng)絡;輸入圖片;增加卷積層、池化層和全連接層;輸出softmax,即y_hat;定義代價函數(shù);訓練神經(jīng)網(wǎng)絡(梯度下降發(fā)、Monmentum、RMSprop、ADam);使得代價參數(shù)最小化,得到參數(shù)W及偏差b的合適值,即完成了一個圖片分類器的神經(jīng)網(wǎng)絡搭建。注:Window, kernel, filterThe words "window", "kernel", and "filter" are used to refer to the same thing. This is why the parameter ksize refers to "kernel size", and we use (f,f) to refer to the filter size. Both "kernel" and "filter" refer to the "window."深度卷積模型:案例分析
2.1 Why look at case studies?
通過對具體CNN模型及案例的研究,來幫助我們理解知識并訓練實際的模型。典型的CNN模型包括:LeNet5 AlexNet VGG 除了這些性能良好的CNN模型之外,我們還會介紹Residual Network(ResNet),其特點是可以構建很深很深的神經(jīng)網(wǎng)絡(目前最深的神經(jīng)網(wǎng)絡有152層);另外,還會介紹Inception Neural Network。2.2 Classic Networks
LeNet5模型是Yann LeCun教授于1998年提出來的,它是第一個成功應用于數(shù)字識別問題的卷積神經(jīng)網(wǎng)絡(該模型是針對灰度圖像訓練的,即輸入圖像數(shù)據(jù)的通道數(shù)為1)。在MNIST數(shù)據(jù)中,它的準確率達到大約99.2%。典型的LeNet5結構包含CONV layer,POOL layer和FC layer,順序一般是CONV layer>POOL layer>CONV layer>POOL layer>FC layer>FC layer>OUTPUT layer,下圖所示的是一個數(shù)字識別的LeNet5的模型結構:
該LeNet模型總共包含了大約6萬個參數(shù)。1998年人們不使用Padding,故沒進行一次卷積,圖像的高度和寬度都會縮小。值得一提的是,當時Yann LeCun提出的LeNet5模型池化層使用的是average pool,而且各層激活函數(shù)一般是Sigmoid和tanh。現(xiàn)在,我們可以根據(jù)需要做出改進,使用max pool和激活函數(shù)ReLU。這種神經(jīng)網(wǎng)絡的模式經(jīng)常用到:一個或多個卷積層后面跟一個池化層,然后又是若干個卷積層再接一個池化層,然后是全連接層,最后是輸出。
AlexNet模型是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同提出的,其結構如下所示:AlexNet模型與LeNet5模型類似,只是要復雜一些,總共包含了大約6千萬個參數(shù)。同樣可以根據(jù)實際情況使用激活函數(shù)ReLU。原作者還提到了一種優(yōu)化技巧,叫做Local Response Normalization(LRN),而在實際應用中,LRN的效果并不突出。對于VGG16,一般情況下,該模型其CONV layer和POOL layer設置如下:
CONV = 3x3 filters, s = 1, same
- MAXPOOL= 2x2, s = 2
VGG16網(wǎng)絡沒有很多超參數(shù),這是一種只需要專注于構件卷積層的簡單網(wǎng)絡。VGG16模型結構如下所示:
VGG16中的16,表示這個網(wǎng)絡中包含16個卷積層和全連接層,總共包含1.38億個參數(shù)。這種網(wǎng)絡結構很規(guī)整,都是幾個卷積層后面跟著可以壓縮圖像大小的池化層,池化層縮小圖像的高度和寬度;同時卷積層的過濾器數(shù)量變化存在一定規(guī)律,由64變?yōu)?28變?yōu)?56變?yōu)?12,即在每一組卷積層進行過濾器翻倍。2.3~2.4 殘差網(wǎng)絡(ResNets/Residual Networks)
由于存在梯度消失和梯度爆炸問題,深度很深的神經(jīng)網(wǎng)絡是很難訓練的。解決方法之一是人為地讓神經(jīng)網(wǎng)絡某些層跳過下一層神經(jīng)元的連接,隔層相連,弱化每層之間的強聯(lián)系,即跳躍連接(skip connection)。用它可以構建能夠訓練深度網(wǎng)絡的ResNets,這種神經(jīng)網(wǎng)絡被稱為Residual Networks(ResNets)。Residual Networks由許多隔層相連的Residual block組成,單個Residual block的結構如下圖所示:
上圖的紅色部分直接建立a[l]與a[l+2]隔層之間的聯(lián)系,相應的表達式為:
a[l]隔層與a[l+1]層的線性輸出相連,與Z[l+2]共同通過激活函數(shù)輸出a[l+2]。該模型由Kaiming He, Xiangyu Zhang, Shaoqing Ren和Jian Sun共同提出。由多個Residual block組成的神經(jīng)網(wǎng)絡就是Residual Network,該網(wǎng)絡結構如下圖:
Residual Network能夠訓練更深層的神經(jīng)網(wǎng)絡,有效避免發(fā)生梯度消失和梯度爆炸問題。
為什么ResNets能夠訓練更深層的神經(jīng)網(wǎng)絡?
?如上圖所示,輸入X經(jīng)過Big NN輸出為a[l],a[l]經(jīng)過一個Residual block輸出a[l+2],其中
如果使用L2正則化或權重衰減,它會壓縮W[l+2]的值,假設b[l+2]=0,則有?
可以看出,即使發(fā)生了梯度消失,即W[l+2]=0,b[l+2]=0,也能直接建立a[l+2]與a[l]的線性關系,這就是恒等函數(shù)。a[l]直接連到a[l+2],從效果來說,相當于直接忽略了之后的這兩層神經(jīng)層。這樣,看似很深的神經(jīng)網(wǎng)絡,其實由于許多Residual blocks的存在,弱化削減了某些神經(jīng)層之間的聯(lián)系,實現(xiàn)隔層線性傳遞,而不是一味追求非線性關系,模型本身也就能“容忍”更深層的神經(jīng)網(wǎng)絡了。而且從性能上來說,這兩層額外的Residual blocks也不會降低Big NN的性能。當然,如果Residual blocks確實能訓練得到非線性關系,那么也會忽略short cut,跟普通深度網(wǎng)絡起到同樣的效果。有一點需要注意的是,如果Residual blocks中a[l]和a[l+2]的維度不同,通常可以引入矩陣Ws,與a[l]相乘,使得Ws*a[l]的維度與a[l+2]一致。參數(shù)矩陣有來兩種方法得到:一種是將作為學習參數(shù),通過模型訓練得到;另一種是固定值(類似單位矩陣),不需要訓練,Ws與a[l]的乘積僅僅使得a[l]截斷或者補零。
2.5 1x1卷積
1x1卷積,也稱Networks in Networks,其濾波器算子filter的維度為1x1。對于單個filter,1x1的維度,意味著卷積操作等同于乘積操作,如下:對于多通道輸入,1x1卷積的過濾器維度為1x1xnc,可以理解為輸入層中的某個切片用過濾器中的nc個數(shù)字相乘,得到一個實數(shù),可以把filter中的nc個數(shù)字理解為對于這個切片的權重,然后對實數(shù)應用ReLU非線性函數(shù),輸出相應結果,而通過改變使用的1x1過濾器的數(shù)量,即可改變輸入數(shù)據(jù)的通道數(shù)維度,這是一種很好的壓縮通道數(shù)的方法(池化只能壓縮圖片的高度和寬度)。2.6~2.7 谷歌Inception網(wǎng)絡簡介
之前介紹的CNN單層的濾波算子filter尺寸是固定的,1x1或者3x3等,而Inception Network在單層網(wǎng)絡上可以使用多個不同尺寸的filters,通過Padding使各filer的輸出的高度和寬度維度相同,把各filter下得到的輸出拼接起來。除此之外,還可以將CONV layer與POOL layer混合,同時實現(xiàn)各種效果,但是要注意使用same pool。?與其它只選擇單一尺寸和功能的filter不同,Inception Network使用不同尺寸的filters并將CONV和POOL混合起來,將所有功能輸出組合拼接,再由神經(jīng)網(wǎng)絡本身去學習參數(shù)并選擇最好的模塊。多種不同尺寸的filters進行卷積時,需要很大的計算量,此時通過1x1 卷積可以極大減小數(shù)據(jù)的計算量。?通常我們把該1x1 Convolution稱為“瓶頸層”(bottleneck layer)。引入bottleneck layer之后,總共需要的計算量為:28x28x16x192+28x28x32x5x5x16=12.4m。明顯地,雖然多引入了1x1 Convolution層,但是總共的計算量減少了近90%。由此可見,1x1 Convolutions可以有效減少CONV layer的計算量。通過使用1x1 Convolution可以減少Inception Network巨大的計算量,引入1x1 Convolution后的Inception module如下圖所示:
Inception網(wǎng)絡是將Inception module在不同位置重復組成的網(wǎng)絡,該網(wǎng)絡是由Google公司研發(fā)的,同時它也被叫做GoogleNet,這個名字是為了向LeNet網(wǎng)絡致敬,同時也體現(xiàn)了深度學習研究人員對彼此的工作成果有強烈的敬意。
上述Inception Network除了由許多Inception modules組成之外,網(wǎng)絡中間隱藏層也可以作為輸出層Softmax,起到調(diào)整的效果,有利于防止發(fā)生過擬合。
2.8 使用開源的實現(xiàn)方案
說白了就是在構建自己的神經(jīng)網(wǎng)絡模型時,選用一定的架構后去Github上搜索別人已經(jīng)訓練好的模型,Download之后,對應自己的進行修改輸出等部分,這樣的工作流程不論是對于計算量、訓練數(shù)據(jù)集的大小以及工作效率都會有很大提升。
2.9 遷移學習
通過遷移學習將公共的數(shù)據(jù)集的知識遷移到你自己的網(wǎng)絡中,可以是別人已經(jīng)訓練好網(wǎng)絡結構的權重,相比于自己從隨機初始化權重開始,會極大提升工作效率。如果我們的訓練集較少,則可以不僅僅下載代碼,還可以將訓練好的權重下載下來,比如改變最后的輸出層的輸出模式,僅僅利用少量的訓練集訓練與輸出模式中有關的參數(shù)即可。即使只有一個小的數(shù)據(jù)集,通過使用其他人預訓練的權重,可能得到很好的網(wǎng)絡性能。如果我們有一個更大的訓練集,我們可以將Down來的神經(jīng)網(wǎng)絡與輸出相連接的幾層隱藏層通過訓練來改變其權重,而前一部分的權重仍保持不變。有一個規(guī)律,你所擁有的訓練集越多,你需要凍結的層數(shù)越少, 你能夠訓練的層數(shù)就越多。2.10 數(shù)據(jù)擴充
大部分計算機視覺任務目前的主要問題是沒有辦法獲得充足的數(shù)據(jù),故Data Augmentation是經(jīng)常使用的一種技巧來擴充數(shù)據(jù)集。常用的Data Augmentation方法是對已有的樣本集進行Mirroring、Random Cropping、Rotation、Local warping:另一種Data Augmentation的方法是color shifting。color shiftin就是對圖片的RGB通道數(shù)值進行隨意增加或者減少,改變圖片色調(diào)。?除了隨意改變RGB通道數(shù)值外,還可以更有針對性地對圖片的RGB通道進行PCA color augmentation,也就是對圖片顏色進行主成分分析,對主要的通道顏色進行增加或減少,可以采用高斯擾動做法。這樣也能增加有效的樣本數(shù)量。具體的PCA color augmentation做法可以查閱AlexNet的相關論文。最后提一下,在構建大型神經(jīng)網(wǎng)絡的時候,data augmentation和training可以由兩個不同的線程并行完成。
2.11 計算機視覺現(xiàn)狀
神經(jīng)網(wǎng)絡需要數(shù)據(jù)集來完成訓練,不同的網(wǎng)絡模型所需的數(shù)據(jù)量是不同的。Object dection,Imagerecognition,Speech recognition所需的數(shù)據(jù)量依次增加。一般來說,如果data較少,那么就需要更多的hand-engineering,對已有data進行處理,比如上一節(jié)介紹的data augmentation。模型算法也會相對要復雜一些。如果data很多,可以構建深層神經(jīng)網(wǎng)絡,不需要太多的hand engineering,模型算法也就相對簡單一些。
值得一提的是hand-engineering是一項非常重要也比較困難的工作。很多時候,hand-engineering對模型訓練效果影響很大,特別是在數(shù)據(jù)量不多的情況下。在模型研究或者競賽方面,有一些方法能夠有助于提升神經(jīng)網(wǎng)絡模型的性能
Ensembling: Train several networks independently and average their outputs.
- Multicrop at test time: Run classifier on multiple versions of test images and average results. pic 24
但是由于這兩種方法計算成本較大,一般不適用于實際項目開發(fā)。最后,我們還要靈活使用開源代碼:
Use archittectures of networks published in the literature
Use open source implementations if possible
Use pretrained models and fine-tune on your dataset
Very deep "plain" networks don't work in practice because they are hard to train due to vanishing gradients.
The skip-connections help to address the Vanishing Gradient problem.
They also make it easy for a ResNet block to learn an identity function.
There are two main types of blocks: The identity block and the convolutional block.?
Very deep Residual Networks are built by stacking these blocks together
最后的最后
最后,通過assignment中的ResNets網(wǎng)絡來識別之前發(fā)生過擬合的下圖,發(fā)現(xiàn)結果還是FALSE。上一次測試的普通神經(jīng)網(wǎng)絡的深度為3,而此次使用了50層的ResNets網(wǎng)絡,即使使用了更深的網(wǎng)絡仍未得到正確結果。個人總結為并不是訓練過程中發(fā)生了過擬合,而是所有訓練網(wǎng)絡的訓練集圖片背景均比較明亮且無黑影,而這張測試圖片的黑影較為明顯且已經(jīng)對結果造成了影響。
寫留言
球分享
球點贊
球在看
總結
以上是生活随笔為你收集整理的cnn stride and padding_卷积神经网络(CNN) 第 4 课(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: string 换行符_Java 11 已
- 下一篇: cache-control_网站 cac