下篇傳送門(mén):
吳教授的CNN課堂:進(jìn)階 | 從LeNet到殘差網(wǎng)絡(luò)(ResNet)和Inception Net
等了一個(gè)月,吳教授的Deeplearning.ai的第四部分斑鸦,也就是關(guān)于卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,簡(jiǎn)寫(xiě)CNN)的課愕贡。
作為吳教授的忠實(shí)門(mén)徒(自封),除了在課堂上受到吳教授秀恩愛(ài)暴擊外巷屿,當(dāng)然也要好好做筆記固以。雖然之前也有過(guò)一些CNN基礎(chǔ),但這次收益還是挺多的嘱巾。
CNN目前主要用于憨琳?
CNN目前主要用于CV領(lǐng)域,也就是計(jì)算機(jī)視覺(jué)領(lǐng)域旬昭。
很多當(dāng)前最先進(jìn)的計(jì)算機(jī)視覺(jué)方面的應(yīng)用篙螟,如圖片識(shí)別,物體檢測(cè)问拘,神經(jīng)風(fēng)格轉(zhuǎn)換等等闲擦,都大量使用到了CNN。
而且不光是CV領(lǐng)域场梆,很多CNN在CV領(lǐng)域應(yīng)用的很多技巧墅冷,其他領(lǐng)域也可以從其中借鑒到很多,如自然語(yǔ)言處理或油。
為什么要用CNN
首先寞忿,假如我們要進(jìn)行一個(gè)圖像識(shí)別任務(wù)?這里就不用已經(jīng)都快被玩爛了的的MNIST顶岸,用吳教授課上的SIGNS數(shù)據(jù)集(包含了用手勢(shì)表示的從0到5的圖片)腔彰。目標(biāo)任務(wù)就是叫编,給一個(gè)手勢(shì),識(shí)別出代表數(shù)字幾霹抛。
如果是上過(guò)之前吳教授機(jī)器學(xué)習(xí)的同學(xué)的話(huà)搓逾,那么可能會(huì)問(wèn),為什么要用CNN呢杯拐?
何不直接像機(jī)器學(xué)習(xí)課里面一樣霞篡,將圖片拍扁(flatten),也就是直接將(高 x 寬 x 通道(如RGB))的圖片展成一個(gè)一維向量呢端逼。如SIGNS朗兵,本來(lái)是64x64x3的圖片,我們將它拍成1x12288的向量顶滩。
之后直接輸入全連接網(wǎng)絡(luò)(即一般我們認(rèn)為的神經(jīng)網(wǎng)絡(luò))余掖,中間加點(diǎn)隱層,最后一層用softmax壓一下直接輸出結(jié)果就好了礁鲁。
我們可以這樣設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)盐欺,第一層12288個(gè)單元,然后中間三個(gè)隱層仅醇,分別是1028個(gè)單元找田、256個(gè)單元、64個(gè)單元着憨,最后一層6個(gè)單元墩衙,也就是我們的分類(lèi)數(shù)。
搭建好網(wǎng)絡(luò)后甲抖,然后訓(xùn)練漆改。這樣子確實(shí)也可以得到還過(guò)得去的結(jié)果,大概70~80%准谚。但是相信大家也發(fā)現(xiàn)了挫剑,這樣子搭建的網(wǎng)絡(luò)需要很多很多參數(shù),如這個(gè)例子里面
也就是大約一千三百萬(wàn)個(gè)參數(shù)柱衔。
而這個(gè)例子還只是很小的圖片樊破,因?yàn)橹挥?4x64大小,而現(xiàn)在隨意用手機(jī)拍張照片就比這大很多唆铐。處理這些圖片時(shí)哲戚,用全連接網(wǎng)絡(luò)搭建出來(lái)的網(wǎng)絡(luò)的參數(shù)個(gè)數(shù),將會(huì)是一個(gè)天文數(shù)字艾岂,不光優(yōu)化困難顺少,而且性能也不怎么樣。
而這時(shí)候,就是CNN大展神威的時(shí)候了脆炎。只需要多少參數(shù)呢梅猿?之后再揭曉揭曉。
CNN基礎(chǔ):卷積層
卷積 Convolution
CNN網(wǎng)絡(luò)最主要的計(jì)算部分就是首字母C秒裕,卷積(Convolutional)袱蚓。
如下圖,這里的一次卷積運(yùn)算指的是几蜻,當(dāng)我們有一個(gè)過(guò)濾器(filter)喇潘,即下圖移動(dòng)的方塊,將這個(gè)方塊對(duì)應(yīng)要處理的輸入數(shù)據(jù)的一部分入蛆,然后位置一一對(duì)應(yīng)相乘响蓉,然后把結(jié)果再相加得到一個(gè)數(shù)硕勿。
一個(gè)過(guò)濾器對(duì)一張圖片進(jìn)行卷積運(yùn)算時(shí)哨毁,往往要進(jìn)行多次卷積運(yùn)算,對(duì)一部分進(jìn)行計(jì)算完之后源武,然后移動(dòng)一點(diǎn)距離再計(jì)算扼褪,繼續(xù)移動(dòng),計(jì)算... 直到處理完整張圖片粱栖。
為什么叫做過(guò)濾器呢(也有叫做kernel(核)的)话浇?
因?yàn)槲覀兛梢园衙總€(gè)過(guò)濾器,當(dāng)做是設(shè)定了一定條件的特征檢測(cè)器闹究,把不屬于檢測(cè)條件的都過(guò)濾掉幔崖。只有當(dāng)前卷積的區(qū)域符合這個(gè)過(guò)濾器設(shè)置的條件時(shí),卷積計(jì)算結(jié)果才會(huì)得到一個(gè)比較大的數(shù)渣淤。
舉個(gè)栗子赏寇,如用于檢測(cè)垂直和水平邊線(xiàn)的過(guò)濾器。
可以試著自己計(jì)算一下价认。如下圖嗅定,如果用灰度表示的話(huà),黑的地方是255用踩,白的地方是0渠退。用上面的Gx來(lái)卷積下面這張圖的話(huà),就會(huì)在中間黑白邊界獲得比較大的值脐彩。
而CNN中會(huì)有很多個(gè)過(guò)濾器碎乃,每個(gè)過(guò)濾器對(duì)圖片進(jìn)行卷積后,會(huì)得到下一個(gè)結(jié)果的一個(gè)通道惠奸。CNN厲害的地方在于荠锭,過(guò)濾器的特征并不是人為設(shè)定的,而是通過(guò)大量圖片自己訓(xùn)練出來(lái)的晨川。
這樣也就增加了它的靈活性证九,而且因?yàn)橐曈X(jué)底層特征的兼容特性删豺,因此也保證了遷移學(xué)習(xí)的可能。
步長(zhǎng)(Stride)與填充(Padding)
上面說(shuō)了卷積計(jì)算愧怜,但還有一些小的細(xì)節(jié)沒(méi)提呀页。
如果用(f, f)的過(guò)濾器來(lái)卷積一張$(h, w)$大小的圖片,每次移動(dòng)一個(gè)像素的話(huà)拥坛,那么得出的結(jié)果就是(h-f+1, w-f+1)的輸出結(jié)果蓬蝶。f是過(guò)濾器大小,h和w分別是圖片的高寬猜惋。
如果每次不止移動(dòng)一個(gè)像素丸氛,而是兩個(gè)像素,或者是s個(gè)像素會(huì)怎么樣呢著摔。
那么結(jié)果就會(huì)變?yōu)?/p>
這個(gè)s被稱(chēng)為步長(zhǎng)缓窜。
但是如果每次這樣子進(jìn)行卷積的話(huà),會(huì)出現(xiàn)一個(gè)問(wèn)題谍咆。只要是$f$和$s$的值比1要大的話(huà)禾锤,那么每次卷積之后結(jié)果的長(zhǎng)寬,要比卷積前小一些摹察。
因?yàn)檫@樣子的卷積恩掷,實(shí)際上每次都丟棄了一些圖片邊緣的信息。一直這樣卷積的話(huà)供嚎,一旦卷積層過(guò)多男旗,就會(huì)有很多信息丟失栽惶。為了防止這種情況的發(fā)生莫瞬,我們就需要對(duì)原來(lái)的圖片四周進(jìn)行填充(padding)歧蒋。
一般都會(huì)用“0”值來(lái)填充,填充1就代表對(duì)周?chē)畛湟蝗Τナ铮缟蠄D氮凝。填充2就填充兩圈,填充為p就是p圈望忆,長(zhǎng)寬各增加2p罩阵。
有了填充之后,每次卷積后的大小會(huì)變?yōu)?/p>
此時(shí)假設(shè)卷積后高不變
那么我們可以獲得
假設(shè)s步長(zhǎng)為1启摄,那么
也就是如果過(guò)濾器的高h(yuǎn)=5的話(huà)稿壁,那么為了保持輸出高寬不變,那么就需要p=2歉备。
上面這種保持卷積前后高寬不變的填充方式叫做"Same(相同)填充"傅是。
分?jǐn)?shù)情況
之后來(lái)討論一下分?jǐn)?shù)情況吧。
萬(wàn)一f是4或者6這樣的數(shù)呢,那么得到的p豈不是分?jǐn)?shù)喧笔,怎么填充帽驯。答案是,那f就不要取偶數(shù)嘛书闸。這就是為什么一般默認(rèn)的過(guò)濾器大小都是5尼变、7、11這樣的單數(shù)浆劲。
好的嫌术,解決了填充的情況,那么如果輸出的
是分?jǐn)?shù)怎么辦牌借。如h=6,f=3,p=0,s=2的情況下度气,按照公式計(jì)算會(huì)得到2.5。一般的處理是膨报,只取整數(shù)部分磷籍。
而這種p=0,然后結(jié)果取整數(shù)部分的處理方式丙躏,叫做"Valid(有效)填充"择示。
CNN基礎(chǔ):池化(Pooling)層
除了上面的卷積層束凑,CNN里面還有一個(gè)很重要的部分晒旅,池化層。
一般會(huì)跟在卷積層之后汪诉,主要用到的Pooling層主要由有Max Pooling和Average Pooling, 也就是最大池化和平均池化废恋。
其實(shí)概念很簡(jiǎn)單,最大池化就如下圖扒寄。假設(shè)有一個(gè)2x2的窗口鱼鼓,每次移動(dòng)步長(zhǎng)也為2,每次對(duì)窗口里的數(shù)取最大值该编,然后輸出迄本。
同樣的平均池化,則就把取最大值這個(gè)操作換成取平均值就行了课竣。
除了上面兩種池化方式嘉赎,當(dāng)然還有一些其他的池化方法,如k-Max Pooling之類(lèi)的于樟,但是應(yīng)用很少公条。在最大和平均兩個(gè)里面,也是最大池化比較常用迂曲。
池化層輸出大小的轉(zhuǎn)換也和卷積層比較類(lèi)似靶橱,用
來(lái)計(jì)算,一般池化層不用填充。而且池化層沒(méi)有要需要訓(xùn)練的參數(shù)关霸。
CNN基礎(chǔ):組合
有了卷積層和池化層兩大部件之后传黄,就只剩下組合了。下圖是吳教授手繪LeNet-5網(wǎng)絡(luò)队寇。
結(jié)構(gòu)很簡(jiǎn)單大概是這樣子Input -> Conv1 -> Pool1 -> Conv2 -> Pool2 -> (Flatten) -> FC3 -> FC4 -> Output
尝江。
Conv是卷積層,Pool是池化層英上,F(xiàn)C指的是全連接網(wǎng)絡(luò)層(Full-Connected)炭序。其中Flatten指的是,因?yàn)榫矸e網(wǎng)絡(luò)輸出的數(shù)據(jù)形狀(3維)苍日,和緊接著的全連接網(wǎng)絡(luò)的輸入形狀(1維)不吻合惭聂,所以需要進(jìn)行一些處理。
就是之前在直接用全連接網(wǎng)絡(luò)提到的相恃,把卷積網(wǎng)絡(luò)的輸出拍扁(flatten)辜纲,把三維的拍成一維,之后再輸入全連接網(wǎng)絡(luò)拦耐。
建議大家可以按照前面提到的形狀變換公式耕腾,還有吳教授的手繪圖,親自把LeNet-5過(guò)一遍杀糯,對(duì)之后編程CNN很有幫助的扫俺。
關(guān)于前面的參數(shù)個(gè)數(shù)的問(wèn)題,用上面這個(gè)LeNet-5來(lái)處理的話(huà)
也就是大概114萬(wàn)固翰。
一下子就縮小了一個(gè)數(shù)量級(jí)狼纬,當(dāng)然對(duì)于越大的圖片這個(gè)差還會(huì)更加大。
結(jié)尾
這就是吳教授CNN課堂的第一周上的內(nèi)容了骂际。這次在通道這個(gè)概念有了很多新的看法疗琉。
如果想要自己修的話(huà),直接Coursera Deeplearning ai就能搜索到課程歉铝。
Coursera小技巧盈简,點(diǎn)擊注冊(cè),不想付錢(qián)的話(huà)太示,點(diǎn)左下角的那個(gè)小小的旁聽(tīng)就好了柠贤。之后想拿證的時(shí)候再充值。
習(xí)題很簡(jiǎn)單先匪,這里是我的練習(xí)解答种吸,如有困難可以參考。 repo