第二周《卷積神經(jīng)網(wǎng)絡(luò)-實(shí)例探究》

P2.1為什么要進(jìn)行實(shí)例探究

就是列了一下提綱,告訴我們我會(huì)講這些內(nèi)容,可能盡管你不是搞圖像方向的,但是你可以借鑒里面的一些重要思想啊!


P2.2經(jīng)典網(wǎng)絡(luò)

第一個(gè)是1980年的LeNet-5,其中有幾個(gè)注意點(diǎn):

  • 當(dāng)時(shí)是沒有用ReLU的,用的是sigmod跟tanh作為非線性激活函數(shù);
  • 網(wǎng)絡(luò)的模式沿用至今:也就是(卷積+池化)+····+(卷積+池化)+全連接1+···+全連接n+輸出;
  • 可以發(fā)現(xiàn)隨著深度增加圖像的長寬變小,但是通道數(shù)確實(shí)增加的;
  • 當(dāng)時(shí)這個(gè)網(wǎng)咯的參數(shù)僅僅60K的樣子,現(xiàn)如今可是百萬級(jí)了啊!
  • 看論文的時(shí)候先看下第二節(jié)講的是系統(tǒng)架構(gòu),然后第三章有實(shí)驗(yàn)結(jié)果,have fun!

第二個(gè)是AlexNet,由于是Alex最先發(fā)現(xiàn)的所以以之命名,其特點(diǎn)如下:

  • 卷積核很大,stride也大;
  • 參數(shù)很多60 millions(遠(yuǎn)大于LeNet-5的60K);
  • 使用了ReLU非線性函數(shù);
  • 當(dāng)時(shí)計(jì)算能力問題,曾設(shè)計(jì)把網(wǎng)絡(luò)給2個(gè)GPU進(jìn)行計(jì)算,論文中有對(duì)如何分配、GPU之間如何通信都有一定的論述(這個(gè)部分就很工程了);
  • 論文里提到的local response normalizations實(shí)際中驗(yàn)證效果并不好,未有沿用。


    圖片.png

第三個(gè)是VGG-16,一句話總結(jié)的話就是它使得網(wǎng)絡(luò)的結(jié)構(gòu)變簡潔了。

  • 使用的卷積核總是3*3的,stride總是為1,圖像保持為same(加padding);
  • 最大池化總為2*2,stride=2不變,
  • VGG-16的16是指有16層,同理VGG-19就是19層,同樣有對(duì)應(yīng)論文的,但性能跟16層差不多,所以使用VGG-16的人偏多;
  • 138millions的參數(shù);
  • 通過pooling來減少圖片尺寸;
  • 作者認(rèn)為通過double卷積核數(shù)量可以更好的描述圖片,同時(shí)到達(dá)512個(gè)卷積核已是最多了。


P2.3 殘差網(wǎng)絡(luò)

講到了深度神經(jīng)網(wǎng)絡(luò)會(huì)有各種問題,比如梯度消失啊梯度爆炸啊什么的!

之前有說到了,由于sigmod激活函數(shù)的非線性會(huì)導(dǎo)致梯度消失或者爆炸;而是會(huì)消失還是會(huì)爆炸,這由激活函數(shù)跟權(quán)值一起決定,因此這里就算將激活函數(shù)改為ReLU但是也還是存在梯度消失或者爆炸的問題的,因此殘差網(wǎng)絡(luò)的出現(xiàn)對(duì)網(wǎng)絡(luò)深度地拓展具有重要意義。

殘差網(wǎng)絡(luò)的架構(gòu)如下圖所示,本來的深度模型就是輸入然后經(jīng)過:[線性操作(linear) + 激活函數(shù)(ReLU)]的疊加來構(gòu)成深度,這樣子很容易發(fā)生梯度的問題,原因上面也講了。

然后我們的殘差網(wǎng)絡(luò)結(jié)構(gòu)基本原理就是:把前面層的輸出直接短接到后面層那里去,需要注意的就是:插入的位置是在線性激活之后跟ReLU激活之前,如圖所示。

看到作者何凱明把這種接法叫short cut,還有種叫法是skip connection,其實(shí)這也好理解,你既然把信息傳遞到后面層,那么我很自然地想“我萌能不能把信息傳到后面的不同層呢?因?yàn)槲覀円膊恢谰唧w傳到哪層合適嘛!!!”

一般的殘差網(wǎng)絡(luò)如下圖所示:這里有5塊,每塊叫做殘差塊,這五塊疊加起來構(gòu)成了殘差網(wǎng)咯。


那你這個(gè)效果如何呢?

下圖表示的是:常規(guī)的深度網(wǎng)絡(luò),也就是plain,理論上是那條綠色的theory曲線,然而實(shí)際上卻是藍(lán)色那條reality曲線,這說明深度網(wǎng)絡(luò)中的機(jī)理我們了解的還并不是特別清楚,某種程度上來說還是個(gè)黑盒子

而我們的ResNet網(wǎng)絡(luò)表現(xiàn)出來的效果卻是跟理論曲線是相近的,也就是說殘缺信息(層間信息)是深度網(wǎng)絡(luò)的一個(gè)重要特性啊!


P2.4 為什么殘缺網(wǎng)絡(luò)表現(xiàn)如此之好?

從圖中可知,假設(shè)輸入x經(jīng)過一個(gè)big NN大型網(wǎng)絡(luò)之后輸出a[l],那么我們再在后面給他加上兩層網(wǎng)絡(luò),而且這兩層通過加上short cut線來構(gòu)成殘缺網(wǎng)絡(luò),因此(假設(shè)非線性激活函數(shù)數(shù)ReLU,也就是說激活輸出的值全部都是大于等于0的)從這往上數(shù)第三張圖寫出了殘差網(wǎng)絡(luò)的激活函數(shù),于是有:

a[l+2] = g(z[l+2] + a[l]) = g(w[l+2]*a[l+1] + b[l+2] + a[l]) **
往我們對(duì)W或者b進(jìn)行L2正則化就可以使得其均取值為0,這樣子的話,如圖所示最后的結(jié)果就是a[l],也就是說這個(gè)網(wǎng)絡(luò)直接就去掉了,這可是在深度增加的情況下,卻不增加計(jì)算量的啊!,其實(shí)這里就是在學(xué)習(xí)一個(gè)恒等函數(shù)啊,也就是一個(gè)自編碼器啊!

這也就是為什么常規(guī)的深度學(xué)習(xí)網(wǎng)絡(luò)在一定程度上學(xué)習(xí)著學(xué)習(xí)著效果反而不好了!因?yàn)樗麄儗W(xué)恒等函數(shù)很難啊!?

保證網(wǎng)絡(luò)功能(恒等函數(shù))的前提下提高效率(恒等函數(shù)參數(shù)為0,即減少參數(shù))!

殘差網(wǎng)絡(luò)的卷積操作是same操作,維度不同的話是需要變維度的!


有個(gè)細(xì)節(jié)就是,ResNet(下圖中)中的3*3卷積都是same的,因此才有Z[l+2] + a[l]是同維度的。conv、pool、softmax這些都是有的。

P2.5 1*1卷積核的作用?(網(wǎng)絡(luò)中的網(wǎng)絡(luò))

這玩意兒是啥?

  • 1*1的卷積核作用在一個(gè)通道(深度)為1的輸入,表現(xiàn)出來的就是單單把這個(gè)通道做一些線性放大縮小的作用,沒啥意義;

  • 但是放到通道為32的輸入時(shí),效果就不一樣了,我們直觀的理解就是不同通道的統(tǒng)一位置都會(huì)經(jīng)歷一個(gè)縮放效果,直觀感受就是加強(qiáng)或者弱化某些通道的輸出。

  • 這個(gè)叫做network in network


