ZFNet出自論文《 Visualizing and Understanding Convolutional Networks》,作者Matthew D. Zeiler和Rob Fergus——顯然ZFNet是以兩位作者名字的首字母命名的。ZFNet通常被認為是ILSVRC 2013的冠軍方法,但實際上ZFNet排在第3名,前兩名分別是Clarifai和NUS,不過Clarifai和ZFNet都出自Matthew D. Zeiler之手,見ILSVRC2013 results。
ZFNet的網絡架構是在AlexNet基礎上修改而來,與AlexNet相比,差異不大:
- 第1個卷積層,kernel size從11減小為7,將stride從4減小為2(這將導致feature map增大1倍)
- 為了讓后續feature map的尺寸保持一致,第2個卷積層的stride從1變為2
僅這2項修改,就獲得了幾個點的性能提升。所以,重要的是為什么這樣修改?這樣修改的動機是什么?文中這樣敘述:
通過對AlexNet的特征進行可視化,文章作者發現第2層出現了aliasing。在數字信號處理中,aliasing是指在采樣頻率過低時出現的不同信號混淆的現象,作者認為這是第1個卷積層stride過大引起的,為了解決這個問題,可以提高采樣頻率,所以將stride從4調整為2,與之相應的將kernel size也縮小(可以認為stride變小了,kernel沒有必要看那么大范圍了),這樣修改前后,特征的變化情況如下圖所示,第1層呈現了更多更具區分力的特征,第二2層的特征也更加清晰,沒有aliasing現象。
這就引出了另外一個問題,如何將特征可視化?正如論文標題Visualizing and Understanding Convolutional Networks所顯示的那樣,與提出一個性能更好的網絡結構相比,這篇論文更大的貢獻在于提出一種將卷積神經網絡深層特征可視化的方法。
可視化操作,針對的是已經訓練好的網絡,或者訓練過程中的網絡快照,可視化操作不會改變網絡的權重,只是用于分析和理解在給定輸入圖像時網絡觀察到了什么樣的特征,以及訓練過程中特征發生了什么變化。
給定1張輸入圖像,先前向傳播,得到每一層的feature map,如果想可視化第i層學到的特征,保留該層feature map的最大值,將其他位置和其他feature map置0,將其反向映射回原始輸入所在的像素空間。對于一般的卷積神經網絡,前向傳播時不斷經歷 input image→conv → rectification → pooling →……,可視化時,則從某一層的feature map開始,依次反向經歷 unpooling → rectification → deconv → …… → input space,如下圖所示,上方對應更深層,下方對應更淺層,前向傳播過程在右半側從下至上,特征可視化過程在左半側從上至下:
可視化時每一層的操作如下:
- Unpooling:在前向傳播時,記錄相應max pooling層每個最大值來自的位置,在unpooling時,根據來自上層的map直接填在相應位置上,如上圖所示,Max Locations “Switches”是一個與pooling層輸入等大小的二值map,標記了每個局部極值的位置。
- Rectification:因為使用的ReLU激活函數,前向傳播時只將正值原封不動輸出,負值置0,“反激活”過程與激活過程沒什么分別,直接將來自上層的map通過ReLU。
- Deconvolution:可能稱為transposed convolution更合適,卷積操作output map的尺寸一般小于等于input map的尺寸,transposed convolution可以將尺寸恢復到與輸入相同,相當于上采樣過程,該操作的做法是,與convolution共享同樣的卷積核,但需要將其左右上下翻轉(即中心對稱),然后作用在來自上層的feature map進行卷積,結果繼續向下傳遞。
不斷經歷上述過程,將特征映射回輸入所在的像素空間,就可以呈現出人眼可以理解的特征。給定不同的輸入圖像,看看每一層關注到最顯著的特征是什么,如下圖所示: