DNN结构演进History—CNN( 优化,LeNet, AlexNet )
???????? 本文相對于摘抄的文章已經有大量的修改,如有閱讀不適,請移步原文。
???????? 以下摘抄轉自于維基:基于深度學習的圖像識別進展百度的若干實踐
?? ????? 從沒有感知域(receptive field) 的深度神經網絡,到固定感知域的卷積神經網絡,再到可變感知域的遞歸神經網絡,深度學習模型在各種圖像識別問題中不斷演進。
??????? 曾經爆炸式增長的參數規模逐步得到有效控制,人們將關于圖像的先驗知識逐漸用于深度學習,大規模并行化計算平臺愈加成熟,這些使我們能夠從容應對大數據條件下的圖像識別問題。
? ?? ?? CNN的二維處理遞進結構天然適合圖像處理,直接把圖像模式識別問題從特征提取-模式識別壓縮為模式識別一步完成,和傳統模式識別方法框架上都已經有了本質的區別。
?
用于ImageRecognition的CNN:
????? ? 參考鏈接:http://blog.csdn.net/zouxy09/article/details/8781543/
??????? 維基解釋:卷積神經網絡(Convolutional Neural Network)由一個或多個卷積層和頂端的全連通層(對應經典的神經網絡)組成,同時也包括關聯權重和池化層(pooling layer)。這一結構使得卷積神經網絡能夠利用輸入數據的二維結構。
?????? 與其他深度學習結構相比,卷積神經網絡在圖像和語音識別方面能夠給出更優的結果。這一模型也可以使用反向傳播算法進行訓練。相比較其他深度、前饋神經網絡,卷積神經網絡需要估計的參數更少,使之成為一種頗具吸引力的深度學習結構[2]。
?????? 卷積網絡是為識別二維形狀而特殊設計的一個多層感知器,這種網絡結構對平移、比例縮放、傾斜或者共他形式的變形具有高度不變性。
??????? 特點:它的權值共享網絡結構使之更類似于生物神經網絡,降低了網絡模型的復雜度,減少了權值的數量。該優點在網絡的輸入是多維圖像時表現的更為明顯,使圖像可以直接作為網絡的輸入,避免了傳統識別算法中復雜的特征提取和數據重建過程。
? ? ?? CNNs是受早期的延時神經網絡(TDNN)的影響。延時神經網絡通過在時間維度上共享權值降低學習復雜度,適用于語音和時間序列信號的處理,而CNNs在空間維度上使用權值共享降低學習復雜度。
????? ? 但CNNs是第一個真正成功訓練多層網絡結構的學習算法。它利用空間關系減少需要學習的參數數目以提高一般前向BP算法的訓練性能。CNNs作為一個深度學習架構提出是為了最小化數據的預處理要求。在CNN中,圖像的一小部分(局部感受區域)作為層級結構的最低層的輸入,信息再依次傳輸到不同的層,每層通過一個數字濾波器去 獲得觀測數據的最顯著的特征 。這個方法能夠獲取對平移、縮放和旋轉不變的觀測數據的顯著特征,因為圖像的局部感受區域允許神經元或者處理單元可以訪問到最基礎的特征,例如定向邊緣或者角點。
??? ? ??
? ? 小盆友1視野很小,每個感受野對應一些參數,假設為w1w2w3w4,每滑動一次,另一個感受野又對應四個w,因為每個小朋友都有自己處事原則(不管看什么,參數不變),所以一個小盆友只要學習四個參數。一幅圖只要4*5=20個參數 開個玩笑,如果小盆友都很善變,每次看東西方式都變,會有height_col*width_col*4*5個參數啊!計算量很大。
? 文章:理解參數共享????
?? 注: int height_col= (height + 2 * pad_h - kernel_h) / stride_h + 1;
??? ? ? ?? int width_col = (width + 2 * pad_w - kernel_w) / stride_w + 1;
一、CNN用于特征學習?參數!
???? ? ? 參考鏈接:http://www.open-open.com/lib/view/open1425626861103.html
??? ???? 在圖像處理中,往往把圖像表示為像素的向量,比如一個1000×1000的圖像,可以表示為一個1000000的向量(但這種說法是極為不確切的,X維和Y維的像素意義完全不同。應該說1000*1000的圖像,轉化到一維歐式空間之后,映射到1000000維向量空間的基上)。在一般神經網絡 中,如果隱含層神經元數目與輸入層一樣,即也是1000000時,那么輸入層到隱含層的參數數據為1000000×1000000=10^12,這樣就太多了, 基本沒法訓練。所以圖像處理要想練成神經網絡大法,必先減少參數加快速度。
?????? (對于傳統ML方法,特征是什么?特征是特征提取函數(特征hash,即圖像從二維歐式空間轉化為N維向量空間的hash映射)提取的N維向量,把信息從二維圖像空間壓縮到一維歐式空間的N維向量空間。而對于CNN,特征這個定義已經沒有意義,到底前面哪些層得到的結果可以稱為特征,后面哪些層屬于分類器,已經不好定論。而對于整個CNN過程,一般不會出現歐式維度降低的現象,幾乎都是二維圖像在不停的Pooling和Conv,知道最后收斂到1*1,即可以認為是二維點,也可以認為是一維點,這就是模式識別的最終結果,那個0和1)
???????? 當然,圖像的輸入尺度一般不會達到1000分辨率,而達到較好的訓練效果,卻實在需要更多層的網絡,這樣仍會產生更多的參數。此外,對CNN也有識別圖像旋轉和尺度不變性的要求。
???? ?? 卷積神經網絡有兩種神器可以降低參數數目,第一種神器叫做局部感知野,第二種為權值共享,此外還有圖像下采樣。
??????
1.局部感受野 Local Receptive?Area / Fiileds
???? ? ? 一般感知信息的聯系為局部到全局,而圖像的空間聯系也是局部像素 聯系較為緊密,而距離較遠的像素相關性較弱。因而,每個神經元其實沒有必要對全局圖像進行感知,只需要對局部進行感知,然后在更高層將局部的信息綜合起 來就得到全局信息。
????? ?? 局部神經元和局部神經元鏈接,網絡部分連通的思想,也是受啟發于生物學里面的視覺系統結構。視覺皮層的神經元就是局部接受信息的(即這些神經元只響應某些特定區 域的刺激),也就是所謂的局部感受野。
?????? (一般意義上,全連接的除了某個局部,其他部分參數已經為0,那么這個不為0的局部,也就成為了局部感受野)
??????? 如下圖所示:左圖為全連接,右圖為局部連接。
?????
?多層網絡實現局部關聯
????? ?? 在上右圖中,假如每個神經元只和10×10個像素值相連,那么權值數據為1000000×100個參數,減少為原來的千分之一。而那10×10個像素值對應的10×10個參數,其實就相當于卷積操作,因此為卷積神經網絡。
其對應結構為
??? ? ?? 卷積層:卷積神經網絡中每層卷積層由若干卷積單元組成,每個卷積單元的參數都是通過反向傳播算法優化得到的。卷積運算的目的是提取輸入的不同特征,第一層卷積層可能只能提取一些低級的特征如邊緣、線條和角等層級,更多層的網絡能從低級特征中迭代提取更復雜的特征(這也是深度的要求)。
??????????????????????????????????????
2.參數共享shared?Weights—那個滑動的卷積核
???? ? ? 但其實這樣的話參數仍然過多,那么就啟動第二級參數降低方法,即權值共享。實現方法呢?即是使用共享卷積核。那一層只學習一個卷積核,或者在某個局部共享卷積核,這就成了下面圖中,那個滑動的核........其實核沒有滑動,只是參數是一樣的,看起來就像是滑動卷積過程。
????? ?? 怎么理解權值共享呢?網絡中每個神經元都鏈接10*10的圖像區域,我們可以這100個參數(也就是卷積操作)看成是提取特征的方式,該方式與位置無關。
??????? CNN在在上面的局部連接中,一共1000000個神經元,每個神經元都鏈接10*10?的圖像區域,即對應100個參數。但對于這1000000個神經元,若每個神經元的這100個參數都是相等的,即是每個神經元用同一個卷積核去卷積圖像局部,那么參數數目就變為100了。
????? ? 不管隱層的神經元個數有多少,兩層間的連接只有100個參數,這就是CNNs的主要賣點。直接對應了特征選擇中的稀疏編碼,降低特征空間。
??????? 這其中隱含原理則是:圖像的一部分的統計特性與其他部分是一樣的。這也意味著我們在這一部分學習的特征也能用在另一部分上,所以對于這個圖像上的所有位置,我們都能使用同樣的學習特征,則表現為權值是共享的。
???
圖2.1??權值共享
??????? 更直觀一些,當從一個大尺寸圖像中隨機選取一小塊,比如說 8×8 作為樣本,并且從這個小塊樣本中學習到了一些特征,這時我們可以把從這個 8×8 樣本中學習到的特征作為探測器,應用到這個圖像的任意地方中去。特別是,我們可以用從 8×8 樣本中所學習到的特征跟原本的大尺寸圖像作卷積,從而對這個大尺寸圖像上的任一位置獲得一個不同特征的激活值。
??????? 悲劇的地方:這個共享卷積核其實只是學習了一個特征,那怎么能行呢?沒關系!CNN是多層的神經網絡,Deep的意義就是實現復合函數比單聯通函數更少遍歷而更多選擇的功能,凈多多次復合可以得到多種可能的效果,意思就是用多層多個卷積核實現單層多個卷積核的功能。
??????? 如下圖所示,展示了一個3*3的卷積核在5*5的圖像上做卷積的過程。每個卷積都是一種特征提取方式,就像一個篩子,將圖像中符合條件(激活值越大越符合條件)的部分篩選出來。
????????圖2.2? 權值共享/特征共享
3.?空間降采樣
???? ??? 在通過卷積獲得了特征 (features) 之后,下一步我們希望利用這些特征去做分類。理論上講,人們可以用所有提取得到的特征去訓練分類器,例如 softmax 分類器,但這樣做面臨計算量的挑戰。例如:對于一個 96X96 像素的圖像,假設我們已經學習得到了400個定義在8X8輸入上的特征,每一個特征和圖像卷積都會得到一個 (96 ? 8 + 1) × (96 ? 8 + 1) = 7921 維的卷積特征,由于有 400 個特征,所以每個樣例 (example) 都會得到一個 892 × 400 = 3,168,400 維的卷積特征向量。學習一個擁有超過 3 百萬特征輸入的分類器十分不便,需要訓練相當多的參數,并且容易出現過擬合 (over-fitting)。
?????? 為了解決這個問題,首先回憶一下,我們之所以決定使用卷積后的特征是因為圖像具有一種“靜態性”的屬性,這也就意味著在一個圖像區域有用的特征極 有可能在另一個區域同樣適用。因此,為了描述大的圖像,一個很自然的想法就是對不同位置的特征進行聚合統計,例如,人們可以計算圖像一個區域上的某個特定 特征的平均值 (或最大值)。這些概要統計特征不僅具有低得多的維度 (相比使用所有提取得到的特征),參數減少,同時還會改善結果(不容易過擬合)。這種聚合的操作就叫做池化 (pooling),有時也稱為平均池化或者最大池化 (取決于計算池化的方法)。
? ??? ? 線性整流層:使用ReLU函數或者tanh函數
? ? ??? 池化層:
????
???圖3.1?特征池化層(空間降采樣)
4. ? 終止層:終止層用于防止過擬合。
??? ? ? 隨機丟失:使用隨機性,用以爬出局部最優區域.
??? ??? Dropout "layer":
????? ? Since a fully connected layer occupies most of the parameters, it is prone tooverfitting. The dropout method[19] is introduced to prevent overfitting. Dropout also significantly improves the speed of training. This makes model combination practical, even for deep neural nets. Dropout is performed randomly. In the input layer, the probability of dropping a neuron is between 0.5 and 1, while in the hidden layers, a probability of 0.5 is used. The neurons that are dropped out, will not contribute to the forward pass and back propagation. This is equivalent to decreasing the number of neurons. This will create neural networks with different architectures, but all of those networks will share the same weights.
???? ? The biggest contribution of the dropout method is that, although it effectively generates 2^n neural nets, with different architectures (n=number of "droppable" neurons), and as such, allows for model combination, at test time, only a single network needs to be tested. This is accomplished by performing the test with the un-thinned network, while multiplying the output weights of each neuron with the probability of that neuron being retained (i.e. not dropped out).
?損失層:
?????? ? Loss layer:損失函數的確定是重點......一般多類識別默認使用了SoftMax函數,而損失函數又怎么選擇呢?
??????? It can use different loss functions for different tasks. Softmax loss is used for predicting a single class of K mutually exclusive classes. Sigmoid cross-entropy loss is used for predicting K independent probability values in [0,1]. Euclidean loss is used for regressing to real-valued labels [-inf,inf]
二、CNN普遍應用形式
?????? 基于其三個特點:
?????? ? Local connectivity: 局部特征的響應
?????? ? Parameter sharing: 減小參數個數——對局部特征的平移不變性
?????? ? pooling/subsampling hidden units: 減小參數的個數——對局部特征的旋轉不變性產生影響
三、CNN的不斷改進:
??????????? ? 輸入??????? 數據:? data distortion,?? generating additional examples, ? trasfer learning,? big data...
??????????? ? 隱層節點輸入:? Dopconnect, ? Maxout...
??????????? ? 隱層??????? 節點:? sigmoid,?? tanh, ? linear, ? ReLU(這個很重要)...
??????????? ? 隱層節點輸出:? Dropout...
??????????? ? 卷???? ? ? ? ?? ? 積:? receptive field size,??? overlap or not...
??????????? ? 池??? ? ? ? ?? ?? 化:? mean-pooling均值,?? max-pooling最大,??? Stochastic pooling隨機, ?? 3D pooling三維收斂, ? linear or not線性或非線性...
??????????? ? 網絡?? ? ?? 結構:? layer’s connect way,?? #hidden units, #layers(deep learning)...
??????????? ? 優化?? ? ?? 方法:? pre-training預訓練,? fine-tunning微調,?? learning rate學習率,?? moment,? mini-batch設定批大小, ? sgd隨機梯度下降,? hessin free...
??????????? ? 規則項、大腦皮層、理論研究...
??????? 這里面每一個方法都值得好好考慮,并深入研究........
四、微調(fine-tuning)
???????? 類似于始祖DNN論文里面所使用的使用大量的非監督學習數據來逐層訓練調整網絡結構,是極為費力的事情。一般工業級別CNN的使用方式是拿來一個在相似領域訓練的超類網絡,應用于自身數據集時進行微調,也能達到較好的效果。一般使用相同結構的使用ImageNet預訓練過的CNN,其前面幾層相當于已經訓練好的特征提取網絡,應用于相應的場景,只需要在后幾層進行結構修改,并對前幾層微調即可。
可用包
- Caffe:? Caffe 包含了CNN使用最廣泛的庫。它由伯克利視覺和學習中心(BVLC)研發,擁有比一般實現更好的結構和更快的速度,分離的設定和執行。同時支持CPU和GPU計算,底層由C++實現,并封裝了Python和MATLAB的接口。
- Torch7 (www.torch.ch)
- OverFeat
- Cuda-convnet
- MatConvnet
- Theano: 用Python實現的神經網絡包[3]
五、CNN示例--從Lenet到AlexNet
????????? 此段請移步原文:卷積神經網絡進化史:從Lenet到AlexNet
5.0:本系列博客是對劉昕博士的《CNN的近期進展與實用技巧》的一個擴充性資料。
???????? 主要討論CNN的發展,并且引用劉昕博士的思路,對CNN的發展作一個更加詳細的介紹,將按下圖的CNN發展史進行描述:
?????? 上圖所示是劉昕博士總結的CNN結構演化的歷史,起點是神經認知機模型,此時已經出現了卷積結構,經典的LeNet誕生于1998年。然而之后CNN的鋒芒開始被SVM等手工設計的特征蓋過。隨著ReLU和dropout的提出,以及GPU和大數據帶來的歷史機遇,CNN在2012年迎來了歷史突破–AlexNet.
?????? CNN的演化路徑可以總結為以下幾個方向:
- 從LeNet到AlexNet
- 進化之路一:網絡結構加深
- 進化之路二:加強卷積功能
- 進化之路三:從分類到檢測
- 進化之路四:新增功能模塊
本系列博客將對CNN發展的四條路徑中最具代表性的CNN模型結構進行講解。
一切的開始(LeNet)
下圖是廣為流傳LeNet的網絡結構,麻雀雖小,但五臟俱全,卷積層、pooling層、全連接層,這些都是現代CNN網絡的基本組件。
- 輸入尺寸:32*32
- 卷積層:3個
- 降采樣層:2個
- 全連接層:1個
- 輸出:10個類別(數字0-9的概率)
因為LeNet可以說是CNN的開端,所以這里簡單介紹一下各個組件的用途與意義。
Input (32*32)
????? 輸入圖像Size為32*32。這要比mnist數據庫中最大的字母(28*28)還大。這樣做的目的是希望潛在的明顯特征,如筆畫斷續、角點能夠出現在最高層特征監測子感受野的中心。
C1, C3, C5 (卷積層)
????? 卷積核在二維平面上平移,并且卷積核的每個元素與被卷積圖像對應位置相乘,再求和。通過卷積核的不斷移動,我們就有了一個新的圖像,這個圖像完全由卷積核在各個位置時的乘積求和的結果組成。
?????? 二維卷積在圖像中的效果就是: 對圖像的每個像素的鄰域(鄰域大小就是核的大小)加權求和得到該像素點的輸出值。
?????? 具體做法如下:
??????? 卷積運算一個重要的特點就是: 通過卷積運算,可以使原信號特征增強,并且降低噪音。但同時也降低了精度。
??????? 不同的卷積核能夠提取到圖像中的不同特征,這里有在線demo,下面是不同卷積核得到的不同的feature map,
???? 以C1層進行說明:C1層是一個卷積層,有6個卷積核(提取6種局部特征),核大小為5*5,能夠輸出6個特征圖Feature Map,大小為28*28。C1有156個可訓練參數(每個濾波器5*5=25個unit參數和一個bias參數,一共6個濾波器,共(5*5+1)6=156個參數),共156(28*28)=122,304個連接。
S2, S4 (pooling層)
???? S2, S4是下采樣層,是為了降低網絡訓練參數及模型的過擬合程度。池化/采樣的方式通常有以下兩種:
????? S2層是6個14*14的feature map,map中的每一個單元于上一層的 2*2 領域相連接,所以,S2層是C1層的1/4。
F6 (全連接層)
????? F6是全連接層,類似MLP中的一個layer,共有84個神經元(為什么選這個數字?跟輸出層有關),這84個神經元與C5層進行全連接,所以需要訓練的參數是:(120+1)*84=10164.
????? 如同經典神經網絡,F6層計算輸入向量和權重向量之間的點積,再加上一個偏置。然后將其傳遞給sigmoid函數產生單元i的一個狀態。
Output (輸出層)
?????? 輸出層由歐式徑向基函數(Euclidean Radial Basis Function)單元組成,每類一個單元,每個有84個輸入。
?????? 換句話說,每個輸出RBF單元計算輸入向量和參數向量之間的歐式距離。輸入離參數向量越遠,RBF輸出的越大。用概率術語來說,RBF輸出可以被理解為F6層配置空間的高斯分布的負log-likelihood。給定一個輸式,損失函數應能使得F6的配置與RBF參數向量(即模式的期望分類)足夠接近。
????? LeNet5網絡:http://yann.lecun.com/exdb/lenet/index.html
??
???? ? ? 利用LeNet5網絡,可以很快的搭建一個手寫數字識別分類器。不妨試一下
王者回歸(AlexNet)
AlexNet 可以說是具有歷史意義的一個網絡結構,可以說在AlexNet之前,深度學習已經沉寂了很久。歷史的轉折在2012年到來,AlexNet 在當年的ImageNet圖像分類競賽中,top-5錯誤率比上一年的冠軍下降了十個百分點,而且遠遠超過當年的第二名。
AlexNet 之所以能夠成功,深度學習之所以能夠重回歷史舞臺,原因在于:
下面簡單介紹一下AlexNet的一些細節:
Data augmentation
有一種觀點認為神經網絡是靠數據喂出來的,若增加訓練數據,則能夠提升算法的準確率,因為這樣可以避免過擬合,而避免了過擬合你就可以增大你的網絡結構了。當訓練數據有限的時候,可以通過一些變換來從已有的訓練數據集中生成一些新的數據,來擴大訓練數據的size。
其中,最簡單、通用的圖像數據變形的方式:
AlexNet 訓練的時候,在data augmentation上處理的很好:
- 隨機crop。訓練時候,對于256*256的圖片進行隨機crop到224*224,然后允許水平翻轉,那么相當與將樣本倍增到((256-224)^2)*2=2048。
- 測試時候,對左上、右上、左下、右下、中間做了5次crop,然后翻轉,共10個crop,之后對結果求平均。作者說,不做隨機crop,大網絡基本都過擬合(under substantial overfitting)。
- 對RGB空間做PCA,然后對主成分做一個(0, 0.1)的高斯擾動。結果讓錯誤率又下降了1%。
ReLU 激活函數
?????? Sigmoid 是常用的非線性的激活函數,它能夠把輸入的連續實值“壓縮”到0和1之間。特別的,如果是非常大的負數,那么輸出就是0;如果是非常大的正數,輸出就是1.
但是它有一些致命的 缺點:
- Sigmoids saturate and kill gradients. sigmoid 有一個非常致命的缺點,當輸入非常大或者非常小的時候,會有飽和現象,這些神經元的梯度是接近于0的。如果你的初始值很大的話,梯度在反向傳播的時候因為需要乘上一個sigmoid 的導數,所以會使得梯度越來越小,這會導致網絡變的很難學習。
- Sigmoid 的 output 不是0均值. 這是不可取的,因為這會導致后一層的神經元將得到上一層輸出的非0均值的信號作為輸入。
產生的一個結果就是:如果數據進入神經元的時候是正的(e.g. x>0 elementwise in f=wTx+b),那么w 計算出的梯度也會始終都是正的。
當然了,如果你是按batch去訓練,那么那個batch可能得到不同的信號,所以這個問題還是可以緩解一下的。因此,非0均值這個問題雖然會產生一些不好的影響,不過跟上面提到的 kill gradients 問題相比還是要好很多的。
ReLU 的數學表達式如下:
很顯然,從圖左可以看出,輸入信號<0時,輸出都是0,>0 的情況下,輸出等于輸入。w 是二維的情況下,使用ReLU之后的效果如下:
Alex用ReLU代替了Sigmoid,發現使用 ReLU 得到的SGD的收斂速度會比 sigmoid/tanh 快很多。
主要是因為它是linear,而且 non-saturating(因為ReLU的導數始終是1),相比于 sigmoid/tanh,ReLU 只需要一個閾值就可以得到激活值,而不用去算一大堆復雜的運算。
關于激活函數更多內容,請移步我的另一篇文章:激活函數-面面觀
Dropout
?????? 結合預先訓練好的許多不同模型,來進行預測是一種非常成功的減少測試誤差的方式(Ensemble)。但因為每個模型的訓練都需要花了好幾天時間,因此這種做法對于大型神經網絡來說太過昂貴。
?????? 然而,AlexNet 提出了一個非常有效的模型組合版本,它在訓練中只需要花費兩倍于單模型的時間。這種技術叫做Dropout,它做的就是以0.5的概率,將每個隱層神經元的輸出設置為零。以這種方式“dropped out”的神經元既不參與前向傳播,也不參與反向傳播。
?????? 所以每次輸入一個樣本,就相當于該神經網絡就嘗試了一個新的結構,但是所有這些結構之間共享權重。因為神經元不能依賴于其他特定神經元而存在,所以這種技術降低了神經元復雜的互適應關系。
?????? 正因如此,網絡需要被迫學習更為魯棒的特征,這些特征在結合其他神經元的一些不同隨機子集時有用。在測試時,我們將所有神經元的輸出都僅僅只乘以0.5,對于獲取指數級dropout網絡產生的預測分布的幾何平均值,這是一個合理的近似方法。
多GPU訓練
??????? 單個GTX 580 GPU只有3GB內存,這限制了在其上訓練的網絡的最大規模。因此他們將網絡分布在兩個GPU上。 目前的GPU特別適合跨GPU并行化,因為它們能夠直接從另一個GPU的內存中讀出和寫入,不需要通過主機內存。
??????? 他們采用的并行方案是:在每個GPU中放置一半核(或神經元),還有一個額外的技巧:GPU間的通訊只在某些層進行。
例如,第3層的核需要從第2層中所有核映射輸入。然而,第4層的核只需要從第3層中位于同一GPU的那些核映射輸入。
Local Responce Normalization
一句話概括:本質上,這個層也是為了防止激活函數的飽和的。
????? 個人理解原理是通過正則化讓激活函數的輸入靠近“碗”的中間(避免飽和),從而獲得比較大的導數值。所以從功能上說,跟ReLU是重復的。不過作者說,從試驗結果看,LRN操作可以提高網絡的泛化能力,將錯誤率降低了大約1個百分點。
AlexNet 優勢在于:網絡增大(5個卷積層+3個全連接層+1個softmax層),同時解決過擬合(dropout,data augmentation,LRN),并且利用多GPU加速運算。
六、深度圖像之圖像分類模型之Alexnet詳細解讀
?? ????? 原文鏈接:深度圖像之圖像分類模型之Alexnet解讀
???????? CNN在圖像處理與模式識別被證明有效性之后,Caffe橫空出世,給Google這個綠茶婊一個重擊。在imagenet上的圖像分類challenge上Alex提出的alexnet網絡結構模型贏得了2012屆的冠軍。要研究CNN類型DL網絡模型在圖像分類上的應用,就逃不開研究alexnet,這是CNN在圖像分類上的經典模型(DL火起來之后)。
???????? 在DL開源實現caffe的model樣例中,它也給出了alexnet的復現,具體網絡配置文件如下https://github.com/BVLC/caffe/blob/master/models/bvlc_reference_caffenet/train_val.prototxt:
1. conv1階段DFD(data flow diagram):
2. conv2階段DFD(data flow diagram):
3. conv3階段DFD(data flow diagram):
4. conv4階段DFD(data flow diagram):
5. conv5階段DFD(data flow diagram):
6. fc6階段DFD(data flow diagram):
7. fc7階段DFD(data flow diagram):
8. fc8階段DFD(data flow diagram):
各種layer的operation更多解釋可以參考:http://caffe.berkeleyvision.org/tutorial/layers.html
從計算該模型的數據流過程中,該模型參數大概5kw+。
caffe的輸出中也有包含這塊的內容日志,詳情如下:
I0721 10:38:15.326920 4692 net.cpp:125] Top shape: 256 3 227 227 (39574272) I0721 10:38:15.326971 4692 net.cpp:125] Top shape: 256 1 1 1 (256) I0721 10:38:15.326982 4692 net.cpp:156] data does not need backward computation. I0721 10:38:15.327003 4692 net.cpp:74] Creating Layer conv1 I0721 10:38:15.327011 4692 net.cpp:84] conv1 <- data I0721 10:38:15.327033 4692 net.cpp:110] conv1 -> conv1 I0721 10:38:16.721956 4692 net.cpp:125] Top shape: 256 96 55 55 (74342400) I0721 10:38:16.722030 4692 net.cpp:151] conv1 needs backward computation. I0721 10:38:16.722059 4692 net.cpp:74] Creating Layer relu1 I0721 10:38:16.722070 4692 net.cpp:84] relu1 <- conv1 I0721 10:38:16.722082 4692 net.cpp:98] relu1 -> conv1 (in-place) I0721 10:38:16.722096 4692 net.cpp:125] Top shape: 256 96 55 55 (74342400) I0721 10:38:16.722105 4692 net.cpp:151] relu1 needs backward computation. I0721 10:38:16.722116 4692 net.cpp:74] Creating Layer pool1 I0721 10:38:16.722125 4692 net.cpp:84] pool1 <- conv1 I0721 10:38:16.722133 4692 net.cpp:110] pool1 -> pool1 I0721 10:38:16.722167 4692 net.cpp:125] Top shape: 256 96 27 27 (17915904) I0721 10:38:16.722187 4692 net.cpp:151] pool1 needs backward computation. I0721 10:38:16.722205 4692 net.cpp:74] Creating Layer norm1 I0721 10:38:16.722221 4692 net.cpp:84] norm1 <- pool1 I0721 10:38:16.722234 4692 net.cpp:110] norm1 -> norm1 I0721 10:38:16.722251 4692 net.cpp:125] Top shape: 256 96 27 27 (17915904) I0721 10:38:16.722260 4692 net.cpp:151] norm1 needs backward computation. I0721 10:38:16.722272 4692 net.cpp:74] Creating Layer conv2 I0721 10:38:16.722280 4692 net.cpp:84] conv2 <- norm1 I0721 10:38:16.722290 4692 net.cpp:110] conv2 -> conv2 I0721 10:38:16.725225 4692 net.cpp:125] Top shape: 256 256 27 27 (47775744) I0721 10:38:16.725242 4692 net.cpp:151] conv2 needs backward computation. I0721 10:38:16.725253 4692 net.cpp:74] Creating Layer relu2 I0721 10:38:16.725261 4692 net.cpp:84] relu2 <- conv2 I0721 10:38:16.725270 4692 net.cpp:98] relu2 -> conv2 (in-place) I0721 10:38:16.725280 4692 net.cpp:125] Top shape: 256 256 27 27 (47775744) I0721 10:38:16.725288 4692 net.cpp:151] relu2 needs backward computation. I0721 10:38:16.725298 4692 net.cpp:74] Creating Layer pool2 I0721 10:38:16.725307 4692 net.cpp:84] pool2 <- conv2 I0721 10:38:16.725317 4692 net.cpp:110] pool2 -> pool2 I0721 10:38:16.725329 4692 net.cpp:125] Top shape: 256 256 13 13 (11075584) I0721 10:38:16.725338 4692 net.cpp:151] pool2 needs backward computation. I0721 10:38:16.725358 4692 net.cpp:74] Creating Layer norm2 I0721 10:38:16.725368 4692 net.cpp:84] norm2 <- pool2 I0721 10:38:16.725378 4692 net.cpp:110] norm2 -> norm2 I0721 10:38:16.725389 4692 net.cpp:125] Top shape: 256 256 13 13 (11075584) I0721 10:38:16.725399 4692 net.cpp:151] norm2 needs backward computation. I0721 10:38:16.725409 4692 net.cpp:74] Creating Layer conv3 I0721 10:38:16.725419 4692 net.cpp:84] conv3 <- norm2 I0721 10:38:16.725427 4692 net.cpp:110] conv3 -> conv3 I0721 10:38:16.735193 4692 net.cpp:125] Top shape: 256 384 13 13 (16613376) I0721 10:38:16.735213 4692 net.cpp:151] conv3 needs backward computation. I0721 10:38:16.735224 4692 net.cpp:74] Creating Layer relu3 I0721 10:38:16.735234 4692 net.cpp:84] relu3 <- conv3 I0721 10:38:16.735242 4692 net.cpp:98] relu3 -> conv3 (in-place) I0721 10:38:16.735250 4692 net.cpp:125] Top shape: 256 384 13 13 (16613376) I0721 10:38:16.735258 4692 net.cpp:151] relu3 needs backward computation. I0721 10:38:16.735302 4692 net.cpp:74] Creating Layer conv4 I0721 10:38:16.735312 4692 net.cpp:84] conv4 <- conv3 I0721 10:38:16.735321 4692 net.cpp:110] conv4 -> conv4 I0721 10:38:16.743952 4692 net.cpp:125] Top shape: 256 384 13 13 (16613376) I0721 10:38:16.743988 4692 net.cpp:151] conv4 needs backward computation. I0721 10:38:16.744000 4692 net.cpp:74] Creating Layer relu4 I0721 10:38:16.744010 4692 net.cpp:84] relu4 <- conv4 I0721 10:38:16.744020 4692 net.cpp:98] relu4 -> conv4 (in-place) I0721 10:38:16.744030 4692 net.cpp:125] Top shape: 256 384 13 13 (16613376) I0721 10:38:16.744038 4692 net.cpp:151] relu4 needs backward computation. I0721 10:38:16.744050 4692 net.cpp:74] Creating Layer conv5 I0721 10:38:16.744057 4692 net.cpp:84] conv5 <- conv4 I0721 10:38:16.744067 4692 net.cpp:110] conv5 -> conv5 I0721 10:38:16.748935 4692 net.cpp:125] Top shape: 256 256 13 13 (11075584) I0721 10:38:16.748955 4692 net.cpp:151] conv5 needs backward computation. I0721 10:38:16.748965 4692 net.cpp:74] Creating Layer relu5 I0721 10:38:16.748975 4692 net.cpp:84] relu5 <- conv5 I0721 10:38:16.748983 4692 net.cpp:98] relu5 -> conv5 (in-place) I0721 10:38:16.748998 4692 net.cpp:125] Top shape: 256 256 13 13 (11075584) I0721 10:38:16.749011 4692 net.cpp:151] relu5 needs backward computation. I0721 10:38:16.749022 4692 net.cpp:74] Creating Layer pool5 I0721 10:38:16.749030 4692 net.cpp:84] pool5 <- conv5 I0721 10:38:16.749039 4692 net.cpp:110] pool5 -> pool5 I0721 10:38:16.749050 4692 net.cpp:125] Top shape: 256 256 6 6 (2359296) I0721 10:38:16.749058 4692 net.cpp:151] pool5 needs backward computation. I0721 10:38:16.749074 4692 net.cpp:74] Creating Layer fc6 I0721 10:38:16.749083 4692 net.cpp:84] fc6 <- pool5 I0721 10:38:16.749091 4692 net.cpp:110] fc6 -> fc6 I0721 10:38:17.160079 4692 net.cpp:125] Top shape: 256 4096 1 1 (1048576) I0721 10:38:17.160148 4692 net.cpp:151] fc6 needs backward computation. I0721 10:38:17.160166 4692 net.cpp:74] Creating Layer relu6 I0721 10:38:17.160177 4692 net.cpp:84] relu6 <- fc6 I0721 10:38:17.160190 4692 net.cpp:98] relu6 -> fc6 (in-place) I0721 10:38:17.160202 4692 net.cpp:125] Top shape: 256 4096 1 1 (1048576) I0721 10:38:17.160212 4692 net.cpp:151] relu6 needs backward computation. I0721 10:38:17.160222 4692 net.cpp:74] Creating Layer drop6 I0721 10:38:17.160230 4692 net.cpp:84] drop6 <- fc6 I0721 10:38:17.160238 4692 net.cpp:98] drop6 -> fc6 (in-place) I0721 10:38:17.160258 4692 net.cpp:125] Top shape: 256 4096 1 1 (1048576) I0721 10:38:17.160265 4692 net.cpp:151] drop6 needs backward computation. I0721 10:38:17.160277 4692 net.cpp:74] Creating Layer fc7 I0721 10:38:17.160286 4692 net.cpp:84] fc7 <- fc6 I0721 10:38:17.160295 4692 net.cpp:110] fc7 -> fc7 I0721 10:38:17.342094 4692 net.cpp:125] Top shape: 256 4096 1 1 (1048576) I0721 10:38:17.342157 4692 net.cpp:151] fc7 needs backward computation. I0721 10:38:17.342175 4692 net.cpp:74] Creating Layer relu7 I0721 10:38:17.342185 4692 net.cpp:84] relu7 <- fc7 I0721 10:38:17.342198 4692 net.cpp:98] relu7 -> fc7 (in-place) I0721 10:38:17.342208 4692 net.cpp:125] Top shape: 256 4096 1 1 (1048576) I0721 10:38:17.342217 4692 net.cpp:151] relu7 needs backward computation. I0721 10:38:17.342228 4692 net.cpp:74] Creating Layer drop7 I0721 10:38:17.342236 4692 net.cpp:84] drop7 <- fc7 I0721 10:38:17.342245 4692 net.cpp:98] drop7 -> fc7 (in-place) I0721 10:38:17.342254 4692 net.cpp:125] Top shape: 256 4096 1 1 (1048576) I0721 10:38:17.342262 4692 net.cpp:151] drop7 needs backward computation. I0721 10:38:17.342274 4692 net.cpp:74] Creating Layer fc8 I0721 10:38:17.342283 4692 net.cpp:84] fc8 <- fc7 I0721 10:38:17.342291 4692 net.cpp:110] fc8 -> fc8 I0721 10:38:17.343199 4692 net.cpp:125] Top shape: 256 22 1 1 (5632) I0721 10:38:17.343214 4692 net.cpp:151] fc8 needs backward computation. I0721 10:38:17.343231 4692 net.cpp:74] Creating Layer loss I0721 10:38:17.343240 4692 net.cpp:84] loss <- fc8 I0721 10:38:17.343250 4692 net.cpp:84] loss <- label I0721 10:38:17.343264 4692 net.cpp:151] loss needs backward computation. I0721 10:38:17.343305 4692 net.cpp:173] Collecting Learning Rate and Weight Decay. I0721 10:38:17.343327 4692 net.cpp:166] Network initialization done. I0721 10:38:17.343335 4692 net.cpp:167] Memory required for Data 1073760256參考:http://en.wikipedia.org/wiki/Convolutional_neural_network#Dropout_.22layer.22。............
總結
以上是生活随笔為你收集整理的DNN结构演进History—CNN( 优化,LeNet, AlexNet )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CNN结构:SPP-Net为CNNs添加
- 下一篇: csgo旭日收藏品怎么掉