AlexNet结构详解(引用MrGiovanni博士)
Reference.
Krizhevsky A, Sutskever I, Hinton G E. ImageNet Classification with Deep Convolutional Neural Networks [J]. Advances in Neural Information Processing Systems, 2012, 25(2):2012.
https://code.google.com/p/cuda-convnet/
說來慚愧,看了深度學習快五個月了,前幾周的Paper Review上剛剛注意到AlexNet,那果斷用啊,話說LeNet雖然好用,那也是快20年以前的網絡結構了,AlexNet是2012年的結構,不管怎么說肯定好呀。貼一張網絡結構的歷史
鬧,這個AlexNet就是我今天要講的東西
@Feifei Li真是厲害呀,弄了一個免費的ImageNet,又開始弄分類比賽,省了一大筆廣告費就把自己的團隊推到研究的最前沿,第一時間掌握到最新的科研動態,而且自己的引用率又急劇飆升,你看現在哪個圖像分類研究團隊要是沒有引用到她的ImageNet或者相關的研究成果都不好意思投頂級期刊。
不說Feifei女神了,就說AlexNet也是一個比較舊舊的網絡結構了,2014年的ImageNet冠亞軍GoogLeNet和VGG也是現在特別熱門的網絡結構了,2015年的百度(媽逼居然給我來個學術造假,我擦百度趕緊去死吧!!!丟死人了知道嗎!!!全世界都知道了!!!),接下來的深度學習研究方向主要就是
1)Fine-Tuning,
2)大規模GPU并行加速和
3)把CNN嵌入移動端來使用。
(當然還有好多研究方向我不知道嘍。。)
- 大規模GPU加速這個事兒很燒錢的,一般就是那種大公司(Google,[Baidu]<-這貨死了,Microsoft等)會去做,我們這種本科生用一塊特斯拉的GPU就算很不錯了。
- 因此,Fine-Tuning是最近的研究人員主要的攻關方向,思路很簡單啊,既然Feifei女神把廣義上的圖像分類做絕了,那我們就做小范圍的圖像分類,類比一下就像[Baidu]<-這貨死了把搜索引擎做絕了,那并不是搜索就沒得做了,像淘寶,它也做了搜索引擎,只是僅限于商品,那請問現在要搜商品你會去[Baidu]<-這貨死了的搜索框還是淘寶的搜索框呢,相信你已經懂了。在學術上,淘寶上這種搜索叫做“垂直搜索”,其他垂直搜索就比如說是校園網的站內搜索,你可以很精準地搜到和學校相關的信息,當然你也不是去[Baidu]<-這貨死了那兒搜的。Fine-Tuning的意思就是用現有的學習完的廣義圖像網絡參數作為新網絡的初始化,然后扔進去一些你要做的圖像的訓練集去訓練,得到一個你要的特異性的網絡。舉例子:我想用CNN來做礦泉水品牌的分類,那就在CIFAR訓練完的網絡作為初始網絡,然后用各個品牌的礦泉水來訓練,訓練一個只對“礦泉水品牌分類”問題超級好的網絡。這兒注意哦,CIFAR里頭肯定也有礦泉水,但是沒這么細,我做的就是將原來這個非特異性的網絡訓練成了一個對礦泉水敏感的網絡。
- 把CNN嵌入到移動端要做的就是剪枝唄,把訓練完的網絡盡量用很少的內存來存儲,因為手機慢嘛,方法可以用到很多哦,比如哈希編碼,Deep compression,Squeeze net?什么的,這個里面比較有說頭,接下來就是安卓、iOS編程的事兒了。
就這個套路,要是你想發一個弱弱國內期刊的話怎么辦知道嗎,找一個冷門的分類問題,超多的其實,舉例:1)用CNN根據姨媽紅的顏色判斷來事兒第幾天了,2)用CNN來判斷臉上的是青春痘還是痔瘡,或者3)用CNN來判斷Baidu做了這么多缺德事該不該滾蛋 等等,都是很不錯的題材,你去收集一堆(海量哦)訓練集,用Fine-Tuning的方法訓練一個網絡,寫論文稍微包裝一下,okay,完事兒。你會發現現在一些很水的深度學習論文就是這樣做的。呵呵。:)
好了,不吐槽了,說正經的。AlexNet是2012年ImageNet競賽冠軍獲得者Alex Krizhevsky設計的,這個網絡結構和LeNet有什么區別呢?
1 卷積神經網絡的組成部分
套路是一樣的,先介紹一下深度學習的卷積神經網絡(ConvNet)的組成吧。
1.1 卷積層(Convolutional Layer)
這個不多說,學過信號的都大概知道卷積是個什么玩意兒,不懂的話可以參考額。。。別參考了,好好學基礎知識去吧~要說明的一點是這個卷積的過程很好地模擬了人的視覺神經系統的過程,聽老師說人眼看東西也就是一個卷積的過程哦,這個我可不能保證哦~
卷積的動態過程
1.2 降采樣層(Pooling Layer)
降采樣就是用一個值來代替一塊區域,這個值可以是區域的平均值,最大值,最小值等等,反正有代表性就好了,這個層的目的就是減少數據量。
降采樣過程
1.3 激活函數層(Activation Layer)
激活函數的作用是把卷積后的結果壓縮到某一個固定的范圍,這樣可以一直保持一層一層下去的數值范圍是可控的。比如一些常見的激活函數
- sigmoid:控制在[0, 1]
- tanh:控制在[-1, 1]
- ReLU:控制在[0, 正無窮]
- 還有好多新的激活函數,這兒就不舉例了,知道它們的作用就OK
我用的是ReLU激活函數
1.4 標準化層(Normalization Layer)
沒什么大不了的,就用了個公式來標準化一下
1.5 全連接層(Full Connected Layer)
全連接層給人的感覺就是人工神經網絡的那樣,把所有的網絡結點都用一些帶權重的值連接起來。這個層一般出現在CNN的后面部分,這個層很長,可以作為圖像的特征向量來用,也有論文是把全連接層放到SVM,RF,Adaboost,ANN等傳統的分類器里頭分類,來代替CNN最后的softmax層,那我也做過這個實驗,得到的結果并不好,我不知道這些大牛是怎么弄的。這兒打個問號?
顧名思義,所有的結點都是連接起來的,這兒的權重會特別多,因為全連接了嘛
1.6 扔掉層(Dropout Layer)
這個層我不知道怎么翻,反正作用就是把一些沒用的結點給扔掉。
- 這個思路參考了人的大腦的實際運行狀態,研究表明大腦在分析圖像的過程中真正被激活的神經元并不多,具體哪些被激活靠得就是先前的學習,和留下來的記憶。那如果沒有這個dropout層,我們的CNN在判斷所有的圖像是相當于所有的結點都激活了,這樣和現實的情況不符,所以我們要模擬大腦,把一下沒什么用的結點給扔掉。
- 這個層的作用是加快運算速度,防止過擬合,讓網絡更加的普適,更加有所謂的“魯棒性”——裝個逼,其實就是更好哈哈:)
- 實現的方法是設置一個閾值,如果這個結點與結點之間的權重高于這個值,那么說明這是強關系,我們保留,如果權重低于這個值,說明關系不大,我們把它扔掉得了。!!這個實現方法說錯了,特別感謝@hzzzol同學的指正,正確的解釋應該是:
- Dropout是在訓練過程中以一定概率1-p將隱含層節點的輸出值清0,而用bp更新權值時,不再更新與該節點相連的權值。什么意思,就是這個就是個概率問題,和權值的大小,激活程度無關哦,被抽中的結點無條件被丟掉。(Dropout簡單理解、DropConnect簡單理解)
由于權重太多,那我們就把一些沒用的扔掉
- 這個層常常出現在全連接層的地方,因為全連接層中的結點與結點連接太多了,消耗了CNN中絕大多數的內存資源,而這中間有一大部分是沒有必要的。
你看,最后幾層多浪費!
2 LeNet與AlexNet
以上是對CNN的一個簡單的闡述,當然啰,比較瑣碎,一個完整的CNN結構是由多個1)卷積層,2)降采樣層,3)激活函數層,4)標準化層,5)全連接層和6)扔掉層 有序地拼接而成的,那么又來了這個問題,LeNet和AlexNet的拼法到底有什么不同呢?
2.1 LeNet
再次祭出這幅經典的LeNet圖
太經典啦!
LeNet的成功應用案例是手寫字體的識別,就是給一堆手寫的阿拉伯數字,用網絡來判斷這是個什么字。應用的就是當時的郵局等地方,還有門牌號。其實傳統的分類器已經可以做到很好的水平了(正確率在96%吧大概),那LeNet作為新起之秀,正確率達到了98%,那在當時就很有名啊,賺了好多好多錢呢,然后卷積神經網絡的研究就開始火了呀。到了2012出現AlexNet,以卷積神經網絡為核心的深度學習就開始燙了哈哈。
我們可以看到LeNet中有1)卷積層,2)降采樣層(就是Subsampling),和3)全連接層,當然嘍,應該是由激活函數層的,只是圖中沒有畫,當時用的應該是sigmoid函數吧,反正現在不用了。你可以發現剛剛提到的扔掉層(dropout)和標準化層沒有用誒,為什么呢,因為
當時還沒有這個啊==b
可以注意到LeNet的
- 輸入尺寸是32*32像素
- 卷積層:3個
- 降采樣層:2個
- 全連接層:1個
- 輸出:10個類別(數字0-9的概率)
然后softmax根據網絡輸出,也就是這個圖像是0-9的概率值大小來判斷輸入的是多少,比如輸出的是個結點,4的值是0.9,其他都是0.001這樣的,那么就是說這個輸入的圖像就是4了,然后根據這個輸出的概率,我們可以排列一下輸入圖像輸入某一類的概率值,從大到小,取3個比如,ImageNet競賽的規則就是這三個里頭有一個是對的就當你的網絡預測是對的,不然就是預測錯誤。
2.2 AlexNet
我個人的感覺是AlexNet更強調了全連接層的作用,它用了兩個全連接層,那么為了減少權重的數目,才引出了dropout這個概念,其他的區別其實不能叫做區別
- 輸入尺寸:227*227像素(因為競賽的需要)
- 卷積層:好多(因為輸入尺寸的需要)
- 降采樣層:好多(因為輸入尺寸的需要)
- 標準化層:這個反正就是一個公式
- 輸出:1000個類別(因為競賽的需要)
這兒要說明一下:不要以為卷積層的個數、降采樣層的個數、卷積核的尺寸、卷積核的個數這些網絡細節會對最后的訓練結果產生什么了不得的影響,這些就按照你的輸入圖像的尺寸來就行了。沒有什么說頭,你也可以去參考現在已經有的網絡結構去設計,都可以的。這些參數大多都是手動調的,依據就是看看學習的結果如何。
放一下AlexNet的結構圖
整體AlexNet結構圖
卷積神經網絡的結構并不是各個層的簡單組合,它是由一個個“模塊”有機組成的,在模塊內部,各個層的排列是有講究的。比如AlexNet的結構圖,它是由八個模塊組成的。
模塊一
模塊二
模塊一和模塊二是CNN的前面部分,
卷積-激活函數-降采樣-標準化
構成了一個計算模塊,這個可以說是一個卷積過程的標配,CNN的結構就是這樣,從宏觀的角度來看,就是一層卷積,一層降采樣這樣循環的,中間適當地插入一些函數來控制數值的范圍,以便后續的循環計算。
模塊三、四
模塊三和四也是兩個卷積過程,差別是少了降采樣,原因就跟輸入的尺寸有關,特征的數據量已經比較小了,所以沒有降采樣,這個都沒有關系啦。
模塊五
模塊五也是一個卷積過程,和模塊一、二一樣事兒的,就是重復重復。好了,可以總結一下,模塊一到五其實都是在做卷積運算,根據輸入的圖像尺寸在適當決定哪幾層要用降采樣。然后再加上一些必要的函數來控制數值,就可以了。模塊五輸出的其實已經是6\6的小塊兒了(一般我設計都是到1\1的小塊,由于ImageNet的圖像大,所以6\6也正常的。)
為什么原來輸入的227\227像素的圖像會變成6\*6這么小呢,主要原因是歸功于降采樣,當然啰,卷積層也會讓圖像變小,如圖,一層層的下去,圖像越來越小
CNN過程
模塊六
模塊七、八
模塊六和七就是所謂的全連接層了,全連接層就和人工神經網絡的結構一樣的,結點數超級多,連接線也超多,所以這兒引出了一個dropout層,來去除一部分沒有足夠激活的層,其實我記的沒錯的話這個思想在ANN里頭早就有了。
模塊八就是一個輸出的結果,結合上softmax做出分類。有幾類,輸出幾個結點,每個結點保存的是屬于該類別的概率值。:)
總結
以上是生活随笔為你收集整理的AlexNet结构详解(引用MrGiovanni博士)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【飞秋】存储过程与业务类实现业务的差异比
- 下一篇: 用函数fopen_s打开数据文件