這玩意的作用是啥?

  • 如下圖所示,這玩意能在通道上降維(我們知道圖片大小的降維是通過pooling來實(shí)現(xiàn)的);
  • 我們的圖片是28*28*192的,我們的卷積核是1*1*192的,因此選擇n個(gè)卷積核就輸出多大的通道,這里選的是32通道,也就是最終實(shí)現(xiàn)通道降維的效果;
  • ps. 我們這里圖片大小是木有降維的哈!因?yàn)?*1啊!!!


P2.6 inception network(谷歌) motivation

  • 大概意思是我們選擇卷積核大小的時(shí)候可以選擇多種大小的共同使用,如1*3、3*3、3*5啊啥的!

  • 網(wǎng)絡(luò)的核心思想是:我們不去人工指定定卷積核的類型,也不去人工組合它們來使用,而是全部拿出來,甚至是直接max-pooling,讓網(wǎng)絡(luò)自動(dòng)去學(xué)習(xí)最優(yōu)的組合參數(shù),哪些卷積核是重要的,然后訓(xùn)練出參數(shù)來。

  • 注意的是:輸入是192個(gè)通道,卷積核大于1*1的記得是same(記得加padding),然后將輸出疊加起來構(gòu)成輸出的通道。


硬傷是啥?

  • 計(jì)算量是硬傷啊!,這僅取其中一小部分,就5*5卷積核這個(gè),28*28的圖片大小,要對(duì)應(yīng)32個(gè)卷積核;每個(gè)卷積核大小是5*5,然后對(duì)應(yīng)的深度是192,因此全部乘起來就是120millions的計(jì)算量啊!這可是12億了啊!注意,這還只是一小部分啊!

我們加入1*1卷積核之后的計(jì)算量看看好多少!

  • 下圖中有2個(gè)要點(diǎn),其一則解釋了為啥1*1卷積核叫做bottleneck layer,因?yàn)檫@玩意跟瓶子的脖子真的是長一模一樣啊!話說瓶頸的作用是啥?是限制流量吧!放置一次性倒出太多,而我們這里則是限制計(jì)算量的啊!計(jì)算量即流量,限制一下流出來少點(diǎn)!
  • 這里算了一下計(jì)算量大概是12millions左右,是之前的整整十分之一啊!這效率杠杠的!

思考:為什么不直接用32個(gè)1*1的卷積核得到28*28*32的輸出?我個(gè)人理解是,1*1主要的作用不是提取特征,而是進(jìn)行計(jì)算量壓縮的,因此必須要有個(gè)大一點(diǎn)的卷積核來提取特征啊!

小結(jié):inception module:當(dāng)你不想自己去選擇那些個(gè)卷積核類型合適的時(shí)候,say: let's do them all. and let's concatenate the results.

P2.7 inception網(wǎng)絡(luò)

inception模塊構(gòu)成如下圖所示,將前面激活函數(shù)的輸出,再組合出一些卷積核進(jìn)行輸出,將這些輸出疊起來就是輸出啦!是按通道這個(gè)維度疊起來喲~

這個(gè)才是論文中描述的整個(gè)網(wǎng)絡(luò)結(jié)構(gòu),單單就其中某個(gè)block來說的話就是上面那個(gè)!

  • 中間有些池化層,是為了調(diào)整維度的;
  • 中間有兩路支路,也是softmax直接輸出的,這個(gè)是用來做預(yù)測的,放置過擬合,個(gè)人認(rèn)為是硬件電路里面的測試點(diǎn)吧!
  • 該網(wǎng)絡(luò)是谷歌的輸出,叫g(shù)oogleLeNet是對(duì)LeNet的致敬。

總結(jié):

  • Inception:注意是大寫開頭,這個(gè)是官方引用的電影梗!“我們需要進(jìn)入更深層次!”
  • 版本更新成V2、V3、V4,還有個(gè)甚至是跳躍連接,效果不錯(cuò)!

P2.8 我們不要自己重復(fù)造輪子!

用好github網(wǎng)站!

