HOME 首頁
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運營
CASE 服務(wù)案例
NEWS 熱點資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    如何設(shè)計卷積神經(jīng)網(wǎng)絡(luò)(如何設(shè)計卷積神經(jīng)網(wǎng)絡(luò)方案)

    發(fā)布時間:2023-04-14 08:56:30     稿源: 創(chuàng)意嶺    閱讀: 103        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于如何設(shè)計卷積神經(jīng)網(wǎng)絡(luò)的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端

    官網(wǎng):https://ai.de1919.com。

    創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    如何設(shè)計卷積神經(jīng)網(wǎng)絡(luò)(如何設(shè)計卷積神經(jīng)網(wǎng)絡(luò)方案)

    一、深度學(xué)習(xí)之卷積神經(jīng)網(wǎng)絡(luò)經(jīng)典模型

    LeNet-5模型 在CNN的應(yīng)用中,文字識別系統(tǒng)所用的LeNet-5模型是非常經(jīng)典的模型。LeNet-5模型是1998年,Yann LeCun教授提出的,它是第一個成功大規(guī)模應(yīng)用在手寫數(shù)字識別問題的卷積神經(jīng)網(wǎng)絡(luò),在MNIST數(shù)據(jù)集中的正確率可以高達99.2%。

    下面詳細介紹一下LeNet-5模型工作的原理。

    LeNet-5模型一共有7層,每層包含眾多參數(shù),也就是卷積神經(jīng)網(wǎng)絡(luò)中的參數(shù)。雖然層數(shù)只有7層,這在如今龐大的神經(jīng)網(wǎng)絡(luò)中可是說是非常少的了,但是包含了卷積層,池化層,全連接層,可謂麻雀雖小五臟俱全了。為了方便,我們把卷積層稱為C層,下采樣層叫做下采樣層。

    首先,輸入層輸入原始圖像,原始圖像被處理成32×32個像素點的值。然后,后面的隱層計在卷積和子抽樣之間交替進行。C1層是卷積層,包含了六個特征圖。每個映射也就是28x28個神經(jīng)元。卷積核可以是5x5的十字形,這28×28個神經(jīng)元共享卷積核權(quán)值參數(shù),通過卷積運算,原始信號特征增強,同時也降低了噪聲,當(dāng)卷積核不同時,提取到圖像中的特征不同;C2層是一個池化層,池化層的功能在上文已經(jīng)介紹過了,它將局部像素值平均化來實現(xiàn)子抽樣。

    池化層包含了六個特征映射,每個映射的像素值為14x14,這樣的池化層非常重要,可以在一定程度上保證網(wǎng)絡(luò)的特征被提取,同時運算量也大大降低,減少了網(wǎng)絡(luò)結(jié)構(gòu)過擬合的風(fēng)險。因為卷積層與池化層是交替出現(xiàn)的,所以隱藏層的第三層又是一個卷積層,第二個卷積層由16個特征映射構(gòu)成,每個特征映射用于加權(quán)和計算的卷積核為10x10的。第四個隱藏層,也就是第二個池化層同樣包含16個特征映射,每個特征映射中所用的卷積核是5x5的。第五個隱藏層是用5x5的卷積核進行運算,包含了120個神經(jīng)元,也是這個網(wǎng)絡(luò)中卷積運算的最后一層。

    之后的第六層便是全連接層,包含了84個特征圖。全連接層中對輸入進行點積之后加入偏置,然后經(jīng)過一個激活函數(shù)傳輸給輸出層的神經(jīng)元。最后一層,也就是第七層,為了得到輸出向量,設(shè)置了十個神經(jīng)元來進行分類,相當(dāng)于輸出一個包含十個元素的一維數(shù)組,向量中的十個元素即0到9。

    AlexNet模型

    AlexNet簡介

    2012年Imagenet圖像識別大賽中,Alext提出的alexnet網(wǎng)絡(luò)模型一鳴驚人,引爆了神經(jīng)網(wǎng)絡(luò)的應(yīng)用熱潮,并且贏得了2012屆圖像識別大賽的冠軍,這也使得卷積神經(jīng)網(wǎng)絡(luò)真正意義上成為圖像處理上的核心算法。上文介紹的LeNet-5出現(xiàn)在上個世紀,雖然是經(jīng)典,但是迫于種種復(fù)雜的現(xiàn)實場景限制,只能在一些領(lǐng)域應(yīng)用。不過,隨著SVM等手工設(shè)計的特征的飛速發(fā)展,LeNet-5并沒有形成很大的應(yīng)用狀況。隨著ReLU與dropout的提出,以及GPU帶來算力突破和互聯(lián)網(wǎng)時代大數(shù)據(jù)的爆發(fā),卷積神經(jīng)網(wǎng)絡(luò)帶來歷史的突破,AlexNet的提出讓深度學(xué)習(xí)走上人工智能的最前端。

    圖像預(yù)處理

    AlexNet的訓(xùn)練數(shù)據(jù)采用ImageNet的子集中的ILSVRC2010數(shù)據(jù)集,包含了1000類,共1.2百萬的訓(xùn)練圖像,50000張驗證集,150000張測試集。在進行網(wǎng)絡(luò)訓(xùn)練之前我們要對數(shù)據(jù)集圖片進行預(yù)處理。首先我們要將不同分辨率的圖片全部變成256x256規(guī)格的圖像,變換方法是將圖片的短邊縮放到 256像素值,然后截取長邊的中間位置的256個像素值,得到256x256大小的圖像。除了對圖片大小進行預(yù)處理,還需要對圖片減均值,一般圖像均是由RGB三原色構(gòu)成,均值按RGB三分量分別求得,由此可以更加突出圖片的特征,更方便后面的計算。

    此外,對了保證訓(xùn)練的效果,我們?nèi)孕鑼τ?xùn)練數(shù)據(jù)進行更為嚴苛的處理。在256x256大小的圖像中,截取227x227大小的圖像,在此之后對圖片取鏡像,這樣就使得原始數(shù)據(jù)增加了(256-224)x(256-224)x2= 2048倍。最后對RGB空間做PCA,然后對主成分做(0,0.1)的高斯擾動,結(jié)果使錯誤率下降1%。對測試數(shù)據(jù)而言,抽取以圖像4個角落的大小為224224的圖像,中心的224224大小的圖像以及它們的鏡像翻轉(zhuǎn)圖像,這樣便可以獲得10張圖像,我們便可以利用softmax進行預(yù)測,對所有預(yù)測取平均作為最終的分類結(jié)果。

    ReLU激活函數(shù)

    之前我們提到常用的非線性的激活函數(shù)是sigmoid,它能夠把輸入的連續(xù)實值全部確定在0和1之間。但是這帶來一個問題,當(dāng)一個負數(shù)的絕對值很大時,那么輸出就是0;如果是絕對值非常大的正數(shù),輸出就是1。這就會出現(xiàn)飽和的現(xiàn)象,飽和現(xiàn)象中神經(jīng)元的梯度會變得特別小,這樣必然會使得網(wǎng)絡(luò)的學(xué)習(xí)更加困難。此外,sigmoid的output的值并不是0為均值,因為這會導(dǎo)致上一層輸出的非0均值信號會直接輸入到后一層的神經(jīng)元上。所以AlexNet模型提出了ReLU函數(shù),公式:f(x)=max(0,x)f(x)=max(0,x)。

    用ReLU代替了Sigmoid,發(fā)現(xiàn)使用 ReLU 得到的SGD的收斂速度會比 sigmoid快很多,這成了AlexNet模型的優(yōu)勢之一。

    Dropout

    AlexNet模型提出了一個有效的模型組合方式,相比于單模型,只需要多花費一倍的時間,這種方式就做Dropout。在整個神經(jīng)網(wǎng)絡(luò)中,隨機選取一半的神經(jīng)元將它們的輸出變成0。這種方式使得網(wǎng)絡(luò)關(guān)閉了部分神經(jīng)元,減少了過擬合現(xiàn)象。同時訓(xùn)練的迭代次數(shù)也得以增加。當(dāng)時一個GTX580 GPU只有3GB內(nèi)存,這使得大規(guī)模的運算成為不可能。但是,隨著硬件水平的發(fā)展,當(dāng)時的GPU已經(jīng)可以實現(xiàn)并行計算了,并行計算之后兩塊GPU可以互相通信傳輸數(shù)據(jù),這樣的方式充分利用了GPU資源,所以模型設(shè)計利用兩個GPU并行運算,大大提高了運算效率。

    模型分析

    AlexNet模型共有8層結(jié)構(gòu),其中前5層為卷積層,其中前兩個卷積層和第五個卷積層有池化層,其他卷積層沒有。后面3層為全連接層,神經(jīng)元約有六十五萬個,所需要訓(xùn)練的參數(shù)約六千萬個。

    圖片預(yù)處理過后,進過第一個卷積層C1之后,原始的圖像也就變成了55x55的像素大小,此時一共有96個通道。模型分為上下兩塊是為了方便GPU運算,48作為通道數(shù)目更加適合GPU的并行運算。上圖的模型里把48層直接變成了一個面,這使得模型看上去更像一個立方體,大小為55x55x48。在后面的第二個卷積層C2中,卷積核的尺寸為5x5x48,由此再次進行卷積運算。在C1,C2卷積層的卷積運算之后,都會有一個池化層,使得提取特征之后的特征圖像素值大大減小,方便了運算,也使得特征更加明顯。而第三層的卷積層C3又是更加特殊了。第三層卷積層做了通道的合并,將之前兩個通道的數(shù)據(jù)再次合并起來,這是一種串接操作。第三層后,由于串接,通道數(shù)變成256。全卷積的卷積核尺寸也就變成了13×13×25613×13×256。一個有4096個這樣尺寸的卷積核分別對輸入圖像做4096次的全卷積操作,最后的結(jié)果就是一個列向量,一共有4096個數(shù)。這也就是最后的輸出,但是AlexNet最終是要分1000個類,所以通過第八層,也就是全連接的第三層,由此得到1000個類輸出。

    Alexnet網(wǎng)絡(luò)中各個層發(fā)揮了不同的作用,ReLU,多個CPU是為了提高訓(xùn)練速度,重疊pool池化是為了提高精度,且不容易產(chǎn)生過擬合,局部歸一化響應(yīng)是為了提高精度,而數(shù)據(jù)增益與dropout是為了減少過擬合。

    VGG net

    在ILSVRC-2014中,牛津大學(xué)的視覺幾何組提出的VGGNet模型在定位任務(wù)第一名和分類任務(wù)第一名[[i]]。如今在計算機視覺領(lǐng)域,卷積神經(jīng)網(wǎng)絡(luò)的良好效果深得廣大開發(fā)者的喜歡,并且上文提到的AlexNet模型擁有更好的效果,所以廣大從業(yè)者學(xué)習(xí)者試圖將其改進以獲得更好地效果。而后來很多人經(jīng)過驗證認為,AlexNet模型中所謂的局部歸一化響應(yīng)浪費了計算資源,但是對性能卻沒有很大的提升。VGG的實質(zhì)是AlexNet結(jié)構(gòu)的增強版,它側(cè)重強調(diào)卷積神經(jīng)網(wǎng)絡(luò)設(shè)計中的深度。將卷積層的深度提升到了19層,并且在當(dāng)年的ImageNet大賽中的定位問題中獲得了第一名的好成績。整個網(wǎng)絡(luò)向人們證明了我們是可以用很小的卷積核取得很好地效果,前提是我們要把網(wǎng)絡(luò)的層數(shù)加深,這也論證了我們要想提高整個神經(jīng)網(wǎng)絡(luò)的模型效果,一個較為有效的方法便是將它的深度加深,雖然計算量會大大提高,但是整個復(fù)雜度也上升了,更能解決復(fù)雜的問題。雖然VGG網(wǎng)絡(luò)已經(jīng)誕生好幾年了,但是很多其他網(wǎng)絡(luò)上效果并不是很好地情況下,VGG有時候還能夠發(fā)揮它的優(yōu)勢,讓人有意想不到的收獲。

    與AlexNet網(wǎng)絡(luò)非常類似,VGG共有五個卷積層,并且每個卷積層之后都有一個池化層。當(dāng)時在ImageNet大賽中,作者分別嘗試了六種網(wǎng)絡(luò)結(jié)構(gòu)。這六種結(jié)構(gòu)大致相同,只是層數(shù)不同,少則11層,多達19層。網(wǎng)絡(luò)結(jié)構(gòu)的輸入是大小為224*224的RGB圖像,最終將分類結(jié)果輸出。當(dāng)然,在輸入網(wǎng)絡(luò)時,圖片要進行預(yù)處理。

    VGG網(wǎng)絡(luò)相比AlexNet網(wǎng)絡(luò),在網(wǎng)絡(luò)的深度以及寬度上做了一定的拓展,具體的卷積運算還是與AlexNet網(wǎng)絡(luò)類似。我們主要說明一下VGG網(wǎng)絡(luò)所做的改進。第一點,由于很多研究者發(fā)現(xiàn)歸一化層的效果并不是很好,而且占用了大量的計算資源,所以在VGG網(wǎng)絡(luò)中作者取消了歸一化層;第二點,VGG網(wǎng)絡(luò)用了更小的3x3的卷積核,而兩個連續(xù)的3x3的卷積核相當(dāng)于5x5的感受野,由此類推,三個3x3的連續(xù)的卷積核也就相當(dāng)于7x7的感受野。這樣的變化使得參數(shù)量更小,節(jié)省了計算資源,將資源留給后面的更深層次的網(wǎng)絡(luò)。第三點是VGG網(wǎng)絡(luò)中的池化層特征池化核改為了2x2,而在AlexNet網(wǎng)絡(luò)中池化核為3x3。這三點改進無疑是使得整個參數(shù)運算量下降,這樣我們在有限的計算平臺上能夠獲得更多的資源留給更深層的網(wǎng)絡(luò)。由于層數(shù)較多,卷積核比較小,這樣使得整個網(wǎng)絡(luò)的特征提取效果很好。其實由于VGG的層數(shù)較多,所以計算量還是相當(dāng)大的,卷積層比較多成了它最顯著的特點。另外,VGG網(wǎng)絡(luò)的拓展性能比較突出,結(jié)構(gòu)比較簡潔,所以它的遷移性能比較好,遷移到其他數(shù)據(jù)集的時候泛化性能好。到現(xiàn)在為止,VGG網(wǎng)絡(luò)還經(jīng)常被用來提出特征。所以當(dāng)現(xiàn)在很多較新的模型效果不好時,使用VGG可能會解決這些問題。

    GoogleNet

    谷歌于2014年Imagenet挑戰(zhàn)賽(ILSVRC14)憑借GoogleNet再次斬獲第一名。這個通過增加了神經(jīng)網(wǎng)絡(luò)的深度和寬度獲得了更好地效果,在此過程中保證了計算資源的不變。這個網(wǎng)絡(luò)論證了加大深度,寬度以及訓(xùn)練數(shù)據(jù)的增加是現(xiàn)有深度學(xué)習(xí)獲得更好效果的主要方式。但是增加尺寸可能會帶來過擬合的問題,因為深度與寬度的加深必然會帶來過量的參數(shù)。此外,增加網(wǎng)絡(luò)尺寸也帶來了對計算資源侵占過多的缺點。為了保證計算資源充分利用的前提下去提高整個模型的性能,作者使用了Inception模型,這個模型在下圖中有展示,可以看出這個有點像金字塔的模型在寬度上使用并聯(lián)的不同大小的卷積核,增加了卷積核的輸出寬度。因為使用了較大尺度的卷積核增加了參數(shù)。使用了1*1的卷積核就是為了使得參數(shù)的數(shù)量最少。

    Inception模塊

    上圖表格為網(wǎng)絡(luò)分析圖,第一行為卷積層,輸入為224×224×3 ,卷積核為7x7,步長為2,padding為3,輸出的維度為112×112×64,這里面的7x7卷積使用了 7×1 然后 1×7 的方式,這樣便有(7+7)×64×3=2,688個參數(shù)。第二行為池化層,卷積核為3×33×3,滑動步長為2,padding為 1 ,輸出維度:56×56×64,計算方式: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,作為輸入進行3×3卷積層,輸出大小為28×28×128;第 3部分,先1×1卷積層,輸出大小為28×28×32,作為輸入進行3×3卷積層,輸出大小為28×28×32;而第3 部分3×3的池化層,輸出大小為輸出大小為28×28×32。第5行的Inception module會對上面是個結(jié)果的輸出結(jié)果并聯(lián),由此增加網(wǎng)絡(luò)寬度。

    ResNet

    2015年ImageNet大賽中,MSRA何凱明團隊的ResidualNetworks力壓群雄,在ImageNet的諸多領(lǐng)域的比賽中上均獲得了第一名的好成績,而且這篇關(guān)于ResNet的論文Deep Residual Learning for Image Recognition也獲得了CVPR2016的最佳論文,實至而名歸。

    上文介紹了的VGG以及GoogleNet都是增加了卷積神經(jīng)網(wǎng)絡(luò)的深度來獲得更好效果,也讓人們明白了網(wǎng)絡(luò)的深度與廣度決定了訓(xùn)練的效果。但是,與此同時,寬度與深度加深的同時,效果實際會慢慢變差。也就是說模型的層次加深,錯誤率提高了。模型的深度加深,以一定的錯誤率來換取學(xué)習(xí)能力的增強。但是深層的神經(jīng)網(wǎng)絡(luò)模型犧牲了大量的計算資源,學(xué)習(xí)能力提高的同時不應(yīng)當(dāng)產(chǎn)生比淺層神經(jīng)網(wǎng)絡(luò)更高的錯誤率。這個現(xiàn)象的產(chǎn)生主要是因為隨著神經(jīng)網(wǎng)絡(luò)的層數(shù)增加,梯度消失的現(xiàn)象就越來越明顯。所以為了解決這個問題,作者提出了一個深度殘差網(wǎng)絡(luò)的結(jié)構(gòu)Residual:

    上圖就是殘差網(wǎng)絡(luò)的基本結(jié)構(gòu),可以看出其實是增加了一個恒等映射,將原本的變換函數(shù)H(x)轉(zhuǎn)換成了F(x)+x。示意圖中可以很明顯看出來整個網(wǎng)絡(luò)的變化,這樣網(wǎng)絡(luò)不再是簡單的堆疊結(jié)構(gòu),這樣的話便很好地解決了由于網(wǎng)絡(luò)層數(shù)增加而帶來的梯度原來越不明顯的問題。所以這時候網(wǎng)絡(luò)可以做得很深,到目前為止,網(wǎng)絡(luò)的層數(shù)都可以上千層,而能夠保證很好地效果。并且,這樣的簡單疊加并沒有給網(wǎng)絡(luò)增加額外的參數(shù)跟計算量,同時也提高了網(wǎng)絡(luò)訓(xùn)練的效果與效率。

    在比賽中,為了證明自己觀點是正確的,作者控制變量地設(shè)計幾個實驗。首先作者構(gòu)建了兩個plain網(wǎng)絡(luò),這兩個網(wǎng)絡(luò)分別為18層跟34層,隨后作者又設(shè)計了兩個殘差網(wǎng)絡(luò),層數(shù)也是分別為18層和34層。然后對這四個模型進行控制變量的實驗觀察數(shù)據(jù)量的變化。下圖便是實驗結(jié)果。實驗中,在plain網(wǎng)絡(luò)上觀測到明顯的退化現(xiàn)象。實驗結(jié)果也表明,在殘差網(wǎng)絡(luò)上,34層的效果明顯要好于18層的效果,足以證明殘差網(wǎng)絡(luò)隨著層數(shù)增加性能也是增加的。不僅如此,殘差網(wǎng)絡(luò)的在更深層的結(jié)構(gòu)上收斂性能也有明顯的提升,整個實驗大為成功。

    除此之外,作者還做了關(guān)于shortcut方式的實驗,如果殘差網(wǎng)絡(luò)模塊的輸入輸出維度不一致,我們?nèi)绻咕S度統(tǒng)一,必須要對維數(shù)較少的進行増維。而增維的最好效果是用0來填充。不過實驗數(shù)據(jù)顯示三者差距很小,所以線性投影并不是特別需要。使用0來填充維度同時也保證了模型的復(fù)雜度控制在比較低的情況下。

    隨著實驗的深入,作者又提出了更深的殘差模塊。這種模型減少了各個層的參數(shù)量,將資源留給更深層數(shù)的模型,在保證復(fù)雜度很低的情況下,模型也沒有出現(xiàn)梯度消失很明顯的情況,因此目前模型最高可達1202層,錯誤率仍然控制得很低。但是層數(shù)如此之多也帶來了過擬合的現(xiàn)象,不過諸多研究者仍在改進之中,畢竟此時的ResNet已經(jīng)相對于其他模型在性能上遙遙領(lǐng)先了。

    殘差網(wǎng)絡(luò)的精髓便是shortcut。從一個角度來看,也可以解讀為多種路徑組合的一個網(wǎng)絡(luò)。如下圖:

    ResNet可以做到很深,但是從上圖中可以體會到,當(dāng)網(wǎng)絡(luò)很深,也就是層數(shù)很多時,數(shù)據(jù)傳輸?shù)穆窂狡鋵嵪鄬Ρ容^固定。我們似乎也可以將其理解為一個多人投票系統(tǒng),大多數(shù)梯度都分布在論文中所謂的effective path上。

    DenseNet

    在Resnet模型之后,有人試圖對ResNet模型進行改進,由此便誕生了ResNeXt模型。

    這是對上面介紹的ResNet模型結(jié)合了GoogleNet中的inception模塊思想,相比于Resnet來說更加有效。隨后,誕生了DenseNet模型,它直接將所有的模塊連接起來,整個模型更加簡單粗暴。稠密相連成了它的主要特點。

    我們將DenseNet與ResNet相比較:

    從上圖中可以看出,相比于ResNet,DenseNet參數(shù)量明顯減少很多,效果也更加優(yōu)越,只是DenseNet需要消耗更多的內(nèi)存。

    總結(jié)

    上面介紹了卷積神經(jīng)網(wǎng)絡(luò)發(fā)展史上比較著名的一些模型,這些模型非常經(jīng)典,也各有優(yōu)勢。在算力不斷增強的現(xiàn)在,各種新的網(wǎng)絡(luò)訓(xùn)練的效率以及效果也在逐漸提高。從收斂速度上看,VGG>Inception>DenseNet>ResNet,從泛化能力來看,Inception>DenseNet=ResNet>VGG,從運算量看來,Inception<DenseNet< ResNet<VGG,從內(nèi)存開銷來看,Inception<ResNet< DenseNet<VGG。在本次研究中,我們對各個模型均進行了分析,但從效果來看,ResNet效果是最好的,優(yōu)于Inception,優(yōu)于VGG,所以我們第四章實驗中主要采用谷歌的Inception模型,也就是GoogleNet。

    二、卷積層在神經(jīng)網(wǎng)絡(luò)中如何運算?

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks, CNN)的核心是進行卷積運算操作。在實際應(yīng)用中往往采用多層網(wǎng)絡(luò)結(jié)構(gòu),因此又被稱為深度卷積神經(jīng)網(wǎng)絡(luò)。本文將從單個卷積的計算出發(fā),帶大家掌握卷積層在神經(jīng)網(wǎng)絡(luò)中的運算方法。

    2.1 單個卷積的計算

    要想了解卷積層在神經(jīng)網(wǎng)絡(luò)中的計算過程,我們首先需要了解單個“卷積”是如何運作的。

    想必大家在學(xué)習(xí)CNN的過程中都見過下圖( 出處在此 ,這上面有各種各樣的卷積gif圖):

    input_shape=(5,5),kernelsize=(3,3),padding=‘same’,stride=1,output_shape=(5,5)

    在此圖中:

    在此次計算中:

    Ps: 在實際應(yīng)用中,每一個輸出的特征圖還會配備一個偏置bais,在上圖中無表示。

    2.2 卷積層在神經(jīng)網(wǎng)絡(luò)中的運算

    了解完單個卷積是如何計算的之后,我們就可以從神經(jīng)網(wǎng)絡(luò)的角度來看‘卷積層’的運算過程了。下圖展示的是輸入三通圖像(8*8*3)經(jīng)一層卷積結(jié)構(gòu),輸出兩通特征圖(8*8*2)的計算過程:

    卷積參數(shù):input_shape=(8,8,3),kernelsize=(3,3),padding=‘same’,stride=1,output_shape=(8,8,2)

    在此圖中:

    在此次卷積層的運算中:

    首先我們來關(guān)注一下輸入和輸出,他倆的尺度都是(8*8),而輸入是3通道,輸出是2通道(深度學(xué)習(xí)中不管干啥一定要先看輸入輸出,對一層是這樣,對整個模型也是這樣)。

    其次就準(zhǔn)備進入我們最熟悉的卷積核計算了,可是在此之前我們得知道,這個運算過程中到底發(fā)生了幾次卷積核計算呢?有的朋友可能要說,卷積的一大特性就是‘權(quán)值共享’,有幾通輸出就有幾個卷積核,每個卷積核把輸入特征圖從頭掃到尾。然而這個其實是不對的!

    實際上,在卷積核計算數(shù)量問題上,應(yīng)該是“ 有幾通道的輸出就有幾套卷積核,每套內(nèi)的卷積核數(shù)量與輸入通道數(shù)相等 ”,就像我在上圖中所畫的:

    至此,這一個卷積層的運算就全部完成了。

    2.3 “可訓(xùn)練參數(shù)”驗證

    畢竟空口無憑,下面我來通過“ 可訓(xùn)練參數(shù) ”的數(shù)量,來為大家驗證一下卷積層是不是按我說的這么運算的。大家應(yīng)該知道,一個卷積層內(nèi)的“可訓(xùn)練參數(shù)”,其實就是指的卷積核里的那些值,以及要加的偏置量,那么如果按照前面描述的計算方法來看,一個卷積層內(nèi)的“可訓(xùn)練參數(shù)有多少呢”?我們可知:

    由此可得到:

    那么按理說可訓(xùn)練參數(shù)量應(yīng)為:

    讓我們用keras的summary()來驗證一下:

    很棒!

    記住,普通卷積層的可訓(xùn)練參數(shù)量為:

    Ps: 還有一個衡量模型大小、復(fù)雜度的量叫做“理論計算量FLOPs”(floating point operations)。它通常只考慮Conv、FC等參數(shù)層的乘、加操作的數(shù)量,并且“純加”操作也會被忽略(例如bias)。卷積層運算中的FLOPs計算公式為:

    Ps: 這里還要為大家明確一個“感受野”的概念,簡單來講就是卷積神經(jīng)網(wǎng)絡(luò)中的某一層特征圖上的一個點,對應(yīng)到原圖上可以關(guān)聯(lián)到多少個點,我們用一張圖來解釋一下:

    上圖展示的是一個3層一維卷積,kernel_size=3,我們可以看到:頂層左一的像素與底層左起7個像素值有關(guān),這時候就代表它的感受野有7。我們可以顯而易見的得出以下兩個結(jié)論:

    這個感受野在后續(xù)的卷積的拆分講解中還要用到。

    三、卷積神經(jīng)網(wǎng)絡(luò)算法是什么?

    一維構(gòu)筑、二維構(gòu)筑、全卷積構(gòu)筑。

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks, CNN)是一類包含卷積計算且具有深度結(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)對輸入信息進行平移不變分類(shift-invariant classification),因此也被稱為“平移不變?nèi)斯ど窠?jīng)網(wǎng)絡(luò)(Shift-Invariant Artificial Neural Networks, SIANN)”。

    如何設(shè)計卷積神經(jīng)網(wǎng)絡(luò)(如何設(shè)計卷積神經(jīng)網(wǎng)絡(luò)方案)

    卷積神經(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層特征圖中的任意一個像素(神經(jīng)元)都僅是l-1層中卷積核所定義的感受野內(nèi)的像素的線性組合。

    卷積神經(jīng)網(wǎng)絡(luò)的稀疏連接具有正則化的效果,提高了網(wǎng)絡(luò)結(jié)構(gòu)的穩(wěn)定性和泛化能力,避免過度擬合,同時,稀疏連接減少了權(quán)重參數(shù)的總量,有利于神經(jīng)網(wǎng)絡(luò)的快速學(xué)習(xí),和在計算時減少內(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)重共享可以被視為兩個無限強的先驗(pirior),即一個隱含層神經(jīng)元在其感受野之外的所有權(quán)重系數(shù)恒為0(但感受野可以在空間移動);且在一個通道內(nèi),所有神經(jīng)元的權(quán)重系數(shù)相同。

    四、利用Python實現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)的可視化

    在本文中,將探討如何可視化卷積神經(jīng)網(wǎng)絡(luò)(CNN),該網(wǎng)絡(luò)在計算機視覺中使用最為廣泛。首先了解CNN模型可視化的重要性,其次介紹可視化的幾種方法,同時以一個用例幫助讀者更好地理解模型可視化這一概念。

    正如上文中介紹的癌癥腫瘤診斷案例所看到的,研究人員需要對所設(shè)計模型的工作原理及其功能掌握清楚,這點至關(guān)重要。一般而言,一名深度學(xué)習(xí)研究者應(yīng)該記住以下幾點:

    1.1 理解模型是如何工作的

    1.2 調(diào)整模型的參數(shù)

    1.3 找出模型失敗的原因

    1.4 向消費者/終端用戶或業(yè)務(wù)主管解釋模型做出的決定

    2.可視化CNN模型的方法

    根據(jù)其內(nèi)部的工作原理,大體上可以將CNN可視化方法分為以下三類:

    初步方法:一種顯示訓(xùn)練模型整體結(jié)構(gòu)的簡單方法

    基于激活的方法:對單個或一組神經(jīng)元的激活狀態(tài)進行破譯以了解其工作過程

    基于梯度的方法:在訓(xùn)練過程中操作前向傳播和后向傳播形成的梯度

    下面將具體介紹以上三種方法,所舉例子是使用Keras深度學(xué)習(xí)庫實現(xiàn),另外本文使用的數(shù)據(jù)集是由“識別數(shù)字”競賽提供。因此,讀者想復(fù)現(xiàn)文中案例時,請確保安裝好Kears以及執(zhí)行了這些步驟。

    研究者能做的最簡單的事情就是繪制出模型結(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

    還可以用一個更富有創(chuàng)造力和表現(xiàn)力的方式呈現(xiàn)模型結(jié)構(gòu)框圖,可以使用keras.utils.vis_utils函數(shù)完成模型體系結(jié)構(gòu)圖的繪制。

    另一種方法是繪制訓(xùn)練模型的過濾器,這樣就可以了解這些過濾器的表現(xiàn)形式。例如,第一層的第一個過濾器看起來像:

    top_layer = model.layers[0]plt.imshow(top_layer.get_weights()[0][:, :, :, 0].squeeze(), cmap='gray')

    一般來說,神經(jīng)網(wǎng)絡(luò)的底層主要是作為邊緣檢測器,當(dāng)層數(shù)變深時,過濾器能夠捕捉更加抽象的概念,比如人臉等。

    為了理解神經(jīng)網(wǎng)絡(luò)的工作過程,可以在輸入圖像上應(yīng)用過濾器,然后繪制其卷積后的輸出,這使得我們能夠理解一個過濾器其特定的激活模式是什么。比如,下圖是一個人臉過濾器,當(dāng)輸入圖像是人臉圖像時候,它就會被激活。

    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])

    同理,可以將這個想法應(yīng)用于所有的類別,并檢查它們的模式會是什么樣子。

    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])

    在圖像分類問題中,可能會遇到目標(biāo)物體被遮擋,有時候只有物體的一小部分可見的情況?;趫D像遮擋的方法是通過一個灰色正方形系統(tǒng)地輸入圖像的不同部分并監(jiān)視分類器的輸出。這些例子清楚地表明模型在場景中定位對象時,若對象被遮擋,其分類正確的概率顯著降低。

    為了理解這一概念,可以從數(shù)據(jù)集中隨機抽取圖像,并嘗試繪制該圖的熱圖(heatmap)。這使得我們直觀地了解圖像的哪些部分對于該模型而言的重要性,以便對實際類別進行明確的區(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ù)測呢?為此,可以使用顯著圖解決這個問題。顯著圖首先在這篇文章中被介紹。

    使用顯著圖的概念相當(dāng)直接——計算輸出類別相對于輸入圖像的梯度。這應(yīng)該告訴我們輸出類別值對于輸入圖像像素中的微小變化是怎樣變化的。梯度中的所有正值告訴我們,像素的一個小變化會增加輸出值。因此,將這些梯度可視化可以提供一些直觀的信息,這種方法突出了對輸出貢獻最大的顯著圖像區(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ù)第二個卷積層的輸出,這樣做是為了利用存儲在倒數(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')

    本文簡單說明了CNN模型可視化的重要性,以及介紹了一些可視化CNN網(wǎng)絡(luò)模型的方法,希望對讀者有所幫助,使其能夠在后續(xù)深度學(xué)習(xí)應(yīng)用中構(gòu)建更好的模型。 免費視頻教程:www.mlxs.top

    以上就是關(guān)于如何設(shè)計卷積神經(jīng)網(wǎng)絡(luò)相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。


    推薦閱讀:

    普通人怎么認證抖音黃v(抖音個人如何認證黃v,抖音黃v認證)

    如何建立自己的app平臺(如何建立自己的app平臺賬號)

    如何報考注冊安全工程師證書(如何報考注冊安全工程師證書有效期)

    冼衣機十大排名(冼衣機十大排名品牌)

    抖音在桌面上找不到了(抖音在桌面上找不到了蘋果)