CNN几种经典模型比较
LeNet5
LeNet5 誕生于 1994 年,是最早的卷積神經網絡之一,并且推動了深度學習領域的發展。自從 1988 年開始,在許多次成功的迭代后,這項由 Yann LeCun 完成的開拓性成果被命名為 LeNet5(參見:Gradient-Based Learning Applied to Document Recognition)。
LeNet5 的架構基于這樣的觀點:(尤其是)圖像的特征分布在整張圖像上,以及帶有可學習參數的卷積是一種用少量參數在多個位置上提取相似特征的有效方式。在那時候,沒有 GPU 幫助訓練,甚至 CPU 的速度也很慢。因此,能夠保存參數以及計算過程是一個關鍵進展。這和將每個像素用作一個大型多層神經網絡的單獨輸入相反。LeNet5 闡述了那些像素不應該被使用在第一層,因為圖像具有很強的空間相關性,而使用圖像中獨立的像素作為不同的輸入特征則利用不到這些相關性。
LeNet5特征能夠總結為如下幾點:
1)卷積神經網絡使用三個層作為一個系列: 卷積,池化,非線性
2) 使用卷積提取空間特征
3)使用映射到空間均值下采樣(subsample)
4)雙曲線(tanh)或S型(sigmoid)形式的非線性
5)多層神經網絡(MLP)作為最后的分類器
6)層與層之間的稀疏連接矩陣避免大的計算成本
總體看來,這個網絡是最近大量神經網絡架構的起點,并且也給這個領域帶來了許多靈感。
間隔---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
從 1998 年到 2010 年神經網絡處于孵化階段。大多數人沒有意識到它們不斷增長的力量,與此同時其他研究者則進展緩慢。由于手機相機以及便宜的數字相機的出現,越來越多的數據可被利用。并且計算能力也在成長,CPU 變得更快,GPU 變成了多種用途的計算工具。這些趨勢使得神經網絡有所進展,雖然速度很慢。數據和計算能力使得神經網絡能完成的任務越來越有趣。之后一切變得清晰起來......
Dan Ciresan Net
2010 年的時候,Dan Claudiu Ciresan 和 Jurgen Schmidhuber 發布了最早的 GPU 神經網絡的一個實現。這個實現是在一塊 NVIDIA GTX 280 圖形處理器上運行 9 層的神經網絡,包含前向與反向傳播。
AlexNet
2012年,Hinton的學生Alex?Krizhevsky提出了深度卷積神經網絡模型AlexNet,它可以算是LeNet的一種更深更寬的版本。AlexNet中包含了幾個比較新的技術點,也首次在CNN中成功應用了ReLU、Dropout和LRN等Trick。同時AlexNet也使用了GPU進行運算加速,作者開源了他們在GPU上訓練卷積神經網絡的CUDA代碼。AlexNet包含了6億3000萬個連接,6000萬個參數和65萬個神經元,擁有5個卷積層,其中3個卷積層后面連接了最大池化層,最后還有3個全連接層。AlexNet以顯著的優勢贏得了競爭激烈的ILSVRC?2012比賽,top-5的錯誤率降低至了16.4%,相比第二名的成績26.2%錯誤率有了巨大的提升。AlexNet可以說是神經網絡在低谷期后的第一次發聲,確立了深度學習(深度卷積網絡)在計算機視覺的統治地位,同時也推動了深度學習在語音識別、自然語言處理、強化學習等領域的拓展。
AlexNet將LeNet的思想發揚光大,把CNN的基本原理應用到了很深很寬的網絡中。AlexNet主要使用到的新技術點如下。
(1)成功使用ReLU作為CNN的激活函數,并驗證其效果在較深的網絡超過了Sigmoid,成功解決了Sigmoid在網絡較深時的梯度彌散問題。雖然ReLU激活函數在很久之前就被提出了,但是直到AlexNet的出現才將其發揚光大。
(2)訓練時使用Dropout隨機忽略一部分神經元,以避免模型過擬合。Dropout雖有單獨的論文論述,但是AlexNet將其實用化,通過實踐證實了它的效果。在AlexNet中主要是最后幾個全連接層使用了Dropout。
(3)在CNN中使用重疊的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出讓步長比池化核的尺寸小,這樣池化層的輸出之間會有重疊和覆蓋,提升了特征的豐富性。
(4)提出了LRN層,對局部神經元的活動創建競爭機制,使得其中響應比較大的值變得相對更大,并抑制其他反饋較小的神經元,增強了模型的泛化能力。
(5)使用CUDA加速深度卷積網絡的訓練,利用GPU強大的并行計算能力,處理神經網絡訓練時大量的矩陣運算。AlexNet使用了兩塊GTX?580?GPU進行訓練,單個GTX?580只有3GB顯存,這限制了可訓練的網絡的最大規模。因此作者將AlexNet分布在兩個GPU上,在每個GPU的顯存中儲存一半的神經元的參數。因為GPU之間通信方便,可以互相訪問顯存,而不需要通過主機內存,所以同時使用多塊GPU也是非常高效的。同時,AlexNet的設計讓GPU之間的通信只在網絡的某些層進行,控制了通信的性能損耗。?
(6)數據增強,隨機地從256′256的原始圖像中截取224′224大小的區域(以及水平翻轉的鏡像),相當于增加了(256-224)2′2=2048倍的數據量。如果沒有數據增強,僅靠原始的數據量,參數眾多的CNN會陷入過擬合中,使用了數據增強后可以大大減輕過擬合,提升泛化能力。進行預測時,則是取圖片的四個角加中間共5個位置,并進行左右翻轉,一共獲得10張圖片,對他們進行預測并對10次結果求均值。同時,AlexNet論文中提到了會對圖像的RGB數據進行PCA處理,并對主成分做一個標準差為0.1的高斯擾動,增加一些噪聲,這個Trick可以讓錯誤率再下降1%。
整個AlexNet有8個需要訓練參數的層(不包括池化層和LRN層),前5層為卷積層,后3層為全連接層,如圖4所示。AlexNet最后一層是有1000類輸出的Softmax層用作分類。?LRN層出現在第1個及第2個卷積層后,而最大池化層出現在兩個LRN層及最后一個卷積層后。ReLU激活函數則應用在這8層每一層的后面。因為AlexNet訓練時使用了兩塊GPU,因此這個結構圖中不少組件都被拆為了兩部分。現在我們GPU的顯存可以放下全部模型參數,因此只考慮一塊GPU的情況即可。
圖4??AlexNet的網絡結構
AlexNet每層的超參數如圖5所示。其中輸入的圖片尺寸為224′224,第一個卷積層使用了較大的卷積核尺寸11′11,步長為4,有96個卷積核;緊接著一個LRN層;然后是一個3′3的最大池化層,步長為2。這之后的卷積核尺寸都比較小,都是5′5或者3′3的大小,并且步長都為1,即會掃描全圖所有像素;而最大池化層依然保持為3′3,并且步長為2。我們可以發現一個比較有意思的現象,在前幾個卷積層,雖然計算量很大,但參數量很小,都在1M左右甚至更小,只占AlexNet總參數量的很小一部分。這就是卷積層有用的地方,可以通過較小的參數量提取有效的特征。而如果前幾層直接使用全連接層,那么參數量和計算量將成為天文數字。雖然每一個卷積層占整個網絡的參數量的1%都不到,但是如果去掉任何一個卷積層,都會使網絡的分類性能大幅地下降。
圖5??AlexNet每層的超參數及參數數量
Overfeat
2013 年的 12 月,紐約大學的 Yann LeCun 實驗室提出了 AlexNet 的衍生——Overfeat(參見:OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks)。這篇文章也提出了學習邊界框(learning bounding box),并導致之后出現了很多研究這同一主題的論文。我相信學習分割對象比學習人工邊界框更好。
VGG
來自牛津大學的 VGG 網絡(參見:Very Deep Convolutional Networks for Large-Scale Image Recognition)是第一個在各個卷積層使用更小的 3×3 過濾器(filter),并把它們組合作為一個卷積序列進行處理的網絡。
這看來和 LeNet 的原理相反,其中是大的卷積被用來獲取一張圖像中相似特征。和 AlexNet 的 9×9 或 11×11 過濾器不同,過濾器開始變得更小,離 LeNet 竭力所要避免的臭名昭著的 1×1 卷積異常接近——至少在該網絡的第一層是這樣。但是 VGG 巨大的進展是通過依次采用多個 3×3 卷積,能夠模仿出更大的感受野(receptive field)的效果,例如 5×5 與 7×7。這些思想也被用在了最近更多的網絡架構中,如 Inception 與 ResNet。
VGG 網絡使用多個 3×3 卷積層去表征復雜特征。注意 VGG-E 的第 3、4、5 塊(block):256×256 和 512×512 個 3×3 過濾器被依次使用多次以提取更多復雜特征以及這些特征的組合。其效果就等于是一個帶有 3 個卷積層的大型的 512×512 大分類器。這顯然意味著有大量的參數與學習能力。但是這些網絡訓練很困難,必須劃分到較小的網絡,并逐層累加。這是因為缺少強大的方式對模型進行正則化,或者或多或少約束大量由于大量參數增長的搜索空間。
VGG 在許多層中都使用大特征尺寸,因為推斷(inference)在運行時是相當耗費時間的。正如 Inception 的瓶頸(bottleneck)那樣,減少特征的數量將節省一些計算成本。
VGGNet是牛津大學計算機視覺組(Visual?Geometry?Group)和Google?DeepMind公司的研究員一起研發的的深度卷積神經網絡。VGGNet探索了卷積神經網絡的深度與其性能之間的關系,通過反復堆疊3′3的小型卷積核和2′2的最大池化層,VGGNet成功地構筑了16~19層深的卷積神經網絡。VGGNet相比之前state-of-the-art的網絡結構,錯誤率大幅下降,并取得了ILSVRC?2014比賽分類項目的第2名和定位項目的第1名。同時VGGNet的拓展性很強,遷移到其他圖片數據上的泛化性非常好。VGGNet的結構非常簡潔,整個網絡都使用了同樣大小的卷積核尺寸(3′3)和最大池化尺寸(2′2)。到目前為止,VGGNet依然經常被用來提取圖像特征。VGGNet訓練后的模型參數在其官方網站上開源了,可用來在domain?specific的圖像分類任務上進行再訓練(相當于提供了非常好的初始化權重),因此被用在了很多地方。
VGGNet論文中全部使用了3′3的卷積核和2′2的池化核,通過不斷加深網絡結構來提升性能。圖6所示為VGGNet各級別的網絡結構圖,圖7所示為每一級別的參數量,從11層的網絡一直到19層的網絡都有詳盡的性能測試。雖然從A到E每一級網絡逐漸變深,但是網絡的參數量并沒有增長很多,這是因為參數量主要都消耗在最后3個全連接層。前面的卷積部分雖然很深,但是消耗的參數量不大,不過訓練比較耗時的部分依然是卷積,因其計算量比較大。這其中的D、E也就是我們常說的VGGNet-16和VGGNet-19。C很有意思,相比B多了幾個1′1的卷積層,1′1卷積的意義主要在于線性變換,而輸入通道數和輸出通道數不變,沒有發生降維。
圖6??VGGNet各級別網絡結構圖
圖7??VGGNet各級別網絡參數量(單位為百萬)
VGGNet擁有5段卷積,每一段內有2~3個卷積層,同時每段尾部會連接一個最大池化層用來縮小圖片尺寸。每段內的卷積核數量一樣,越靠后的段的卷積核數量越多:64?–?128?–?256?–?512?–?512。其中經常出現多個完全一樣的3′3的卷積層堆疊在一起的情況,這其實是非常有用的設計。如圖8所示,兩個3′3的卷積層串聯相當于1個5′5的卷積層,即一個像素會跟周圍5′5的像素產生關聯,可以說感受野大小為5′5。而3個3′3的卷積層串聯的效果則相當于1個7′7的卷積層。除此之外,3個串聯的3′3的卷積層,擁有比1個7′7的卷積層更少的參數量,只有后者的。最重要的是,3個3′3的卷積層擁有比1個7′7的卷積層更多的非線性變換(前者可以使用三次ReLU激活函數,而后者只有一次),使得CNN對特征的學習能力更強。
圖8??兩個串聯3′3的卷積層功能類似于一個5′5的卷積層
VGGNet在訓練時有一個小技巧,先訓練級別A的簡單網絡,再復用A網絡的權重來初始化后面的幾個復雜模型,這樣訓練收斂的速度更快。在預測時,VGG采用Multi-Scale的方法,將圖像scale到一個尺寸Q,并將圖片輸入卷積網絡計算。然后在最后一個卷積層使用滑窗的方式進行分類預測,將不同窗口的分類結果平均,再將不同尺寸Q的結果平均得到最后結果,這樣可提高圖片數據的利用率并提升預測準確率。同時在訓練中,VGGNet還使用了Multi-Scale的方法做數據增強,將原始圖像縮放到不同尺寸S,然后再隨機裁切224′224的圖片,這樣能增加很多數據量,對于防止模型過擬合有很不錯的效果。實踐中,作者令S在[256,512]這個區間內取值,使用Multi-Scale獲得多個版本的數據,并將多個版本的數據合在一起進行訓練。圖9所示為VGGNet使用Multi-Scale訓練時得到的結果,可以看到D和E都可以達到7.5%的錯誤率。最終提交到ILSVRC?2014的版本是僅使用Single-Scale的6個不同等級的網絡與Multi-Scale的D網絡的融合,達到了7.3%的錯誤率。不過比賽結束后作者發現只融合Multi-Scale的D和E可以達到更好的效果,錯誤率達到7.0%,再使用其他優化策略最終錯誤率可達到6.8%左右,非常接近同年的冠軍Google?Inceptin?Net。同時,作者在對比各級網絡時總結出了以下幾個觀點。
(1)LRN層作用不大。
(2)越深的網絡效果越好。
(3)1′1的卷積也是很有效的,但是沒有3′3的卷積好,大一些的卷積核可以學習更大的空間特征。
圖9??各級別VGGNet在使用Multi-Scale訓練時的top-5錯誤率
網絡中的網絡(Network-in-network)
網絡中的網絡(NiN,參見論文:Network In Network)的思路簡單又偉大:使用 1×1 卷積為卷積層的特征提供更組合性的能力。
NiN 架構在各個卷積之后使用空間 MLP 層,以便更好地在其他層之前組合特征。同樣,你可以認為 1×1 卷積與 LeNet 最初的原理相悖,但事實上它們可以以一種更好的方式組合卷積特征,而這是不可能通過簡單堆疊更多的卷積特征做到的。這和使用原始像素作為下一層輸入是有區別的。其中 1×1 卷積常常被用于在卷積之后的特征映射上對特征進行空間組合,所以它們實際上可以使用非常少的參數,并在這些特征的所有像素上共享!
MLP 的能力能通過將卷積特征組合進更復雜的組(group)來極大地增加單個卷積特征的有效性。這個想法之后被用到一些最近的架構中,例如 ResNet、Inception 及其衍生技術。
NiN 也使用了平均池化層作為最后分類器的一部分(這里作者說的有異議,全連接層替換成平均池化層,NIN提出的),這是另一種將會變得常見的實踐。這是通過在分類之前對網絡對多個輸入圖像的響應進行平均完成的。
GoogLeNet 與 Inception
來自谷歌的 Christian Szegedy 開始追求減少深度神經網絡的計算開銷,并設計出 GoogLeNet——第一個 Inception 架構(參見:Going Deeper with Convolutions)。
那是在 2014 年秋季,深度學習模型正在變得在圖像與視頻幀的分類中非常有用。大多數懷疑者已經不再懷疑深度學習與神經網絡這一次是真的回來了,而且將一直發展下去。鑒于這些技術的用處,谷歌這樣的互聯網巨頭非常有興趣在他們的服務器上高效且大規模龐大地部署這些架構。
Christian 考慮了很多關于在深度神經網絡達到最高水平的性能(例如在 ImageNet 上)的同時減少其計算開銷的方式。或者在能夠保證同樣的計算開銷的前提下對性能有所改進。
他和他的團隊提出了 Inception 模塊:
初看之下這不過基本上是 1×1、3×3、5×5 卷積過濾器的并行組合。但是 Inception 的偉大思路是用 1×1 的卷積塊(NiN)在昂貴的并行模塊之前減少特征的數量。這一般被稱為「瓶頸(bottleneck)」。這部分內容將在下面的「瓶頸層(bottleneck layer)」部分來解釋。
GoogLeNet 使用沒有 inception 模塊的主干作為初始層,之后是與 NiN 相似的一個平均池化層加 softmax 分類器。這個分類器比 AlexNet 與 VGG 的分類器的運算數量少得多。這也促成一項非常有效的網絡設計,參見論文:An Analysis of Deep Neural Network Models for Practical Applications。
瓶頸層(Bottleneck layer)
受到 NiN 的啟發,Inception 的瓶頸層減少了每一層的特征的數量,并由此減少了運算的數量;所以可以保持較低的推理時間。在將數據通入昂貴的卷積模塊之前,特征的數量會減少 4 倍。在計算成本上這是很大的節約,也是該架構的成功之處。
讓我們具體驗證一下。現在你有 256 個特征輸入,256 個特征輸出,假定 Inception 層只能執行 3×3 的卷積,也就是總共要完成 256×256×3×3 的卷積(將近 589,000 次乘積累加(MAC)運算)。這可能超出了我們的計算預算,比如說,在谷歌服務器上要以 0.5 毫秒運行該層。作為替代,我們決定減少需要進行卷積運算的特征的數量,也就是 64(即 256/4)個。在這種情況下,我們首先進行 256 -> 64 1×1 的卷積,然后在所有 Inception 的分支上進行 64 次卷積,接而再使用一個來自 64 -> 256 的特征的 1×1 卷積,現在運算如下:
256×64 × 1×1 = 16,000s
64×64 × 3×3 = 36,000s
64×256 × 1×1 = 16,000s
相比于之前的 60 萬,現在共有 7 萬的計算量,幾乎少了近 10 倍。
而且,盡管我們做了更好的運算,我們在此層也沒有損失其通用性(generality)。事實證明瓶頸層在 ImageNet 這樣的數據集上已經表現出了頂尖水平,而且它也被用于接下來介紹的 ResNet 這樣的架構中。
它之所以成功是因為輸入特征是相關聯的,因此可通過將它們與 1×1 卷積適當結合來減少冗余。然后,在小數量的特征進行卷積之后,它們能在下一層被再次擴展成有意義的結合。
Inception V3(還有 V2)
Christian 和他的團隊都是非常高產的研究人員。2015 年 2 月,Batch-normalized Inception 被引入作為 Inception V2(參見論文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift)。Batch-normalization 在一層的輸出上計算所有特征映射的均值和標準差,并且使用這些值規范化它們的響應。這相當于數據「增白(whitening)」,因此使得所有神經圖(neural maps)在同樣范圍有響應,而且是零均值。在下一層不需要從輸入數據中學習 offset 時,這有助于訓練,還能重點關注如何最好的結合這些特征。
2015 年 12 月,該團隊發布 Inception 模塊和類似架構的一個新版本(參見論文:Rethinking the Inception Architecture for Computer Vision)。該論文更好地解釋了原始的 GoogLeNet 架構,在設計選擇上給出了更多的細節。原始思路如下:
通過謹慎建筑網絡,平衡深度與寬度,從而最大化進入網絡的信息流。在每次池化之前,增加特征映射。
當深度增加時,網絡層的深度或者特征的數量也系統性的增加。
使用每一層深度增加在下一層之前增加特征的結合。
只使用 3×3 的卷積,可能的情況下給定的 5×5 和 7×7 過濾器能分成多個 3×3。看下圖
因此新的 Inception 成為了:
也可以通過將卷積平整進更多復雜的模塊中而分拆過濾器:
在進行 inception 計算的同時,Inception 模塊也能通過提供池化降低數據的大小。這基本類似于在運行一個卷積的時候并行一個簡單的池化層:
Inception 也使用一個池化層和 softmax 作為最后的分類器。
補充:
Google?Inception?Net首次出現在ILSVRC?2014的比賽中(和VGGNet同年),就以較大優勢取得了第一名。那屆比賽中的Inception?Net通常被稱為Inception?V1,它最大的特點是控制了計算量和參數量的同時,獲得了非常好的分類性能——top-5錯誤率6.67%,只有AlexNet的一半不到。Inception?V1有22層深,比AlexNet的8層或者VGGNet的19層還要更深。但其計算量只有15億次浮點運算,同時只有500萬的參數量,僅為AlexNet參數量(6000萬)的1/12,卻可以達到遠勝于AlexNet的準確率,可以說是非常優秀并且非常實用的模型。Inception?V1降低參數量的目的有兩點,第一,參數越多模型越龐大,需要供模型學習的數據量就越大,而目前高質量的數據非常昂貴;第二,參數越多,耗費的計算資源也會更大。Inception?V1參數少但效果好的原因除了模型層數更深、表達能力更強外,還有兩點:一是去除了最后的全連接層,用全局平均池化層(即將圖片尺寸變為1′1)來取代它。全連接層幾乎占據了AlexNet或VGGNet中90%的參數量,而且會引起過擬合,去除全連接層后模型訓練更快并且減輕了過擬合。用全局平均池化層取代全連接層的做法借鑒了Network?In?Network(以下簡稱NIN)論文。二是Inception?V1中精心設計的Inception?Module提高了參數的利用效率,其結構如圖10所示。這一部分也借鑒了NIN的思想,形象的解釋就是Inception?Module本身如同大網絡中的一個小網絡,其結構可以反復堆疊在一起形成大網絡。不過Inception?V1比NIN更進一步的是增加了分支網絡,NIN則主要是級聯的卷積層和MLPConv層。一般來說卷積層要提升表達能力,主要依靠增加輸出通道數,但副作用是計算量增大和過擬合。每一個輸出通道對應一個濾波器,同一個濾波器共享參數,只能提取一類特征,因此一個輸出通道只能做一種特征處理。而NIN中的MLPConv則擁有更強大的能力,允許在輸出通道之間組合信息,因此效果明顯。可以說,MLPConv基本等效于普通卷積層后再連接1′1的卷積和ReLU激活函數。
我們再來看Inception?Module的基本結構,其中有4個分支:第一個分支對輸入進行1′1的卷積,這其實也是NIN中提出的一個重要結構。1′1的卷積是一個非常優秀的結構,它可以跨通道組織信息,提高網絡的表達能力,同時可以對輸出通道升維和降維。可以看到Inception?Module的4個分支都用到了1′1卷積,來進行低成本(計算量比3′3小很多)的跨通道的特征變換。第二個分支先使用了1′1卷積,然后連接3′3卷積,相當于進行了兩次特征變換。第三個分支類似,先是1′1的卷積,然后連接5′5卷積。最后一個分支則是3′3最大池化后直接使用1′1卷積。我們可以發現,有的分支只使用1′1卷積,有的分支使用了其他尺寸的卷積時也會再使用1′1卷積,這是因為1′1卷積的性價比很高,用很小的計算量就能增加一層特征變換和非線性化。Inception?Module的4個分支在最后通過一個聚合操作合并(在輸出通道數這個維度上聚合)。Inception?Module中包含了3種不同尺寸的卷積和1個最大池化,增加了網絡對不同尺度的適應性,這一部分和Multi-Scale的思想類似。早期計算機視覺的研究中,受靈長類神經視覺系統的啟發,Serre使用不同尺寸的Gabor濾波器處理不同尺寸的圖片,Inception?V1借鑒了這種思想。Inception?V1的論文中指出,Inception?Module可以讓網絡的深度和寬度高效率地擴充,提升準確率且不致于過擬合。
圖10??Inception?Module結構圖
人腦神經元的連接是稀疏的,因此研究者認為大型神經網絡的合理的連接方式應該也是稀疏的。稀疏結構是非常適合神經網絡的一種結構,尤其是對非常大型、非常深的神經網絡,可以減輕過擬合并降低計算量,例如卷積神經網絡就是稀疏的連接。Inception?Net的主要目標就是找到最優的稀疏結構單元(即Inception?Module),論文中提到其稀疏結構基于Hebbian原理,這里簡單解釋一下Hebbian原理:神經反射活動的持續與重復會導致神經元連接穩定性的持久提升,當兩個神經元細胞A和B距離很近,并且A參與了對B重復、持續的興奮,那么某些代謝變化會導致A將作為能使B興奮的細胞。總結一下即“一起發射的神經元會連在一起”(Cells?that?fire?together,?wire?together),學習過程中的刺激會使神經元間的突觸強度增加。受Hebbian原理啟發,另一篇文章Provable?Bounds?for?Learning?Some?Deep?Representations提出,如果數據集的概率分布可以被一個很大很稀疏的神經網絡所表達,那么構筑這個網絡的最佳方法是逐層構筑網絡:將上一層高度相關(correlated)的節點聚類,并將聚類出來的每一個小簇(cluster)連接到一起,如圖11所示。這個相關性高的節點應該被連接在一起的結論,即是從神經網絡的角度對Hebbian原理有效性的證明。
圖11??將高度相關的節點連接在一起,形成稀疏網絡
因此一個“好”的稀疏結構,應該是符合Hebbian原理的,我們應該把相關性高的一簇神經元節點連接在一起。在普通的數據集中,這可能需要對神經元節點聚類,但是在圖片數據中,天然的就是臨近區域的數據相關性高,因此相鄰的像素點被卷積操作連接在一起。而我們可能有多個卷積核,在同一空間位置但在不同通道的卷積核的輸出結果相關性極高。因此,一個1′1的卷積就可以很自然地把這些相關性很高的、在同一個空間位置但是不同通道的特征連接在一起,這就是為什么1′1卷積這么頻繁地被應用到Inception?Net中的原因。1′1卷積所連接的節點的相關性是最高的,而稍微大一點尺寸的卷積,比如3′3、5′5的卷積所連接的節點相關性也很高,因此也可以適當地使用一些大尺寸的卷積,增加多樣性(diversity)。最后Inception?Module通過4個分支中不同尺寸的1′1、3′3、5′5等小型卷積將相關性很高的節點連接在一起,就完成了其設計初衷,構建出了很高效的符合Hebbian原理的稀疏結構。
在Inception?Module中,通常1′1卷積的比例(輸出通道數占比)最高,3′3卷積和5′5卷積稍低。而在整個網絡中,會有多個堆疊的Inception?Module,我們希望靠后的Inception?Module可以捕捉更高階的抽象特征,因此靠后的Inception?Module的卷積的空間集中度應該逐漸降低,這樣可以捕獲更大面積的特征。因此,越靠后的Inception?Module中,3′3和5′5這兩個大面積的卷積核的占比(輸出通道數)應該更多。
Inception?Net有22層深,除了最后一層的輸出,其中間節點的分類效果也很好。因此在Inception?Net中,還使用到了輔助分類節點(auxiliary?classifiers),即將中間某一層的輸出用作分類,并按一個較小的權重(0.3)加到最終分類結果中。這樣相當于做了模型融合,同時給網絡增加了反向傳播的梯度信號,也提供了額外的正則化,對于整個Inception?Net的訓練很有裨益。
當年的Inception?V1還是跑在TensorFlow的前輩DistBelief上的,并且只運行在CPU上。當時使用了異步的SGD訓練,學習速率每迭代8個epoch降低4%。同時,Inception?V1也使用了Multi-Scale、Multi-Crop等數據增強方法,并在不同的采樣數據上訓練了7個模型進行融合,得到了最后的ILSVRC?2014的比賽成績——top-5錯誤率6.67%。
同時,Google?Inception?Net還是一個大家族,包括:
— 2014年9月的論文Going?Deeper?with?Convolutions提出的Inception?V1(top-5錯誤率6.67%)。
— 2015年2月的論文Batch?Normalization:?Accelerating?Deep?Network?Training?by?Reducing?Internal?Covariate提出的Inception?V2(top-5錯誤率4.8%)。
— 2015年12月的論文Rethinking?the?Inception?Architecture?for?Computer?Vision提出的Inception?V3(top-5錯誤率3.5%)。
— 2016年2月的論文Inception-v4,?Inception-ResNet?and?the?Impact?of?Residual?Connections?on?Learning提出的Inception?V4(top-5錯誤率3.08%)。
Inception?V2學習了VGGNet,用兩個3′3的卷積代替5′5的大卷積(用以降低參數量并減輕過擬合),還提出了著名的Batch?Normalization(以下簡稱BN)方法。BN是一個非常有效的正則化方法,可以讓大型卷積網絡的訓練速度加快很多倍,同時收斂后的分類準確率也可以得到大幅提高。BN在用于神經網絡某層時,會對每一個mini-batch數據的內部進行標準化(normalization)處理,使輸出規范化到N(0,1)的正態分布,減少了Internal?Covariate?Shift(內部神經元分布的改變)。BN的論文指出,傳統的深度神經網絡在訓練時,每一層的輸入的分布都在變化,導致訓練變得困難,我們只能使用一個很小的學習速率解決這個問題。而對每一層使用BN之后,我們就可以有效地解決這個問題,學習速率可以增大很多倍,達到之前的準確率所需要的迭代次數只有1/14,訓練時間大大縮短。而達到之前的準確率后,可以繼續訓練,并最終取得遠超于Inception?V1模型的性能——top-5錯誤率4.8%,已經優于人眼水平。因為BN某種意義上還起到了正則化的作用,所以可以減少或者取消Dropout,簡化網絡結構。
當然,只是單純地使用BN獲得的增益還不明顯,還需要一些相應的調整:增大學習速率并加快學習衰減速度以適用BN規范化后的數據;去除Dropout并減輕L2正則(因BN已起到正則化的作用);去除LRN;更徹底地對訓練樣本進行shuffle;減少數據增強過程中對數據的光學畸變(因為BN訓練更快,每個樣本被訓練的次數更少,因此更真實的樣本對訓練更有幫助)。在使用了這些措施后,Inception?V2在訓練達到Inception?V1的準確率時快了14倍,并且模型在收斂時的準確率上限更高。
而Inception?V3網絡則主要有兩方面的改造:一是引入了Factorization?into?small?convolutions的思想,將一個較大的二維卷積拆成兩個較小的一維卷積,比如將7′7卷積拆成1′7卷積和7′1卷積,或者將3′3卷積拆成1′3卷積和3′1卷積,如圖12所示。一方面節約了大量參數,加速運算并減輕了過擬合(比將7′7卷積拆成1′7卷積和7′1卷積,比拆成3個3′3卷積更節約參數),同時增加了一層非線性擴展模型表達能力。論文中指出,這種非對稱的卷積結構拆分,其結果比對稱地拆為幾個相同的小卷積核效果更明顯,可以處理更多、更豐富的空間特征,增加特征多樣性。
圖 12??將一個3′3卷積拆成1′3卷積和3′1卷積
另一方面,Inception?V3優化了Inception?Module的結構,現在Inception?Module有35′35、17′17和8′8三種不同結構,如圖13所示。這些Inception?Module只在網絡的后部出現,前部還是普通的卷積層。并且Inception?V3除了在Inception?Module中使用分支,還在分支中使用了分支(8′8的結構中),可以說是Network?In?Network?In?Network。
圖13??Inception?V3中三種結構的Inception?Module
而Inception?V4相比V3主要是結合了微軟的ResNet,而ResNet將在6.4節單獨講解,這里不多做贅述。因此本節將實現的是Inception?V3,其整個網絡結構如表1所示。由于Google?Inception?Net?V3相對比較復雜,所以這里使用tf.contrib.slim輔助設計這個網絡。contrib.slim中的一些功能和組件可以大大減少設計Inception?Net的代碼量,我們只需要少量代碼即可構建好有42層深的Inception?V3。
表1??Inception?V3網絡結構
ResNet
2015 年 12 月又出現了新的變革,這和 Inception V3 出現的時間一樣。ResNet 有著簡單的思路:供給兩個連續卷積層的輸出,并分流(bypassing)輸入進入下一層(參見論文:Deep Residual Learning for Image Recognition)。
這和之前的一些舊思路類似。但 ResNet 中,它們分流兩個層并被應用于更大的規模。在 2 層后分流是一個關鍵直覺,因為分流一個層并未給出更多的改進。通過 2 層可能認為是一個小型分類器,或者一個 Network-In-Network。
這是第一次網絡層數超過一百,甚至還能訓練出 1000 層的網絡。
有大量網絡層的 ResNet 開始使用類似于 Inception 瓶頸層的網絡層:
這種層通過首先是由帶有更小輸出(通常是輸入的 1/4)的 1×1 卷積較少特征的數量,然后使用一個 3×3 的層,再使用 1×1 的層處理更大量的特征。類似于 Inception 模塊,這樣做能保證計算量低,同時提供豐富的特征結合。
ResNet 在輸入上使用相對簡單的初始層:一個帶有兩個池的 7×7 卷基層。可以把這個與更復雜、更少直覺性的 Inception V3、V4 做下對比。
ResNet 也使用一個池化層加上 softmax 作為最后的分類器。
關于 ResNet 的其他洞見每天都有發生:
ResNet 可被認為既是平行模塊又是連續模塊,把輸入輸出(inout)視為在許多模塊中并行,同時每個模塊的輸出又是連續連接的。
ResNet 也可被視為并行模塊或連續模塊的多種組合(參見論文:Residual Networks are Exponential Ensembles of Relatively Shallow Networks)。
已經發現 ResNet 通常在 20-30 層的網絡塊上以并行的方式運行。而不是連續流過整個網絡長度。
當 ResNet 像 RNN 一樣把輸出反饋給輸入時,該網絡可被視為更好的生物上可信的皮質模型(參見論文:Bridging the Gaps Between Residual Learning, Recurrent Neural Networks and Visual Cortex)。
補充:
ResNet(Residual?Neural?Network)由微軟研究院的Kaiming?He等4名華人提出,通過使用Residual?Unit成功訓練152層深的神經網絡,在ILSVRC?2015比賽中獲得了冠軍,取得3.57%的top-5錯誤率,同時參數量卻比VGGNet低,效果非常突出。ResNet的結構可以極快地加速超深神經網絡的訓練,模型的準確率也有非常大的提升。Inception?V4則是將Inception?Module和ResNet相結合。可以看到ResNet是一個推廣性非常好的網絡結構,甚至可以直接應用到Inception?Net中。
在ResNet之前,瑞士教授Schmidhuber提出了Highway?Network,原理與ResNet很相似。這位Schmidhuber教授同時也是LSTM網絡的發明者,而且是早在1997年發明的,可謂是神經網絡領域元老級的學者。通常認為神經網絡的深度對其性能非常重要,但是網絡越深其訓練難度越大,Highway?Network的目標就是解決極深的神經網絡難以訓練的問題。Highway?Network相當于修改了每一層的激活函數,此前的激活函數只是對輸入做一個非線性變換,Highway?NetWork則允許保留一定比例的原始輸入x,即,其中T為變換系數,C為保留系數,論文中令。這樣前面一層的信息,有一定比例可以不經過矩陣乘法和非線性變換,直接傳輸到下一層,仿佛一條信息高速公路,因此得名Highway?Network。
Highway?Network主要通過gating?units學習如何控制網絡中的信息流,即學習原始信息應保留的比例。這個可學習的gating機制,正是借鑒自Schmidhuber教授早年的LSTM循環神經網絡中的gating。幾百乃至上千層深的Highway?Network可以直接使用梯度下降算法訓練,并可以配合多種非線性激活函數,學習極深的神經網絡現在變得可行了。事實上,Highway?Network的設計在理論上允許其訓練任意深的網絡,其優化方法基本上與網絡的深度獨立,而傳統的神經網絡結構則對深度非常敏感,訓練復雜度隨深度增加而急劇增加。
ResNet和HighWay?Network非常類似,也是允許原始輸入信息直接傳輸到后面的層中。ResNet最初的靈感出自這個問題:在不斷加神經網絡的深度時,會出現一個Degradation的問題,即準確率會先上升然后達到飽和,再持續增加深度則會導致準確率下降。這并不是過擬合的問題,因為不光在測試集上誤差增大,訓練集本身誤差也會增大。假設有一個比較淺的網絡達到了飽和的準確率,那么后面再加上幾個的全等映射層,起碼誤差不會增加,即更深的網絡不應該帶來訓練集上誤差上升。而這里提到的使用全等映射直接將前一層輸出傳到后面的思想,就是ResNet的靈感來源。
假定某段神經網絡的輸入是x,期望輸出是,如果我們直接把輸入x傳到輸出作為初始結果,那么此時我們需要學習的目標就是。如圖14所示,這就是一個ResNet的殘差學習單元(Residual?Unit),ResNet相當于將學習目標改變了,不再是學習一個完整的輸出,只是輸出和輸入的差別,即殘差。
圖14??ResNet的殘差學習模塊
圖15所示為VGGNet-19,以及一個34層深的普通卷積網絡,和34層深的ResNet網絡的對比圖。可以看到普通直連的卷積神經網絡和ResNet的最大區別在于,ResNet有很多旁路的支線將輸入直接連到后面的層,使得后面的層可以直接學習殘差,這種結構也被稱為shortcut或skip?connections。
圖15??VGG-19,直連的34層網絡,ResNet的34層網絡的結構對比
傳統的卷積層或全連接層在信息傳遞時,或多或少會存在信息丟失、損耗等問題。ResNet在某種程度上解決了這個問題,通過直接將輸入信息繞道傳到輸出,保護信息的完整性,整個網絡則只需要學習輸入、輸出差別的那一部分,簡化學習目標和難度。
在ResNet的論文中,除了提出圖14中的兩層殘差學習單元,還有三層的殘差學習單元。兩層的殘差學習單元中包含兩個相同輸出通道數(因為殘差等于目標輸出減去輸入,即,因此輸入、輸出維度需保持一致)的3′3卷積;而3層的殘差網絡則使用了Network?In?Network和Inception?Net中的1′1卷積,并且是在中間3′3的卷積前后都使用了1′1卷積,有先降維再升維的操作。另外,如果有輸入、輸出維度不同的情況,我們可以對x做一個線性映射變換維度,再連接到后面的層。
圖16??兩層及三層的ResNet殘差學習模塊
圖17所示為ResNet在不同層數時的網絡配置,其中基礎結構很類似,都是前面提到的兩層和三層的殘差學習單元的堆疊。
圖17??ResNet不同層數時的網絡配置
在使用了ResNet的結構后,可以發現層數不斷加深導致的訓練集上誤差增大的現象被消除了,ResNet網絡的訓練誤差會隨著層數增大而逐漸減小,并且在測試集上的表現也會變好。在ResNet推出后不久,Google就借鑒了ResNet的精髓,提出了Inception?V4和Inception-ResNet-V2,并通過融合這兩個模型,在ILSVRC數據集上取得了驚人的3.08%的錯誤率。
可見,ResNet及其思想對卷積神經網絡研究的貢獻確實非常顯著,具有很強的推廣性。在ResNet的作者的第二篇相關論文Identity?Mappings?in?Deep?Residual?Networks中,ResNet?V2被提出。ResNet?V2和ResNet?V1的主要區別在于,作者通過研究ResNet殘差學習單元的傳播公式,發現前饋和反饋信號可以直接傳輸,因此skip?connection的非線性激活函數(如ReLU)替換為Identity?Mappings()。同時,ResNet?V2在每一層中都使用了Batch?Normalization。這樣處理之后,新的殘差學習單元將比以前更容易訓練且泛化性更強。
根據Schmidhuber教授的觀點,ResNet類似于一個沒有gates的LSTM網絡,即將輸入x傳遞到后面層的過程是一直發生的,而不是學習出來的。同時,最近也有兩篇論文表示,ResNet基本等價于RNN且ResNet的效果類似于在多層網絡間的集成方法(ensemble)。ResNet在加深網絡層數上做出了重大貢獻,而另一篇論文The?Power?of?Depth?for?Feedforward?Neural?Networks則從理論上證明了加深網絡比加寬網絡更有效,算是給ResNet提供了聲援,也是給深度學習為什么要深才有效提供了合理解釋。
Inception V4
這是 Christian 與其團隊的另一個 Inception 版本,該模塊類似于 Inception V3:
Inception V4 也結合了 Inception 模塊和 ResNet 模塊:
我認為該架構不太簡潔,但也滿滿都是較少透明度的啟發法(heuristics)。很難理解里面的選擇,對作者們而言也難以解釋。
考慮到網絡的簡潔性,可被輕易的理解并修正,那 ResNet 可能就更好了。
SqueezeNet?
SqueezeNet(參見論文:SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size)是最近才公布的,該架構是對 ResNet 與 Inception 里面概念的重新處理。一個更好的架構設計網絡型號要小,而且參數還不需要復雜的壓縮算法。
ENet
我們的團隊計劃結合近期公開的架構的所有特征,做出一個非常高效、低重的網絡,使用較少的參數和計算就能達到頂尖結果。該網絡架構被稱為 ENet,由 Adam Paszke 設計。我們已經使用它進行過單像素標記和場景解析。
詳細了解 ENet 可參見論文 ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation。ENet 是一個編碼加解碼的網絡。編碼器是一個常規的 CNN 設計進行分類。解碼器是一個增采樣(upsampling)網絡,將分類反向傳播給原始圖像進行分割。這只使用了神經網絡,沒有其他算法進行圖像分割。
ENet 被設計為在開始時盡可能使用最小數量的資源。正是如此它有著如此小的腳本,編碼器和解碼器網絡共占有 0.7 MB,16 fp 精度。即使這么小的型號,ENet 在分割的準確度上也類似于或者高于其他神經網絡解決方案。
模塊分析
對 CNN 模塊的分析,該論文(Systematic evaluation of CNN advances on the ImageNet)已經做過了,里面的發現是非常有幫助的:
使用沒有 batchnorm 的 ELU 非線性或者有 batchnorm 的 ReLU。
使用一個學習到的 RGB 的彩色空間轉換。
使用線性學習率衰退策略。
使用平均和最大池化層的和。
使用大約 128 到 256 的 mini-batch 大小。如果這對你的 GPU 而言太大,將學習率按比例降到這個大小就行。
使用完全連接層作為卷積,并為做最后預測平均所有預測。
當研究增加訓練集大小的時候,檢測有一個 plateau 是否沒有達到
數據的整潔要比數據大小更重要。
如果你不能增加輸入圖像的大小,在隨后的層上減少步幅(stride),這樣做有同樣的效果。
如果你的網絡有復雜和高度優化的架構,像是 GoogLeNet,那修改一定要謹慎。
其他值得關注的架構
FractalNet(參見論文:FractalNet: Ultra-Deep Neural Networks without Residuals)使用遞歸架構,它在 ImageNet 上沒有進行測試。該架構是 ResNet 的衍生或者更通用的 ResNet。
以上,我們簡單回顧了卷積神經網絡的歷史,圖18所示大致勾勒出最近幾十年卷積神經網絡的發展方向。
Perceptron(感知機)于1957年由Frank?Resenblatt提出,而Perceptron不僅是卷積網絡,也是神經網絡的始祖。Neocognitron(神經認知機)是一種多層級的神經網絡,由日本科學家Kunihiko?Fukushima于20世紀80年代提出,具有一定程度的視覺認知的功能,并直接啟發了后來的卷積神經網絡。LeNet-5由CNN之父Yann?LeCun于1997年提出,首次提出了多層級聯的卷積結構,可對手寫數字進行有效識別。
圖18??卷積神經網絡發展圖
可以看到前面這三次關于卷積神經網絡的技術突破,間隔時間非常長,需要十余年甚至更久才出現一次理論創新。而后于2012年,Hinton的學生Alex依靠8層深的卷積神經網絡一舉獲得了ILSVRC?2012比賽的冠軍,瞬間點燃了卷積神經網絡研究的熱潮。AlexNet成功應用了ReLU激活函數、Dropout、最大覆蓋池化、LRN層、GPU加速等新技術,并啟發了后續更多的技術創新,卷積神經網絡的研究從此進入快車道。
在AlexNet之后,我們可以將卷積神經網絡的發展分為兩類,一類是網絡結構上的改進調整(圖18中的左側分支),另一類是網絡深度的增加(圖18中的右側分支)。
2013年,顏水成教授的Network?in?Network工作首次發表,優化了卷積神經網絡的結構,并推廣了1′1的卷積結構。在改進卷積網絡結構的工作中,后繼者還有2014年的Google?Inception?Net?V1,提出了Inception?Module這個可以反復堆疊的高效的卷積網絡結構,并獲得了當年ILSVRC比賽的冠軍。2015年初的Inception?V2提出了Batch?Normalization,大大加速了訓練過程,并提升了網絡性能。2015年年末的Inception?V3則繼續優化了網絡結構,提出了Factorization?in?Small?Convolutions的思想,分解大尺寸卷積為多個小卷積乃至一維卷積。
而另一條分支上,許多研究工作則致力于加深網絡層數,2014年,ILSVRC比賽的亞軍VGGNet全程使用3′3的卷積,成功訓練了深達19層的網絡,當年的季軍MSRA-Net也使用了非常深的網絡。2015年,微軟的ResNet成功訓練了152層深的網絡,一舉拿下了當年ILSVRC比賽的冠軍,top-5錯誤率降低至3.46%。其后又更新了ResNet?V2,增加了Batch?Normalization,并去除了激活層而使用Identity?Mapping或Preactivation,進一步提升了網絡性能。此后,Inception?ResNet?V2融合了Inception?Net優良的網絡結構,和ResNet訓練極深網絡的殘差學習模塊,集兩個方向之長,取得了更好的分類效果。
我們可以看到,自AlexNet于2012年提出后,深度學習領域的研究發展極其迅速,基本上每年甚至每幾個月都會出現新一代的技術。新的技術往往伴隨著新的網絡結構,更深的網絡的訓練方法等,并在圖像識別等領域不斷創造新的準確率記錄。至今,ILSVRC比賽和卷積神經網絡的研究依然處于高速發展期,CNN的技術日新月異。當然其中不可忽視的推動力是,我們擁有了更快的GPU計算資源用以實驗,以及非常方便的開源工具(比如TensorFlow)可以讓研究人員快速地進行探索和嘗試。在以前,研究人員如果沒有像Alex那樣高超的編程實力能自己實現cuda-convnet,可能都沒辦法設計CNN或者快速地進行實驗。現在有了TensorFlow,研究人員和開發人員都可以簡單而快速地設計神經網絡結構并進行研究、測試、部署乃至實用。
群友問答
問題1:最新版本的TensorFlow 1.0,到底有什么實質性的提升?如何看待加入的動態圖?
1.0版本的TensorFlow是第一個穩定版本,提供了可以長期支持的API。相比于之前的0.12這個版本,主要添加了XLA(JIT編譯優化),Java接口,TensorFlow Fold(動態圖框架),同時在分布式計算上的性能也有了重大提升,目前訓練Inception V3網絡,在8塊GPU上可獲得7倍多的提速。
Fold主要是學習了PyTorch、Chainer、DyNet等框架,使用命令式變成,生成計算圖同時執行計算,這樣訓練某些網絡,比如RNN、LSTM等更靈活。不過Fold和這些框架略有不同,它屬于使用Dynamic Batching的方式,可以對不同長度、大小、尺寸的 輸入做batch訓練,效率比PyTorch、Chainer、DyNet等完全動態生成計算圖的方式,效率更高。
問題2:以上談到的幾種網絡,分別適用于什么類型的任務?
這幾種網絡都屬于2維的卷積網絡,主要任務可以做圖像分類、定位等,他們功能上應該是遞進的關系,越新的網絡,使用到的技術越好,性能越高,而Inception-ResNet-V2則是把這幾種網絡的優勢都融為一體。
當然,卷積網絡不止2維,也可以有1維的,可以處理時間序列的信號;也可以有3維的,可以處理3維空間的信息,或者處理視頻信息。卷積網絡適應的場景應該是,輸入信號在空間上和時間上存在一定關聯性的場景,滿足了這個條件,都可以很好的利用深度卷積神經網絡解決問題。
問題3:看過一些TensorFlow寫的程序,總覺不是特別清晰簡潔。Keras就是清楚的多,但Keras是否可以完全覆蓋TensorFlow的功能呢?
Keras目前已經準備正式進入TensorFlow代碼庫了,以后可以使用Keras創建TensorFlow網絡,但是功能肯定是不能完全覆蓋的。比如,多GPU、分布式訓練,或者生成各種中間訓練結果給TensorBoard展示,或者是一些復雜的多分支的、條件控制的網絡等,這些用keras都實現不了。但是Keras可以用來實現一些邏輯簡單,結構不復雜的網絡。
問題4:深度學習相關的開源社區,如何能夠對其做出Contribution,是需要算法或網絡結構上的創新嗎?
這個一般不用,算法或網絡結構的創新,一般是發Paper。協助開發一些框架就簡單的多,一開始可能是修復Bug,而后是完成一些TensorFlow開發團隊任務可以交給社區完成的相對簡單的功能。到后面,隨著對框架和代碼的熟悉,可以逐漸參與一些有趣的新功能的開發,當然也可以把最新出的一些論文中的網絡結構,實現在TensorFlow中,提供接口,不過這個要求就比較高了,甚至需要有開發CUDA程序的能力。
http://blog.csdn.net/app_12062011/article/details/62886113總結
以上是生活随笔為你收集整理的CNN几种经典模型比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用caffe训练faster-rcnn
- 下一篇: Faster RCNN 训练中的一些问题