P2.9 遷移學(xué)習(xí)

  • 用別人訓(xùn)練好的模型,來作為我們模型的預(yù)訓(xùn)練部分,這相對(duì)于隨機(jī)初始化來說能更快收斂!
  • 數(shù)據(jù)集有ImageNet、MS COCO、pascal

問題:我們目標(biāo)都不一樣的話還能隨便用別人的模型嘛?怎么使別人的模型適應(yīng)我們的任務(wù)?具體細(xì)節(jié)是什么?

  • 比如要識(shí)別貓,如下圖所示,我們我識(shí)別這兩個(gè)動(dòng)物是不是貓,有三種可能,Tigger是,misty是或者兩個(gè)都不是,因此softmax輸出三個(gè)值;

  • 第一步我們先從github上下載代碼,最重要的是記得下載權(quán)值

  • 第二步就是去掉他們的softmax函數(shù),然后加上自己的!這個(gè)時(shí)候把別人的網(wǎng)絡(luò)給凍結(jié)起來不訓(xùn)練,而是只訓(xùn)練我們自己的softmax就好!這樣子的話可以實(shí)現(xiàn)用少量的數(shù)據(jù)樣本就可以獲得很好的效果

  • 不同的框架有不同的凍結(jié)方式,比如有的就是設(shè)置freeze = 1還有的就是trainableParameter = 0等等此類!

  • 由于別人這個(gè)網(wǎng)絡(luò)就是一個(gè)固定的函數(shù)了嘛!一個(gè)預(yù)訓(xùn)練的操作就是把圖片提前經(jīng)過這個(gè)函數(shù),得到的是這個(gè)網(wǎng)絡(luò)輸出的特征嘛!我們把這個(gè)特征給存起來到硬盤,那么我們是不是只需要訓(xùn)練我們自己的softmax函數(shù)就好了呀!這樣子能大大提高訓(xùn)練效率的啊!

  • 這里說道,假如你的數(shù)據(jù)集很小,你可以把整個(gè)網(wǎng)絡(luò)凍結(jié)來訓(xùn)練;但是假如你的數(shù)據(jù)集中等,那么就不要浪費(fèi)了,因?yàn)槲覀兛梢杂?xùn)練出更有針對(duì)性的特診啊!因此,我們一般在中等數(shù)據(jù)集時(shí)只凍結(jié)前面的淺層特征部分,后面復(fù)雜特診部分你都要去訓(xùn)練,用別人已有的結(jié)構(gòu)也好,或者你自己構(gòu)建的結(jié)構(gòu)也好,總之,不要把中等數(shù)據(jù)集里面的信息量給浪費(fèi)了!

  • 大數(shù)據(jù)集的時(shí)候,別人網(wǎng)絡(luò)的所有層都要去訓(xùn)練喲!用別人的框架來訓(xùn)練自己的目標(biāo)!更有針對(duì)性!

P2.10 數(shù)據(jù)擴(kuò)充(數(shù)據(jù)增強(qiáng))

第一種:

  • 鏡像
  • 隨機(jī)截取部分圖像
  • 旋轉(zhuǎn)、剪切、局部扭曲····(操作麻煩,實(shí)際中使用較少)


第二種:

  • 色彩轉(zhuǎn)換:就是把RGB的值分別添加一個(gè)失真值,實(shí)際中這個(gè)失真值是基于某種分布的(比如是對(duì)某些場景的覆蓋)!這個(gè)其實(shí)不就是寫測試用例么?!用來測試我們模型的!
    PCA顏色增強(qiáng)(Alexnet論文中有):就是分析發(fā)現(xiàn)R、G的顏色占得比重多一點(diǎn),B少一點(diǎn),那么我就把R、G調(diào)少多一點(diǎn),B調(diào)少少一點(diǎn),最終達(dá)到均衡,很容易理解的。

