-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
如何設(shè)計(jì)卷積神經(jīng)網(wǎng)絡(luò)(如何設(shè)計(jì)卷積神經(jīng)網(wǎng)絡(luò)方案)
大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于如何設(shè)計(jì)卷積神經(jīng)網(wǎng)絡(luò)的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。
開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、深度學(xué)習(xí)之卷積神經(jīng)網(wǎng)絡(luò)經(jīng)典模型
LeNet-5模型 在CNN的應(yīng)用中,文字識(shí)別系統(tǒng)所用的LeNet-5模型是非常經(jīng)典的模型。LeNet-5模型是1998年,Yann LeCun教授提出的,它是第一個(gè)成功大規(guī)模應(yīng)用在手寫數(shù)字識(shí)別問(wèn)題的卷積神經(jīng)網(wǎng)絡(luò),在MNIST數(shù)據(jù)集中的正確率可以高達(dá)99.2%。
下面詳細(xì)介紹一下LeNet-5模型工作的原理。
LeNet-5模型一共有7層,每層包含眾多參數(shù),也就是卷積神經(jīng)網(wǎng)絡(luò)中的參數(shù)。雖然層數(shù)只有7層,這在如今龐大的神經(jīng)網(wǎng)絡(luò)中可是說(shuō)是非常少的了,但是包含了卷積層,池化層,全連接層,可謂麻雀雖小五臟俱全了。為了方便,我們把卷積層稱為C層,下采樣層叫做下采樣層。
首先,輸入層輸入原始圖像,原始圖像被處理成32×32個(gè)像素點(diǎn)的值。然后,后面的隱層計(jì)在卷積和子抽樣之間交替進(jìn)行。C1層是卷積層,包含了六個(gè)特征圖。每個(gè)映射也就是28x28個(gè)神經(jīng)元。卷積核可以是5x5的十字形,這28×28個(gè)神經(jīng)元共享卷積核權(quán)值參數(shù),通過(guò)卷積運(yùn)算,原始信號(hào)特征增強(qiáng),同時(shí)也降低了噪聲,當(dāng)卷積核不同時(shí),提取到圖像中的特征不同;C2層是一個(gè)池化層,池化層的功能在上文已經(jīng)介紹過(guò)了,它將局部像素值平均化來(lái)實(shí)現(xiàn)子抽樣。
池化層包含了六個(gè)特征映射,每個(gè)映射的像素值為14x14,這樣的池化層非常重要,可以在一定程度上保證網(wǎng)絡(luò)的特征被提取,同時(shí)運(yùn)算量也大大降低,減少了網(wǎng)絡(luò)結(jié)構(gòu)過(guò)擬合的風(fēng)險(xiǎn)。因?yàn)榫矸e層與池化層是交替出現(xiàn)的,所以隱藏層的第三層又是一個(gè)卷積層,第二個(gè)卷積層由16個(gè)特征映射構(gòu)成,每個(gè)特征映射用于加權(quán)和計(jì)算的卷積核為10x10的。第四個(gè)隱藏層,也就是第二個(gè)池化層同樣包含16個(gè)特征映射,每個(gè)特征映射中所用的卷積核是5x5的。第五個(gè)隱藏層是用5x5的卷積核進(jìn)行運(yùn)算,包含了120個(gè)神經(jīng)元,也是這個(gè)網(wǎng)絡(luò)中卷積運(yùn)算的最后一層。
之后的第六層便是全連接層,包含了84個(gè)特征圖。全連接層中對(duì)輸入進(jìn)行點(diǎn)積之后加入偏置,然后經(jīng)過(guò)一個(gè)激活函數(shù)傳輸給輸出層的神經(jīng)元。最后一層,也就是第七層,為了得到輸出向量,設(shè)置了十個(gè)神經(jīng)元來(lái)進(jìn)行分類,相當(dāng)于輸出一個(gè)包含十個(gè)元素的一維數(shù)組,向量中的十個(gè)元素即0到9。
AlexNet模型
AlexNet簡(jiǎn)介
2012年Imagenet圖像識(shí)別大賽中,Alext提出的alexnet網(wǎng)絡(luò)模型一鳴驚人,引爆了神經(jīng)網(wǎng)絡(luò)的應(yīng)用熱潮,并且贏得了2012屆圖像識(shí)別大賽的冠軍,這也使得卷積神經(jīng)網(wǎng)絡(luò)真正意義上成為圖像處理上的核心算法。上文介紹的LeNet-5出現(xiàn)在上個(gè)世紀(jì),雖然是經(jīng)典,但是迫于種種復(fù)雜的現(xiàn)實(shí)場(chǎng)景限制,只能在一些領(lǐng)域應(yīng)用。不過(guò),隨著SVM等手工設(shè)計(jì)的特征的飛速發(fā)展,LeNet-5并沒有形成很大的應(yīng)用狀況。隨著ReLU與dropout的提出,以及GPU帶來(lái)算力突破和互聯(lián)網(wǎng)時(shí)代大數(shù)據(jù)的爆發(fā),卷積神經(jīng)網(wǎng)絡(luò)帶來(lái)歷史的突破,AlexNet的提出讓深度學(xué)習(xí)走上人工智能的最前端。
圖像預(yù)處理
AlexNet的訓(xùn)練數(shù)據(jù)采用ImageNet的子集中的ILSVRC2010數(shù)據(jù)集,包含了1000類,共1.2百萬(wàn)的訓(xùn)練圖像,50000張驗(yàn)證集,150000張測(cè)試集。在進(jìn)行網(wǎng)絡(luò)訓(xùn)練之前我們要對(duì)數(shù)據(jù)集圖片進(jìn)行預(yù)處理。首先我們要將不同分辨率的圖片全部變成256x256規(guī)格的圖像,變換方法是將圖片的短邊縮放到 256像素值,然后截取長(zhǎng)邊的中間位置的256個(gè)像素值,得到256x256大小的圖像。除了對(duì)圖片大小進(jìn)行預(yù)處理,還需要對(duì)圖片減均值,一般圖像均是由RGB三原色構(gòu)成,均值按RGB三分量分別求得,由此可以更加突出圖片的特征,更方便后面的計(jì)算。
此外,對(duì)了保證訓(xùn)練的效果,我們?nèi)孕鑼?duì)訓(xùn)練數(shù)據(jù)進(jìn)行更為嚴(yán)苛的處理。在256x256大小的圖像中,截取227x227大小的圖像,在此之后對(duì)圖片取鏡像,這樣就使得原始數(shù)據(jù)增加了(256-224)x(256-224)x2= 2048倍。最后對(duì)RGB空間做PCA,然后對(duì)主成分做(0,0.1)的高斯擾動(dòng),結(jié)果使錯(cuò)誤率下降1%。對(duì)測(cè)試數(shù)據(jù)而言,抽取以圖像4個(gè)角落的大小為224224的圖像,中心的224224大小的圖像以及它們的鏡像翻轉(zhuǎn)圖像,這樣便可以獲得10張圖像,我們便可以利用softmax進(jìn)行預(yù)測(cè),對(duì)所有預(yù)測(cè)取平均作為最終的分類結(jié)果。
ReLU激活函數(shù)
之前我們提到常用的非線性的激活函數(shù)是sigmoid,它能夠把輸入的連續(xù)實(shí)值全部確定在0和1之間。但是這帶來(lái)一個(gè)問(wèn)題,當(dāng)一個(gè)負(fù)數(shù)的絕對(duì)值很大時(shí),那么輸出就是0;如果是絕對(duì)值非常大的正數(shù),輸出就是1。這就會(huì)出現(xiàn)飽和的現(xiàn)象,飽和現(xiàn)象中神經(jīng)元的梯度會(huì)變得特別小,這樣必然會(huì)使得網(wǎng)絡(luò)的學(xué)習(xí)更加困難。此外,sigmoid的output的值并不是0為均值,因?yàn)檫@會(huì)導(dǎo)致上一層輸出的非0均值信號(hào)會(huì)直接輸入到后一層的神經(jīng)元上。所以AlexNet模型提出了ReLU函數(shù),公式:f(x)=max(0,x)f(x)=max(0,x)。
用ReLU代替了Sigmoid,發(fā)現(xiàn)使用 ReLU 得到的SGD的收斂速度會(huì)比 sigmoid快很多,這成了AlexNet模型的優(yōu)勢(shì)之一。
Dropout
AlexNet模型提出了一個(gè)有效的模型組合方式,相比于單模型,只需要多花費(fèi)一倍的時(shí)間,這種方式就做Dropout。在整個(gè)神經(jīng)網(wǎng)絡(luò)中,隨機(jī)選取一半的神經(jīng)元將它們的輸出變成0。這種方式使得網(wǎng)絡(luò)關(guān)閉了部分神經(jīng)元,減少了過(guò)擬合現(xiàn)象。同時(shí)訓(xùn)練的迭代次數(shù)也得以增加。當(dāng)時(shí)一個(gè)GTX580 GPU只有3GB內(nèi)存,這使得大規(guī)模的運(yùn)算成為不可能。但是,隨著硬件水平的發(fā)展,當(dāng)時(shí)的GPU已經(jīng)可以實(shí)現(xiàn)并行計(jì)算了,并行計(jì)算之后兩塊GPU可以互相通信傳輸數(shù)據(jù),這樣的方式充分利用了GPU資源,所以模型設(shè)計(jì)利用兩個(gè)GPU并行運(yùn)算,大大提高了運(yùn)算效率。
模型分析
AlexNet模型共有8層結(jié)構(gòu),其中前5層為卷積層,其中前兩個(gè)卷積層和第五個(gè)卷積層有池化層,其他卷積層沒有。后面3層為全連接層,神經(jīng)元約有六十五萬(wàn)個(gè),所需要訓(xùn)練的參數(shù)約六千萬(wàn)個(gè)。
圖片預(yù)處理過(guò)后,進(jìn)過(guò)第一個(gè)卷積層C1之后,原始的圖像也就變成了55x55的像素大小,此時(shí)一共有96個(gè)通道。模型分為上下兩塊是為了方便GPU運(yùn)算,48作為通道數(shù)目更加適合GPU的并行運(yùn)算。上圖的模型里把48層直接變成了一個(gè)面,這使得模型看上去更像一個(gè)立方體,大小為55x55x48。在后面的第二個(gè)卷積層C2中,卷積核的尺寸為5x5x48,由此再次進(jìn)行卷積運(yùn)算。在C1,C2卷積層的卷積運(yùn)算之后,都會(huì)有一個(gè)池化層,使得提取特征之后的特征圖像素值大大減小,方便了運(yùn)算,也使得特征更加明顯。而第三層的卷積層C3又是更加特殊了。第三層卷積層做了通道的合并,將之前兩個(gè)通道的數(shù)據(jù)再次合并起來(lái),這是一種串接操作。第三層后,由于串接,通道數(shù)變成256。全卷積的卷積核尺寸也就變成了13×13×25613×13×256。一個(gè)有4096個(gè)這樣尺寸的卷積核分別對(duì)輸入圖像做4096次的全卷積操作,最后的結(jié)果就是一個(gè)列向量,一共有4096個(gè)數(shù)。這也就是最后的輸出,但是AlexNet最終是要分1000個(gè)類,所以通過(guò)第八層,也就是全連接的第三層,由此得到1000個(gè)類輸出。
Alexnet網(wǎng)絡(luò)中各個(gè)層發(fā)揮了不同的作用,ReLU,多個(gè)CPU是為了提高訓(xùn)練速度,重疊pool池化是為了提高精度,且不容易產(chǎn)生過(guò)擬合,局部歸一化響應(yīng)是為了提高精度,而數(shù)據(jù)增益與dropout是為了減少過(guò)擬合。
VGG net
在ILSVRC-2014中,牛津大學(xué)的視覺幾何組提出的VGGNet模型在定位任務(wù)第一名和分類任務(wù)第一名[[i]]。如今在計(jì)算機(jī)視覺領(lǐng)域,卷積神經(jīng)網(wǎng)絡(luò)的良好效果深得廣大開發(fā)者的喜歡,并且上文提到的AlexNet模型擁有更好的效果,所以廣大從業(yè)者學(xué)習(xí)者試圖將其改進(jìn)以獲得更好地效果。而后來(lái)很多人經(jīng)過(guò)驗(yàn)證認(rèn)為,AlexNet模型中所謂的局部歸一化響應(yīng)浪費(fèi)了計(jì)算資源,但是對(duì)性能卻沒有很大的提升。VGG的實(shí)質(zhì)是AlexNet結(jié)構(gòu)的增強(qiáng)版,它側(cè)重強(qiáng)調(diào)卷積神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)中的深度。將卷積層的深度提升到了19層,并且在當(dāng)年的ImageNet大賽中的定位問(wèn)題中獲得了第一名的好成績(jī)。整個(gè)網(wǎng)絡(luò)向人們證明了我們是可以用很小的卷積核取得很好地效果,前提是我們要把網(wǎng)絡(luò)的層數(shù)加深,這也論證了我們要想提高整個(gè)神經(jīng)網(wǎng)絡(luò)的模型效果,一個(gè)較為有效的方法便是將它的深度加深,雖然計(jì)算量會(huì)大大提高,但是整個(gè)復(fù)雜度也上升了,更能解決復(fù)雜的問(wèn)題。雖然VGG網(wǎng)絡(luò)已經(jīng)誕生好幾年了,但是很多其他網(wǎng)絡(luò)上效果并不是很好地情況下,VGG有時(shí)候還能夠發(fā)揮它的優(yōu)勢(shì),讓人有意想不到的收獲。
與AlexNet網(wǎng)絡(luò)非常類似,VGG共有五個(gè)卷積層,并且每個(gè)卷積層之后都有一個(gè)池化層。當(dāng)時(shí)在ImageNet大賽中,作者分別嘗試了六種網(wǎng)絡(luò)結(jié)構(gòu)。這六種結(jié)構(gòu)大致相同,只是層數(shù)不同,少則11層,多達(dá)19層。網(wǎng)絡(luò)結(jié)構(gòu)的輸入是大小為224*224的RGB圖像,最終將分類結(jié)果輸出。當(dāng)然,在輸入網(wǎng)絡(luò)時(shí),圖片要進(jìn)行預(yù)處理。
VGG網(wǎng)絡(luò)相比AlexNet網(wǎng)絡(luò),在網(wǎng)絡(luò)的深度以及寬度上做了一定的拓展,具體的卷積運(yùn)算還是與AlexNet網(wǎng)絡(luò)類似。我們主要說(shuō)明一下VGG網(wǎng)絡(luò)所做的改進(jìn)。第一點(diǎn),由于很多研究者發(fā)現(xiàn)歸一化層的效果并不是很好,而且占用了大量的計(jì)算資源,所以在VGG網(wǎng)絡(luò)中作者取消了歸一化層;第二點(diǎn),VGG網(wǎng)絡(luò)用了更小的3x3的卷積核,而兩個(gè)連續(xù)的3x3的卷積核相當(dāng)于5x5的感受野,由此類推,三個(gè)3x3的連續(xù)的卷積核也就相當(dāng)于7x7的感受野。這樣的變化使得參數(shù)量更小,節(jié)省了計(jì)算資源,將資源留給后面的更深層次的網(wǎng)絡(luò)。第三點(diǎn)是VGG網(wǎng)絡(luò)中的池化層特征池化核改為了2x2,而在AlexNet網(wǎng)絡(luò)中池化核為3x3。這三點(diǎn)改進(jìn)無(wú)疑是使得整個(gè)參數(shù)運(yùn)算量下降,這樣我們?cè)谟邢薜挠?jì)算平臺(tái)上能夠獲得更多的資源留給更深層的網(wǎng)絡(luò)。由于層數(shù)較多,卷積核比較小,這樣使得整個(gè)網(wǎng)絡(luò)的特征提取效果很好。其實(shí)由于VGG的層數(shù)較多,所以計(jì)算量還是相當(dāng)大的,卷積層比較多成了它最顯著的特點(diǎn)。另外,VGG網(wǎng)絡(luò)的拓展性能比較突出,結(jié)構(gòu)比較簡(jiǎn)潔,所以它的遷移性能比較好,遷移到其他數(shù)據(jù)集的時(shí)候泛化性能好。到現(xiàn)在為止,VGG網(wǎng)絡(luò)還經(jīng)常被用來(lái)提出特征。所以當(dāng)現(xiàn)在很多較新的模型效果不好時(shí),使用VGG可能會(huì)解決這些問(wèn)題。
GoogleNet
谷歌于2014年Imagenet挑戰(zhàn)賽(ILSVRC14)憑借GoogleNet再次斬獲第一名。這個(gè)通過(guò)增加了神經(jīng)網(wǎng)絡(luò)的深度和寬度獲得了更好地效果,在此過(guò)程中保證了計(jì)算資源的不變。這個(gè)網(wǎng)絡(luò)論證了加大深度,寬度以及訓(xùn)練數(shù)據(jù)的增加是現(xiàn)有深度學(xué)習(xí)獲得更好效果的主要方式。但是增加尺寸可能會(huì)帶來(lái)過(guò)擬合的問(wèn)題,因?yàn)樯疃扰c寬度的加深必然會(huì)帶來(lái)過(guò)量的參數(shù)。此外,增加網(wǎng)絡(luò)尺寸也帶來(lái)了對(duì)計(jì)算資源侵占過(guò)多的缺點(diǎn)。為了保證計(jì)算資源充分利用的前提下去提高整個(gè)模型的性能,作者使用了Inception模型,這個(gè)模型在下圖中有展示,可以看出這個(gè)有點(diǎn)像金字塔的模型在寬度上使用并聯(lián)的不同大小的卷積核,增加了卷積核的輸出寬度。因?yàn)槭褂昧溯^大尺度的卷積核增加了參數(shù)。使用了1*1的卷積核就是為了使得參數(shù)的數(shù)量最少。
Inception模塊
上圖表格為網(wǎng)絡(luò)分析圖,第一行為卷積層,輸入為224×224×3 ,卷積核為7x7,步長(zhǎng)為2,padding為3,輸出的維度為112×112×64,這里面的7x7卷積使用了 7×1 然后 1×7 的方式,這樣便有(7+7)×64×3=2,688個(gè)參數(shù)。第二行為池化層,卷積核為3×33×3,滑動(dòng)步長(zhǎng)為2,padding為 1 ,輸出維度:56×56×64,計(jì)算方式:1/2×(112+2×1?3+1)=56。第三行,第四行與第一行,第二行類似。第 5 行 Inception module中分為4條支線,輸入均為上層產(chǎn)生的 28×28×192 結(jié)果:第 1 部分,1×1 卷積層,輸出大小為28×28×64;第 2 部分,先1×1卷積層,輸出大小為28×28×96,作為輸入進(jìn)行3×3卷積層,輸出大小為28×28×128;第 3部分,先1×1卷積層,輸出大小為28×28×32,作為輸入進(jìn)行3×3卷積層,輸出大小為28×28×32;而第3 部分3×3的池化層,輸出大小為輸出大小為28×28×32。第5行的Inception module會(huì)對(duì)上面是個(gè)結(jié)果的輸出結(jié)果并聯(lián),由此增加網(wǎng)絡(luò)寬度。
ResNet
2015年ImageNet大賽中,MSRA何凱明團(tuán)隊(duì)的ResidualNetworks力壓群雄,在ImageNet的諸多領(lǐng)域的比賽中上均獲得了第一名的好成績(jī),而且這篇關(guān)于ResNet的論文Deep Residual Learning for Image Recognition也獲得了CVPR2016的最佳論文,實(shí)至而名歸。
上文介紹了的VGG以及GoogleNet都是增加了卷積神經(jīng)網(wǎng)絡(luò)的深度來(lái)獲得更好效果,也讓人們明白了網(wǎng)絡(luò)的深度與廣度決定了訓(xùn)練的效果。但是,與此同時(shí),寬度與深度加深的同時(shí),效果實(shí)際會(huì)慢慢變差。也就是說(shuō)模型的層次加深,錯(cuò)誤率提高了。模型的深度加深,以一定的錯(cuò)誤率來(lái)?yè)Q取學(xué)習(xí)能力的增強(qiáng)。但是深層的神經(jīng)網(wǎng)絡(luò)模型犧牲了大量的計(jì)算資源,學(xué)習(xí)能力提高的同時(shí)不應(yīng)當(dāng)產(chǎn)生比淺層神經(jīng)網(wǎng)絡(luò)更高的錯(cuò)誤率。這個(gè)現(xiàn)象的產(chǎn)生主要是因?yàn)殡S著神經(jīng)網(wǎng)絡(luò)的層數(shù)增加,梯度消失的現(xiàn)象就越來(lái)越明顯。所以為了解決這個(gè)問(wèn)題,作者提出了一個(gè)深度殘差網(wǎng)絡(luò)的結(jié)構(gòu)Residual:
上圖就是殘差網(wǎng)絡(luò)的基本結(jié)構(gòu),可以看出其實(shí)是增加了一個(gè)恒等映射,將原本的變換函數(shù)H(x)轉(zhuǎn)換成了F(x)+x。示意圖中可以很明顯看出來(lái)整個(gè)網(wǎng)絡(luò)的變化,這樣網(wǎng)絡(luò)不再是簡(jiǎn)單的堆疊結(jié)構(gòu),這樣的話便很好地解決了由于網(wǎng)絡(luò)層數(shù)增加而帶來(lái)的梯度原來(lái)越不明顯的問(wèn)題。所以這時(shí)候網(wǎng)絡(luò)可以做得很深,到目前為止,網(wǎng)絡(luò)的層數(shù)都可以上千層,而能夠保證很好地效果。并且,這樣的簡(jiǎn)單疊加并沒有給網(wǎng)絡(luò)增加額外的參數(shù)跟計(jì)算量,同時(shí)也提高了網(wǎng)絡(luò)訓(xùn)練的效果與效率。
在比賽中,為了證明自己觀點(diǎn)是正確的,作者控制變量地設(shè)計(jì)幾個(gè)實(shí)驗(yàn)。首先作者構(gòu)建了兩個(gè)plain網(wǎng)絡(luò),這兩個(gè)網(wǎng)絡(luò)分別為18層跟34層,隨后作者又設(shè)計(jì)了兩個(gè)殘差網(wǎng)絡(luò),層數(shù)也是分別為18層和34層。然后對(duì)這四個(gè)模型進(jìn)行控制變量的實(shí)驗(yàn)觀察數(shù)據(jù)量的變化。下圖便是實(shí)驗(yàn)結(jié)果。實(shí)驗(yàn)中,在plain網(wǎng)絡(luò)上觀測(cè)到明顯的退化現(xiàn)象。實(shí)驗(yàn)結(jié)果也表明,在殘差網(wǎng)絡(luò)上,34層的效果明顯要好于18層的效果,足以證明殘差網(wǎng)絡(luò)隨著層數(shù)增加性能也是增加的。不僅如此,殘差網(wǎng)絡(luò)的在更深層的結(jié)構(gòu)上收斂性能也有明顯的提升,整個(gè)實(shí)驗(yàn)大為成功。
除此之外,作者還做了關(guān)于shortcut方式的實(shí)驗(yàn),如果殘差網(wǎng)絡(luò)模塊的輸入輸出維度不一致,我們?nèi)绻咕S度統(tǒng)一,必須要對(duì)維數(shù)較少的進(jìn)行増維。而增維的最好效果是用0來(lái)填充。不過(guò)實(shí)驗(yàn)數(shù)據(jù)顯示三者差距很小,所以線性投影并不是特別需要。使用0來(lái)填充維度同時(shí)也保證了模型的復(fù)雜度控制在比較低的情況下。
隨著實(shí)驗(yàn)的深入,作者又提出了更深的殘差模塊。這種模型減少了各個(gè)層的參數(shù)量,將資源留給更深層數(shù)的模型,在保證復(fù)雜度很低的情況下,模型也沒有出現(xiàn)梯度消失很明顯的情況,因此目前模型最高可達(dá)1202層,錯(cuò)誤率仍然控制得很低。但是層數(shù)如此之多也帶來(lái)了過(guò)擬合的現(xiàn)象,不過(guò)諸多研究者仍在改進(jìn)之中,畢竟此時(shí)的ResNet已經(jīng)相對(duì)于其他模型在性能上遙遙領(lǐng)先了。
殘差網(wǎng)絡(luò)的精髓便是shortcut。從一個(gè)角度來(lái)看,也可以解讀為多種路徑組合的一個(gè)網(wǎng)絡(luò)。如下圖:
ResNet可以做到很深,但是從上圖中可以體會(huì)到,當(dāng)網(wǎng)絡(luò)很深,也就是層數(shù)很多時(shí),數(shù)據(jù)傳輸?shù)穆窂狡鋵?shí)相對(duì)比較固定。我們似乎也可以將其理解為一個(gè)多人投票系統(tǒng),大多數(shù)梯度都分布在論文中所謂的effective path上。
DenseNet
在Resnet模型之后,有人試圖對(duì)ResNet模型進(jìn)行改進(jìn),由此便誕生了ResNeXt模型。
這是對(duì)上面介紹的ResNet模型結(jié)合了GoogleNet中的inception模塊思想,相比于Resnet來(lái)說(shuō)更加有效。隨后,誕生了DenseNet模型,它直接將所有的模塊連接起來(lái),整個(gè)模型更加簡(jiǎn)單粗暴。稠密相連成了它的主要特點(diǎn)。
我們將DenseNet與ResNet相比較:
從上圖中可以看出,相比于ResNet,DenseNet參數(shù)量明顯減少很多,效果也更加優(yōu)越,只是DenseNet需要消耗更多的內(nèi)存。
總結(jié)
上面介紹了卷積神經(jīng)網(wǎng)絡(luò)發(fā)展史上比較著名的一些模型,這些模型非常經(jīng)典,也各有優(yōu)勢(shì)。在算力不斷增強(qiáng)的現(xiàn)在,各種新的網(wǎng)絡(luò)訓(xùn)練的效率以及效果也在逐漸提高。從收斂速度上看,VGG>Inception>DenseNet>ResNet,從泛化能力來(lái)看,Inception>DenseNet=ResNet>VGG,從運(yùn)算量看來(lái),Inception<DenseNet< ResNet<VGG,從內(nèi)存開銷來(lái)看,Inception<ResNet< DenseNet<VGG。在本次研究中,我們對(duì)各個(gè)模型均進(jìn)行了分析,但從效果來(lái)看,ResNet效果是最好的,優(yōu)于Inception,優(yōu)于VGG,所以我們第四章實(shí)驗(yàn)中主要采用谷歌的Inception模型,也就是GoogleNet。
二、卷積層在神經(jīng)網(wǎng)絡(luò)中如何運(yùn)算?
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks, CNN)的核心是進(jìn)行卷積運(yùn)算操作。在實(shí)際應(yīng)用中往往采用多層網(wǎng)絡(luò)結(jié)構(gòu),因此又被稱為深度卷積神經(jīng)網(wǎng)絡(luò)。本文將從單個(gè)卷積的計(jì)算出發(fā),帶大家掌握卷積層在神經(jīng)網(wǎng)絡(luò)中的運(yùn)算方法。
2.1 單個(gè)卷積的計(jì)算
要想了解卷積層在神經(jīng)網(wǎng)絡(luò)中的計(jì)算過(guò)程,我們首先需要了解單個(gè)“卷積”是如何運(yùn)作的。
想必大家在學(xué)習(xí)CNN的過(guò)程中都見過(guò)下圖( 出處在此 ,這上面有各種各樣的卷積gif圖):
input_shape=(5,5),kernelsize=(3,3),padding=‘same’,stride=1,output_shape=(5,5)
在此圖中:
在此次計(jì)算中:
Ps: 在實(shí)際應(yīng)用中,每一個(gè)輸出的特征圖還會(huì)配備一個(gè)偏置bais,在上圖中無(wú)表示。
2.2 卷積層在神經(jīng)網(wǎng)絡(luò)中的運(yùn)算
了解完單個(gè)卷積是如何計(jì)算的之后,我們就可以從神經(jīng)網(wǎng)絡(luò)的角度來(lái)看‘卷積層’的運(yùn)算過(guò)程了。下圖展示的是輸入三通圖像(8*8*3)經(jīng)一層卷積結(jié)構(gòu),輸出兩通特征圖(8*8*2)的計(jì)算過(guò)程:
卷積參數(shù):input_shape=(8,8,3),kernelsize=(3,3),padding=‘same’,stride=1,output_shape=(8,8,2)
在此圖中:
在此次卷積層的運(yùn)算中:
首先我們來(lái)關(guān)注一下輸入和輸出,他倆的尺度都是(8*8),而輸入是3通道,輸出是2通道(深度學(xué)習(xí)中不管干啥一定要先看輸入輸出,對(duì)一層是這樣,對(duì)整個(gè)模型也是這樣)。
其次就準(zhǔn)備進(jìn)入我們最熟悉的卷積核計(jì)算了,可是在此之前我們得知道,這個(gè)運(yùn)算過(guò)程中到底發(fā)生了幾次卷積核計(jì)算呢?有的朋友可能要說(shuō),卷積的一大特性就是‘權(quán)值共享’,有幾通輸出就有幾個(gè)卷積核,每個(gè)卷積核把輸入特征圖從頭掃到尾。然而這個(gè)其實(shí)是不對(duì)的!
實(shí)際上,在卷積核計(jì)算數(shù)量問(wèn)題上,應(yīng)該是“ 有幾通道的輸出就有幾套卷積核,每套內(nèi)的卷積核數(shù)量與輸入通道數(shù)相等 ”,就像我在上圖中所畫的:
至此,這一個(gè)卷積層的運(yùn)算就全部完成了。
2.3 “可訓(xùn)練參數(shù)”驗(yàn)證
畢竟空口無(wú)憑,下面我來(lái)通過(guò)“ 可訓(xùn)練參數(shù) ”的數(shù)量,來(lái)為大家驗(yàn)證一下卷積層是不是按我說(shuō)的這么運(yùn)算的。大家應(yīng)該知道,一個(gè)卷積層內(nèi)的“可訓(xùn)練參數(shù)”,其實(shí)就是指的卷積核里的那些值,以及要加的偏置量,那么如果按照前面描述的計(jì)算方法來(lái)看,一個(gè)卷積層內(nèi)的“可訓(xùn)練參數(shù)有多少呢”?我們可知:
由此可得到:
那么按理說(shuō)可訓(xùn)練參數(shù)量應(yīng)為:
讓我們用keras的summary()來(lái)驗(yàn)證一下:
很棒!
記住,普通卷積層的可訓(xùn)練參數(shù)量為:
Ps: 還有一個(gè)衡量模型大小、復(fù)雜度的量叫做“理論計(jì)算量FLOPs”(floating point operations)。它通常只考慮Conv、FC等參數(shù)層的乘、加操作的數(shù)量,并且“純加”操作也會(huì)被忽略(例如bias)。卷積層運(yùn)算中的FLOPs計(jì)算公式為:
Ps: 這里還要為大家明確一個(gè)“感受野”的概念,簡(jiǎn)單來(lái)講就是卷積神經(jīng)網(wǎng)絡(luò)中的某一層特征圖上的一個(gè)點(diǎn),對(duì)應(yīng)到原圖上可以關(guān)聯(lián)到多少個(gè)點(diǎn),我們用一張圖來(lái)解釋一下:
上圖展示的是一個(gè)3層一維卷積,kernel_size=3,我們可以看到:頂層左一的像素與底層左起7個(gè)像素值有關(guān),這時(shí)候就代表它的感受野有7。我們可以顯而易見的得出以下兩個(gè)結(jié)論:
這個(gè)感受野在后續(xù)的卷積的拆分講解中還要用到。
三、卷積神經(jīng)網(wǎng)絡(luò)算法是什么?
一維構(gòu)筑、二維構(gòu)筑、全卷積構(gòu)筑。
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks, CNN)是一類包含卷積計(jì)算且具有深度結(jié)構(gòu)的前饋神經(jīng)網(wǎng)絡(luò)(Feedforward Neural Networks),是深度學(xué)習(xí)(deep learning)的代表算法之一。
卷積神經(jīng)網(wǎng)絡(luò)具有表征學(xué)習(xí)(representation learning)能力,能夠按其階層結(jié)構(gòu)對(duì)輸入信息進(jìn)行平移不變分類(shift-invariant classification),因此也被稱為“平移不變?nèi)斯ど窠?jīng)網(wǎng)絡(luò)(Shift-Invariant Artificial Neural Networks, SIANN)”。
卷積神經(jīng)網(wǎng)絡(luò)的連接性:
卷積神經(jīng)網(wǎng)絡(luò)中卷積層間的連接被稱為稀疏連接(sparse connection),即相比于前饋神經(jīng)網(wǎng)絡(luò)中的全連接,卷積層中的神經(jīng)元僅與其相鄰層的部分,而非全部神經(jīng)元相連。具體地,卷積神經(jīng)網(wǎng)絡(luò)第l層特征圖中的任意一個(gè)像素(神經(jīng)元)都僅是l-1層中卷積核所定義的感受野內(nèi)的像素的線性組合。
卷積神經(jīng)網(wǎng)絡(luò)的稀疏連接具有正則化的效果,提高了網(wǎng)絡(luò)結(jié)構(gòu)的穩(wěn)定性和泛化能力,避免過(guò)度擬合,同時(shí),稀疏連接減少了權(quán)重參數(shù)的總量,有利于神經(jīng)網(wǎng)絡(luò)的快速學(xué)習(xí),和在計(jì)算時(shí)減少內(nèi)存開銷。
卷積神經(jīng)網(wǎng)絡(luò)中特征圖同一通道內(nèi)的所有像素共享一組卷積核權(quán)重系數(shù),該性質(zhì)被稱為權(quán)重共享(weight sharing)。權(quán)重共享將卷積神經(jīng)網(wǎng)絡(luò)和其它包含局部連接結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)相區(qū)分,后者雖然使用了稀疏連接,但不同連接的權(quán)重是不同的。權(quán)重共享和稀疏連接一樣,減少了卷積神經(jīng)網(wǎng)絡(luò)的參數(shù)總量,并具有正則化的效果。
在全連接網(wǎng)絡(luò)視角下,卷積神經(jīng)網(wǎng)絡(luò)的稀疏連接和權(quán)重共享可以被視為兩個(gè)無(wú)限強(qiáng)的先驗(yàn)(pirior),即一個(gè)隱含層神經(jīng)元在其感受野之外的所有權(quán)重系數(shù)恒為0(但感受野可以在空間移動(dòng));且在一個(gè)通道內(nèi),所有神經(jīng)元的權(quán)重系數(shù)相同。
四、利用Python實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)的可視化
在本文中,將探討如何可視化卷積神經(jīng)網(wǎng)絡(luò)(CNN),該網(wǎng)絡(luò)在計(jì)算機(jī)視覺中使用最為廣泛。首先了解CNN模型可視化的重要性,其次介紹可視化的幾種方法,同時(shí)以一個(gè)用例幫助讀者更好地理解模型可視化這一概念。
正如上文中介紹的癌癥腫瘤診斷案例所看到的,研究人員需要對(duì)所設(shè)計(jì)模型的工作原理及其功能掌握清楚,這點(diǎn)至關(guān)重要。一般而言,一名深度學(xué)習(xí)研究者應(yīng)該記住以下幾點(diǎn):
1.1 理解模型是如何工作的
1.2 調(diào)整模型的參數(shù)
1.3 找出模型失敗的原因
1.4 向消費(fèi)者/終端用戶或業(yè)務(wù)主管解釋模型做出的決定
2.可視化CNN模型的方法
根據(jù)其內(nèi)部的工作原理,大體上可以將CNN可視化方法分為以下三類:
初步方法:一種顯示訓(xùn)練模型整體結(jié)構(gòu)的簡(jiǎn)單方法
基于激活的方法:對(duì)單個(gè)或一組神經(jīng)元的激活狀態(tài)進(jìn)行破譯以了解其工作過(guò)程
基于梯度的方法:在訓(xùn)練過(guò)程中操作前向傳播和后向傳播形成的梯度
下面將具體介紹以上三種方法,所舉例子是使用Keras深度學(xué)習(xí)庫(kù)實(shí)現(xiàn),另外本文使用的數(shù)據(jù)集是由“識(shí)別數(shù)字”競(jìng)賽提供。因此,讀者想復(fù)現(xiàn)文中案例時(shí),請(qǐng)確保安裝好Kears以及執(zhí)行了這些步驟。
研究者能做的最簡(jiǎn)單的事情就是繪制出模型結(jié)構(gòu)圖,此外還可以標(biāo)注神經(jīng)網(wǎng)絡(luò)中每層的形狀及參數(shù)。在keras中,可以使用如下命令完成模型結(jié)構(gòu)圖的繪制:
model.summary()_________________________________________________________________Layer (type) Output Shape Param #
=================================================================conv2d_1 (Conv2D) (None, 26, 26, 32) 320_________________________________________________________________conv2d_2 (Conv2D) (None, 24, 24, 64) 18496_________________________________________________________________max_pooling2d_1 (MaxPooling2 (None, 12, 12, 64) 0_________________________________________________________________dropout_1 (Dropout) (None, 12, 12, 64) 0_________________________________________________________________flatten_1 (Flatten) (None, 9216) 0_________________________________________________________________dense_1 (Dense) (None, 128) 1179776_________________________________________________________________dropout_2 (Dropout) (None, 128) 0_________________________________________________________________preds (Dense) (None, 10) 1290
=================================================================Total params: 1,199,882Trainable params: 1,199,882Non-trainable params: 0
還可以用一個(gè)更富有創(chuàng)造力和表現(xiàn)力的方式呈現(xiàn)模型結(jié)構(gòu)框圖,可以使用keras.utils.vis_utils函數(shù)完成模型體系結(jié)構(gòu)圖的繪制。
另一種方法是繪制訓(xùn)練模型的過(guò)濾器,這樣就可以了解這些過(guò)濾器的表現(xiàn)形式。例如,第一層的第一個(gè)過(guò)濾器看起來(lái)像:
top_layer = model.layers[0]plt.imshow(top_layer.get_weights()[0][:, :, :, 0].squeeze(), cmap='gray')
一般來(lái)說(shuō),神經(jīng)網(wǎng)絡(luò)的底層主要是作為邊緣檢測(cè)器,當(dāng)層數(shù)變深時(shí),過(guò)濾器能夠捕捉更加抽象的概念,比如人臉等。
為了理解神經(jīng)網(wǎng)絡(luò)的工作過(guò)程,可以在輸入圖像上應(yīng)用過(guò)濾器,然后繪制其卷積后的輸出,這使得我們能夠理解一個(gè)過(guò)濾器其特定的激活模式是什么。比如,下圖是一個(gè)人臉過(guò)濾器,當(dāng)輸入圖像是人臉圖像時(shí)候,它就會(huì)被激活。
from vis.visualization import visualize_activation
from vis.utils import utils
from keras import activations
from matplotlib import pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = (18, 6)
# Utility to search for layer index by name.
# Alternatively we can specify this as -1 since it corresponds to the last layer.
layer_idx = utils.find_layer_idx(model, 'preds')
# Swap softmax with linear
model.layers[layer_idx].activation = activations.linear
model = utils.apply_modifications(model)
# This is the output node we want to maximize.filter_idx = 0
img = visualize_activation(model, layer_idx, filter_indices=filter_idx)
plt.imshow(img[..., 0])
同理,可以將這個(gè)想法應(yīng)用于所有的類別,并檢查它們的模式會(huì)是什么樣子。
for output_idx in np.arange(10):
# Lets turn off verbose output this time to avoid clutter and just see the output.
img = visualize_activation(model, layer_idx, filter_indices=output_idx, input_range=(0., 1.))
plt.figure()
plt.title('Networks perception of {}'.format(output_idx))
plt.imshow(img[..., 0])
在圖像分類問(wèn)題中,可能會(huì)遇到目標(biāo)物體被遮擋,有時(shí)候只有物體的一小部分可見的情況。基于圖像遮擋的方法是通過(guò)一個(gè)灰色正方形系統(tǒng)地輸入圖像的不同部分并監(jiān)視分類器的輸出。這些例子清楚地表明模型在場(chǎng)景中定位對(duì)象時(shí),若對(duì)象被遮擋,其分類正確的概率顯著降低。
為了理解這一概念,可以從數(shù)據(jù)集中隨機(jī)抽取圖像,并嘗試?yán)L制該圖的熱圖(heatmap)。這使得我們直觀地了解圖像的哪些部分對(duì)于該模型而言的重要性,以便對(duì)實(shí)際類別進(jìn)行明確的區(qū)分。
def iter_occlusion(image, size=8):
# taken from https://www.kaggle.com/blargl/simple-occlusion-and-saliency-maps
occlusion = np.full((size * 5, size * 5, 1), [0.5], np.float32)
occlusion_center = np.full((size, size, 1), [0.5], np.float32)
occlusion_padding = size * 2
# print('padding...')
image_padded = np.pad(image, ( \ (occlusion_padding, occlusion_padding), (occlusion_padding, occlusion_padding), (0, 0) \ ), 'constant', constant_values = 0.0)
for y in range(occlusion_padding, image.shape[0] + occlusion_padding, size):
for x in range(occlusion_padding, image.shape[1] + occlusion_padding, size):
tmp = image_padded.copy()
tmp[y - occlusion_padding:y + occlusion_center.shape[0] + occlusion_padding, \
x - occlusion_padding:x + occlusion_center.shape[1] + occlusion_padding] \ = occlusion
tmp[y:y + occlusion_center.shape[0], x:x + occlusion_center.shape[1]] = occlusion_center yield x - occlusion_padding, y - occlusion_padding, \
tmp[occlusion_padding:tmp.shape[0] - occlusion_padding, occlusion_padding:tmp.shape[1] - occlusion_padding]i = 23 # for exampledata = val_x[i]correct_class = np.argmax(val_y[i])
# input tensor for model.predictinp = data.reshape(1, 28, 28, 1)# image data for matplotlib's imshowimg = data.reshape(28, 28)
# occlusionimg_size = img.shape[0]
occlusion_size = 4print('occluding...')heatmap = np.zeros((img_size, img_size), np.float32)class_pixels = np.zeros((img_size, img_size), np.int16)
from collections import defaultdict
counters = defaultdict(int)for n, (x, y, img_float) in enumerate(iter_occlusion(data, size=occlusion_size)):
X = img_float.reshape(1, 28, 28, 1)
out = model.predict(X)
#print('#{}: {} @ {} (correct class: {})'.format(n, np.argmax(out), np.amax(out), out[0][correct_class]))
#print('x {} - {} | y {} - {}'.format(x, x + occlusion_size, y, y + occlusion_size))
heatmap[y:y + occlusion_size, x:x + occlusion_size] = out[0][correct_class]
class_pixels[y:y + occlusion_size, x:x + occlusion_size] = np.argmax(out)
counters[np.argmax(out)] += 1
正如之前的坦克案例中看到的那樣,怎么才能知道模型側(cè)重于哪部分的預(yù)測(cè)呢?為此,可以使用顯著圖解決這個(gè)問(wèn)題。顯著圖首先在這篇文章中被介紹。
使用顯著圖的概念相當(dāng)直接——計(jì)算輸出類別相對(duì)于輸入圖像的梯度。這應(yīng)該告訴我們輸出類別值對(duì)于輸入圖像像素中的微小變化是怎樣變化的。梯度中的所有正值告訴我們,像素的一個(gè)小變化會(huì)增加輸出值。因此,將這些梯度可視化可以提供一些直觀的信息,這種方法突出了對(duì)輸出貢獻(xiàn)最大的顯著圖像區(qū)域。
class_idx = 0indices = np.where(val_y[:, class_idx] == 1.)[0]
# pick some random input from here.idx = indices[0]
# Lets sanity check the picked image.from matplotlib import pyplot as plt%matplotlib inline
plt.rcParams['figure.figsize'] = (18, 6)plt.imshow(val_x[idx][..., 0])
from vis.visualization import visualize_saliency
from vis.utils import utilsfrom keras import activations# Utility to search for layer index by name.
# Alternatively we can specify this as -1 since it corresponds to the last layer.
layer_idx = utils.find_layer_idx(model, 'preds')
# Swap softmax with linearmodel.layers[layer_idx].activation = activations.linear
model = utils.apply_modifications(model)grads = visualize_saliency(model, layer_idx, filter_indices=class_idx, seed_input=val_x[idx])
# Plot with 'jet' colormap to visualize as a heatmap.plt.imshow(grads, cmap='jet')
# This corresponds to the Dense linear layer.for class_idx in np.arange(10):
indices = np.where(val_y[:, class_idx] == 1.)[0]
idx = indices[0]
f, ax = plt.subplots(1, 4)
ax[0].imshow(val_x[idx][..., 0])
for i, modifier in enumerate([None, 'guided', 'relu']):
grads = visualize_saliency(model, layer_idx, filter_indices=class_idx,
seed_input=val_x[idx], backprop_modifier=modifier)
if modifier is None:
modifier = 'vanilla'
ax[i+1].set_title(modifier)
ax[i+1].imshow(grads, cmap='jet')
類別激活映射(CAM)或grad-CAM是另外一種可視化模型的方法,這種方法使用的不是梯度的輸出值,而是使用倒數(shù)第二個(gè)卷積層的輸出,這樣做是為了利用存儲(chǔ)在倒數(shù)第二層的空間信息。
from vis.visualization import visualize_cam
# This corresponds to the Dense linear layer.for class_idx in np.arange(10):
indices = np.where(val_y[:, class_idx] == 1.)[0]
idx = indices[0]f, ax = plt.subplots(1, 4)
ax[0].imshow(val_x[idx][..., 0])
for i, modifier in enumerate([None, 'guided', 'relu']):
grads = visualize_cam(model, layer_idx, filter_indices=class_idx,
seed_input=val_x[idx], backprop_modifier=modifier)
if modifier is None:
modifier = 'vanilla'
ax[i+1].set_title(modifier)
ax[i+1].imshow(grads, cmap='jet')
本文簡(jiǎn)單說(shuō)明了CNN模型可視化的重要性,以及介紹了一些可視化CNN網(wǎng)絡(luò)模型的方法,希望對(duì)讀者有所幫助,使其能夠在后續(xù)深度學(xué)習(xí)應(yīng)用中構(gòu)建更好的模型。 免費(fèi)視頻教程:www.mlxs.top
以上就是關(guān)于如何設(shè)計(jì)卷積神經(jīng)網(wǎng)絡(luò)相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
普通人怎么認(rèn)證抖音黃v(抖音個(gè)人如何認(rèn)證黃v,抖音黃v認(rèn)證)
如何建立自己的app平臺(tái)(如何建立自己的app平臺(tái)賬號(hào))
如何報(bào)考注冊(cè)安全工程師證書(如何報(bào)考注冊(cè)安全工程師證書有效期)
問(wèn)大家
抖音在海外怎么直播?抖音如何開通國(guó)外直播權(quán)限?
蘇州書生商友信息科技有限公司在武夷山申請(qǐng)中英文域名行業(yè)知名度如何?請(qǐng)大家回答
大興展會(huì)舞龍舞獅如何選擇不被騙?在座的筒子們跪求回答
燕郊簽約儀式會(huì)場(chǎng)布置如何選擇不被騙?幫個(gè)忙在線的朋友
平面設(shè)計(jì)學(xué)會(huì)能做什么工作?前景如何?
蘇州書生商友信息科技有限公司在淮北公眾號(hào)設(shè)計(jì)制作行業(yè)知名度如何?路過(guò)的老鐵們幫回答下
如何開通抖音海外直播白名單?抖音海外直播權(quán)限解決辦法
杭州小戶型的房子,想要屋子看起來(lái)整潔寬闊一些,地磚和家具的顏色該如何選擇?
LOGO設(shè)計(jì)如何設(shè)計(jì)LOGO呢?
上海稱心的淘寶店鋪裝修正規(guī)什么價(jià)格?在座的看官們幫回答下