ZF网络架构深度详解
前言:ZF網絡是2013年提出的,網上有很多關于它的介紹和講解,但是很多內容講的不太好(個人感覺),于是花時間收集了一些資料,整理了一些比較好的文章,從頭到尾把ZFNet說了一遍。
一、ZFNet簡介
1.1 為什么起名ZFnetwork
? ? ? ? ILSVRC 2013獲勝者是來自Matthew Zeiler和Rob Fergus的卷積網絡。它被稱為ZFNet(Zeiler&Fergus Net的簡稱)。這是對AlexNet的改進,通過調整架構超參數,特別是通過擴展中間卷積層的大小。
? ? ? ? ZFNet是用人的名字命名的,那他到底出自哪篇論文呢?它出自Matthew D.Zeiler 和 Rob Fergus (紐約大學)2013年撰寫的論文:?《Visualizing and Understanding Convolutional Networks》,轉講解“卷積神經網絡的理解和可視化”
1.2 ILSVRC歷屆冠軍網絡介紹以及CNN的大致演化過程
1.3 ZFNet最大研究意義
? ? ? ZFNet是在AlexNet基礎上進行了一些細節的改動,網絡結構上并沒有太大的突破,只是在卷積核和步幅上面做了一些改動。
按照以前的觀點,一個卷積神經網絡的好壞我們只能通過不斷地訓練去判斷,我也沒有辦法知道每一次卷積、每一次池化、每一次經過激活函數到底發生了什么,也不知道神經網絡為什么取得了如此好的效果,那么只能靠不停的實驗來尋找更好的模型。ZFNet所做的工作不少,但是最核心的其實就是一個。
核心意義:通過使用可視化技術揭示了神經網絡各層到底在干什么,起到了什么作用。一旦知道了這些,如何調整我們的神經網絡,往什么方向優化,就有了較好的依據。
主要工作:
(1)使用一個多層的反卷積網絡來可視化訓練過程中特征的演化及發現潛在的問題;
(2)同時根據遮擋圖像局部對分類結果的影響來探討對分類任務而言到底那部分輸入信息更重要。
? ? ? ?總而言之,《Visualizing and Understanding Convolutional Networks》,可以說是CNN領域可視化理解的開山之作,這篇文獻告訴我們CNN的每一層到底學習到了什么特征,然后作者通過可視化進行調整網絡,提高了精度。最近兩年深層的卷積神經網絡,進展非常驚人,在計算機視覺方面,識別精度不斷的突破,CVPR上的關于CNN的文獻一大堆。然而很多學者都不明白,為什么通過某種調參、改動網絡結構等,精度會提高。可能某一天,我們搞CNN某個項目任務的時候,你調整了某個參數,結果精度飆升,但如果別人問你,為什么這樣調參精度會飆升呢,你所設計的CNN到底學習到了什么牛逼的特征?
? ? ? ?這篇文獻的目的,就是要通過特征可視化,告訴我們如何通過可視化的角度,查看你的精度確實提高了,你設計CNN學習到的特征確實比較牛逼。
?
1.4 論文研究的貢獻
(1)特征可視化
? ? ? ? 使用反卷積、反池化、反激活函數去反可視化feature map ,通過feature map可以看出,特征分層次體系結構 ,以及我們可以知道前面的層學習的是物理輪廓、邊緣、顏色、紋理等特征,后面的層學習的是和類別相關的抽象特征。這一個非常重要的結論,我們后面很多的微調手段都是基于此理論成果。再次強調這個結論:
結論一:CNN網絡前面的層學習的是物理輪廓、邊緣、顏色、紋理等特征,后面的層學習的是和類別相關的抽象特征
結論二:CNN學習到的特征具有平移和縮放不變性,但是,沒有旋轉不變性
(2)特征提取的通用性
? ? ? 作者通過實驗說明了,將使用ImageNet2012數據集訓練得到的CNN,在保持前面七層不變的情況,只在小數據集上面重新訓練softmax層,通過這樣的實驗,說明了使用ImageNet2012數據集訓練得到的CNN的特征提取功能就有通用性。
結論三:CNN網絡的特征提取具有通用性,這是后面微調的理論支持
(3)對于遮擋的敏感性
? ? ? ?通過遮擋,找出了決定圖像類別的關鍵部位當,在輸入圖片中遮擋了學習到的特征時,分類效果會很差。同時根據遮擋圖像局部對分類結果的影響來探討對分類任務而言到底那部分輸入信息更重要。
(4)特征的層次分析
? ? ? ?作者通過實驗證明了,不同深度的網絡層學習到的特征對于分類的作用,說明了深度結構確實能夠獲得比淺層結構更好的效果。?通過實驗,說明了深度增加時,網絡可以學習到更具區分的特征。?底層特征在迭代次數比較少時就能收斂,高層需要的迭代次數比較多?越是高層的特征,其用來做分類的性能越好
(5)對于CNN結構的改進
(6)特征結構選擇
? ? ? 作者通過可視化AlexNet第一層和第二層的特征,發現比較大的stride和卷積核提取的特征不理想,所以作者將第一層的卷積核從11*11減小到7*7,將stride從4減小到2,實驗說明,這樣有助于分類性能的提升。
? ? ? ? 這個改進方案是建立在(1)的基礎之上的,上述結論中的(2)、(3)、(4)、(5)、(6)均是建立在(1)的基礎之上的,因為我們知道了網絡各個層到底發生了什么,自然也就知道了優化的方向。
? ? ? ?通過特征可視化可以知道,Krizhevsky的CNN結構學習到的第一層特征只對于高頻和低頻信息有了收斂,但是對于中層信息卻還沒有收斂;同時,第二層特征出現了混疊失真,這個主要是因為第一個卷積層的層的步長設置為4引起的,為了解決這個問題,作者不僅將第一層的卷積核的大小設置為7*7,同時,也將步長設置為2(對AlexNet的改進)
二、ZFNet所涉及的幾個核心原理
? ? ? 其實上面所羅列出來的5個貢獻,不管是對于遮擋的敏感性、特征的層析分析、還是特征提取的通用性,都是建立在“特征可視化”的基礎之上的,因此特征可視化就是論文的核心所在了,要想能夠看到每一個卷積層之后,到底提取到了原始圖像什么樣的特征,則需要經過幾個核心步驟,反池化、反激活、反卷積。反卷積可視化以各層得到的特征圖作為輸入,進行反卷積,得到反卷積結果,用以驗證顯示各層提取到的特征圖。舉個例子:假如你想要查看Alexnet?的conv5提取到了什么東西,我們就用conv5的特征圖后面接一個反卷積網絡,然后通過:反池化、反激活、反卷積,這樣的一個過程,把本來一張13*13大小的特征圖(conv5大小為13*13),放大回去,最后得到一張與原始輸入圖片一樣大小的圖片(227*227)。
下面就來看一下實現feature map可視化的幾個核心思想。
2.1 反池化過程
? ? ? ?我們知道,池化是不可逆的過程,然而我們可以通過記錄池化過程中,最大激活值得坐標位置。然后在反池化的時候,只把池化過程中最大激活值所在的位置坐標的值激活,其它的值置為0,當然這個過程只是一種近似,因為我們在池化的過程中,除了最大值所在的位置,其它的值也并不是為0的。剛好最近幾天看到文獻:《Stacked What-Where Auto-encoders》,里面有個反卷積示意圖畫的比較好,所有就截下圖,用這篇文獻的示意圖進行講解:
? ? ? ?以上面的圖片為例,上面的圖片中左邊表示pooling過程,右邊表示unpooling過程。假設我們pooling塊的大小是3*3,采用max?pooling后,我們可以得到一個輸出神經元其激活值為9,pooling是一個下采樣的過程,本來是3*3大小,經過pooling后,就變成了1*1大小的圖片了。而upooling剛好與pooling過程相反,它是一個上采樣的過程,是pooling的一個反向運算,當我們由一個神經元要擴展到3*3個神經元的時候,我們需要借助于pooling過程中,記錄下最大值所在的位置坐標(0,1),然后在unpooling過程的時候,就把(0,1)這個像素點的位置填上去,其它的神經元激活值全部為0。
? ? ? 再來一個例子:在max?pooling的時候,我們不僅要得到最大值,同時還要記錄下最大值得坐標(-1,-1),然后再unpooling的時候,就直接把(-1-1)這個點的值填上去,其它的激活值全部為0。
? ? ?當然了,實際上在池化之前,除了(0,1)位置上的那個9以外,其他地方的數字并不是0,所以反池化并沒有真正意義上的完全還原,只是一種近似而已。
2.2 反激活
我們在Alexnet中,relu函數是用于保證每層輸出的激活值都是正數,因此對于反向過程,我們同樣需要保證每層的特征圖為正值,也就是說這個反激活過程和激活過程沒有什么差別,都是直接采用relu函數。這里需要;了解什么是relu激活函數,當然這也只是一種近似,只是保證了每一個經過激活函數的輸出值始終為正值。
2. 3 反卷積
? ? ? ? 對于反卷積過程,采用卷積過程轉置后的濾波器(參數一樣,只不過把參數矩陣水平和垂直方向翻轉了一下),反卷積實際上應該叫卷積轉置。
? ? ? ? 這里我打算下一篇博客仔細講一下卷積轉置。最后可視化網絡結構如下:
? ? ? ? 網絡的整個過程,從右邊開始:輸入圖片-》卷積-》Relu-》最大池化-》得到結果特征圖-》反池化-》Relu-》反卷積。到了這邊,可以說我們的算法已經學習完畢了,其實很好理解,我們可以用兩個過程來描述:
過程一:特征提取過程,輸入圖像-》卷積-》Relu激活-》最大化池化-》feature map
過程二:特征還原過程,feature map-》反池化-》反Relu激活-》反卷積-》可視化(原始)圖像
2.4 ZFNet網絡的結構
上面2.3中的圖片并不是ZFNet網絡的結構,上面的2.3是進行特征可視化的步驟圖,特征可視化的目的就是為了改進原來的網絡,適當調整原來的CNN網絡(論文中是適當調整AlexNet)。原來的ZFNet是下圖所示:
從上面可以看出,ZFNet相較于AlexNet的改進主要在兩點:
(1)第一個卷積層的大小從11*11改為了7*7,步長從4改為了2.
? ? ? ? 作出這樣調整的依據就是通過特征圖可視化來實現的,作者通過可視化AlexNet第一層和第二層的特征,發現比較大的stride和卷積核提取的特征不理想,所以作者將第一層的卷積核從11*11減小到7*7,實驗說明,這樣有助于分類性能的提升。另外通過特征可視化可以知道,Krizhevsky的CNN結構學習到的第一層特征只對于高頻和低頻信息有了收斂,但是對于中層信息卻還沒有收斂;同時,第二層特征出現了混疊失真,這個主要是因為第一個卷積層的層的步長設置為4引起的,為了解決這個問題,作者不僅將第一層的卷積核的大小設置為7*7,同時,也將步長設置為2(對AlexNet的改進)。
(2)將3、4、5層卷積核的數量由384、384、256調整為512、1024、512,
總結:從上面的這個網絡改進過程可以發現,雖然在設計卷積核的大小、步長、卷積核的數量等方面都是認為自己設置的,依然還帶有一定的盲目性,需要多次試驗尋求最佳的設計,但是相較于之前已經有了一些進步,因為我至少可以通過feature map的可視化分析一下大致的原因,找尋一個大致的優化方向,是該調整大一點還是小一點呢?雖然不能很快確定,但是有了一定的參考依據。
三、 原始論文中的feature map可視化結果分析
我們現在來看一下原始論文是如何對可視化的特征圖進行分析,進而找出網絡調整的依據的。
3.1 特征可視化
? ? ? ? 每個特征單獨投影到像素空間揭露了不同的結構能刺激不同的一個給定的特征圖,因此展示了它對于變形的輸入內在的不變性。下圖即在一個已經訓練好的網絡中可視化后的圖。
由上圖可以看到第二層應對角落和其他邊緣或者顏色的結合;
第三層有更加復雜的不變性,捕捉到了相似的紋理;
第四層顯示了特定類間顯著的差異性;
第五層顯示了有顯著構成變化的整個物體。
? ? ? ? 總的來說,通過CNN學習后,我們學習到的特征,是具有辨別性的特征,比如要我們區分人臉和狗頭,那么通過CNN學習后,背景部位的激活度基本很少,我們通過可視化就可以看到我們提取到的特征忽視了背景,而是把關鍵的信息給提取出來了。從layer 1、layer 2學習到的特征基本上是顏色、邊緣等低層特征;layer 3則開始稍微變得復雜,學習到的是紋理特征,比如上面的一些網格紋理;layer 4學習到的則是比較有區別性的特征,比如狗頭;layer 5學習到的則是完整的,具有辨別性關鍵特征。
3.2 特征演變過程
外表突然的變化導致圖像中的一個變換即產生了最強烈的激活。模型的底層在少數幾個epoches就能收斂聚集,然而上層在一個相當多的epoches(40-50)之后才能有所變化,這顯示了讓模型完全訓練到完全收斂的必要性。可以由下圖看到顏色對比度都逐步增強。作者給我們顯示了,在網絡訓練過程中,每一層學習到的特征是怎么變化的,上面每一整張圖片是網絡的某一層特征圖,然后每一行有8個小圖片,分別表示網絡epochs次數為:1、2、5、10、20、30、40、64的特征圖:
結果:(1)仔細看每一層,在迭代的過程中的變化,出現了sudden?jumps;(2)從層與層之間做比較,我們可以看到,低層在訓練的過程中基本沒啥變化,比較容易收斂,高層的特征學習則變化很大。這解釋了低層網絡的從訓練開始,基本上沒有太大的變化,因為梯度彌散嘛。(3)從高層網絡conv5的變化過程,我們可以看到,剛開始幾次的迭代,基本變化不是很大,但是到了40~50的迭代的時候,變化很大,因此我們以后在訓練網絡的時候,不要著急看結果,看結果需要保證網絡收斂。
總結:卷積神經網絡前面的及各層很快就收斂了,二上層收斂較慢,因此我們以后在訓練網絡的時候,不要著急看結果,看結果需要保證網絡收斂。?
?3.3特征不變性
? ? ? ?一般來說,小的變化對于模型的第一層都有非常大的影響,但對于最高層的影響卻幾乎沒有。對于圖像的平移、尺度、旋轉的變化來說,網絡的輸出對于平移和尺度變化都是穩定的,但卻不具有旋轉不變性,除非目標圖像時旋轉對稱的。下圖為分別對平移,尺度,旋轉做的分析圖。
??????????上圖按行順序分別為對5類圖像進行不同程度的垂直方向上的平移、尺度變換、旋轉對輸出結果影響的分析圖。按列順序分別為原始變換圖像,第一層中原始圖片和變換后的圖片的歐氏距離,第7層中原始圖片和變換后的圖片的歐氏距離,變換后圖片被正確分類的概率圖。
? ? ? ? 可視化不僅能夠看到一個訓練完的模型的內部操作,而且還能幫助選擇好的網絡結構。
3.4 ZFNet與AlexNet的對比
? ? ? ?前面說了ZFNet的結構與AlexNet基本一致,只不過做了稍微的更改,改變了第一層卷積核的大小和步幅,現在來看一下這個第一層卷積層改變前后,特征到底發生了什么變化。在稍微更改了第一層之后,分類性能提升了,下圖為兩個網絡結構可視化特征圖。
(a)為沒有經過裁剪的圖片經過第一個卷積層后的特征可視化圖,注意到有一個特征全白,
(b)為AlexNet中第一個卷積層特征可視化圖,
(c)為ZFNet中第一個卷積層可視化圖,可以看到相比前面有更多的獨特的特征以及更少的無意義的特征,如第3列的第3到6行,
(d)為AlexNet中第二個卷積層特征可視化圖,
(e)為ZFNet中的第二個卷積層特征可視化圖,可以看到(e)中的特征更加干凈,清晰,保留了更多的第一層和第二層中的信息。
3.5 遮擋圖像來判斷網絡是否知道對象在原圖中的位置
? ? ? 可能看到現在,我們一直存在一個疑問,那就是,整個模型它自己清楚目標在圖像中的具體位置嗎?可以用實驗來證明一下,即用一個灰色小方塊來擋住圖像中的目標,然后再觀測輸出的分類情況來分析,如下圖:
? ? ? 上圖為對三個不同的測試圖片中的不同位置用灰色小方塊進行掩蓋后,觀測分類輸出的改變情況。
第一列(a)為原始測試圖片,
第二列(b)為某個區域被灰色小方塊掩蓋后的網絡結構中第五層的特征圖,
第三列(c)為將第五層的特征圖投影到輸入圖像的可視化圖像,第一行表明最強烈的特征表現在狗狗的面部區域,(d)為正確分類概率的圖,(e)為最有可能的標簽。
?? ?上述結果表明,如果圖像中的目標被遮擋,那么被正確分類的概率會顯著降低,這表明這種可視化與激發特征圖的圖像結構式真正對應上的。即大概能知道位置。
3.6 圖像的一致性分析
? ? ? ?為了更進一步探究在深度模型中如何對同一類物體的不同圖像進行一致性分析。對五張小狗(同一類)的不同圖片的不同區域進行掩蓋,然后進行分析觀察探究深度模型是對一類物體的那部分進行一致性分析的過程。如下圖
? ? ? ? 上圖中按列的順序都是依次遮擋住左眼,右眼,鼻子等對于每幅圖像i,計算:,其中和各自代表第l層中原始和被遮擋的圖像,然后計算成對的圖像
???????????????????????????????????????????????????
為漢明距離,即漢明距離是一個概念,它表示兩個(相同長度)字對應位不同的數量,我們以d(x,y)表示兩個字x,y之間的漢明距離。對兩個字符串進行異或運算,并統計結果為1的個數,那么這個數就是漢明距離。所以得到的值越小,則有更好的一致性。下圖對第5層和第7層的特征圖中為2,3,4列以及其他隨機遮擋情況進行分析的Delta的得分情況,得分越低代表有更好的一致性。
? ? ? ? ?由上圖可以觀察到,在第5層隨機遮擋的情況比其他眼睛鼻子被遮擋的情況一致性分析較差,而第7層中,這四類卻都差不多,那是因為底層判別的是一類物體共有的部分,而高層判別的是類別中不同的品種這種更高維的部分了。
?
四、
6.總結
提出了一種可視化方法——核心“三反”;
發現學習到的特征遠不是無法解釋的,而是特征間存在層次性,層數越深,特征不變性越強,類別的判別能力越強;
通過可視化模型中間層,在alexnet基礎上進一步提升了分類效果;
遮擋實驗表明分類時模型和局部塊的特征高度相關;
模型的深度很關鍵;
預訓練模型可以在其他數據集上fine-tuning得到很好的結果。
?
總結
以上是生活随笔為你收集整理的ZF网络架构深度详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PowerPoint201设置特殊边框技
- 下一篇: 看完这篇文章,保你学会C语言switch