數(shù)據(jù)生成的軟件流程如下所示:開一個(gè)線程專門做數(shù)據(jù)產(chǎn)生的,從硬盤讀數(shù)據(jù)然后構(gòu)造出我們要的數(shù)據(jù)(mini batch),然后送給其他線程或者GPU去執(zhí)行訓(xùn)練操作。

總結(jié):圖像顏色失真大小、分布等這些是超參數(shù),隨機(jī)剪切大小、模式也是超參數(shù),這些是需要我們?nèi)藶楦鶕?jù)實(shí)際場景來設(shè)計(jì)的,因此,具體場景具體分析吧!童鞋們!

P2.11計(jì)算機(jī)視覺現(xiàn)狀

數(shù)據(jù)量和手工工程的關(guān)系:
數(shù)據(jù)量少的時(shí)候我們需要人工構(gòu)建特征,數(shù)據(jù)量大(當(dāng)然在機(jī)器視覺領(lǐng)域我們從來不認(rèn)為數(shù)據(jù)量是足夠的)的時(shí)候就構(gòu)建復(fù)雜的網(wǎng)絡(luò)架構(gòu)來實(shí)現(xiàn)任務(wù);

  • 當(dāng)我們有很多數(shù)據(jù)的時(shí)候,就不會(huì)花時(shí)間去建立手工特征,而是花時(shí)間去建立學(xué)習(xí)系統(tǒng)

  • 當(dāng)我們擁有較少數(shù)據(jù)的時(shí)候,一般做法就是人工構(gòu)建很多很復(fù)雜的特怔或者叫做“超參數(shù)”,但是其實(shí)還是有種學(xué)習(xí)系統(tǒng)是可以借用的,比如上面說到的遷移學(xué)習(xí):即用別人的模型來訓(xùn)練你的模型,而本質(zhì)上則是利用==相似數(shù)據(jù)==來加速及提高你的學(xué)習(xí)系統(tǒng)

發(fā)論文的算法都是在一個(gè)標(biāo)準(zhǔn)測試集上的表現(xiàn),并不是在真實(shí)的生產(chǎn)環(huán)境中產(chǎn)生;

其中他們用到的一些小tips如下:

集成Ensembling:

  • 構(gòu)建好幾個(gè)神經(jīng)網(wǎng)絡(luò)模型,然后把輸出加權(quán)平均,這會(huì)使得你在基準(zhǔn)上的提高1%~2%的精度;但是,由于計(jì)算量也加大了好幾倍,因此這種只適合在競賽中使用,生產(chǎn)中使用就是浪費(fèi)了啊!

多剪切:

  • 就是把一張圖片進(jìn)行鏡像之后,然后區(qū)域性剪切成小圖片,然后送入模型進(jìn)行訓(xùn)練,也就是擴(kuò)充數(shù)據(jù)集啊!
  • 10-corp法:把圖片鏡像為兩張圖,然后第一張取中心區(qū)域,然后基于此中心區(qū)域再次進(jìn)行取左上角、左下角、右上角、右下角四個(gè)區(qū)域,因此一張圖最后得到5張剪切圖;鏡像的那張也類似,總共十張圖,因此叫10-crop。將之送進(jìn)模型進(jìn)行訓(xùn)練,并將十個(gè)輸出結(jié)果平均來作為最終的結(jié)果


使用開源代碼:

  • 使用論文中的網(wǎng)絡(luò)架構(gòu);
  • 應(yīng)當(dāng)學(xué)習(xí)開源的模型框架,使用他們的代碼,因?yàn)樗麄円呀?jīng)把如學(xué)習(xí)率這樣的超參數(shù)調(diào)好了,繁瑣的工作都幫你做好了!
  • 使用別人已經(jīng)訓(xùn)練好的模型,然后在你的數(shù)據(jù)集上進(jìn)行精調(diào),這可使得你的模型在應(yīng)用程序中運(yùn)行的更快。

總結(jié)

  • 大量的計(jì)算機(jī)視覺架構(gòu)的學(xué)習(xí),并大致說了一下為啥有效;
  • ···
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容