深度学习(二十七)可视化理解卷积神经网络(反池化 pooling unpooling)
不明白pooling,unpooling以及upsampling的區(qū)別,所以查閱了一些資料
以下為轉(zhuǎn)載原文
可視化理解卷積神經(jīng)網(wǎng)絡(luò)
原文地址:http://blog.csdn.net/hjimce/article/details/50544370
作者:hjimce
一、相關(guān)理論
本篇博文主要講解2014年ECCV上的一篇經(jīng)典文獻:《Visualizing and Understanding Convolutional Networks》,可以說是CNN領(lǐng)域可視化理解的開山之作,這篇文獻告訴我們CNN的每一層到底學(xué)習(xí)到了什么特征,然后作者通過可視化進行調(diào)整網(wǎng)絡(luò),提高了精度。最近兩年深層的卷積神經(jīng)網(wǎng)絡(luò),進展非常驚人,在計算機視覺方面,識別精度不斷的突破,CVPR上的關(guān)于CNN的文獻一大堆。然而很多學(xué)者都不明白,為什么通過某種調(diào)參、改動網(wǎng)絡(luò)結(jié)構(gòu)等,精度會提高。可能某一天,我們搞CNN某個項目任務(wù)的時候,你調(diào)整了某個參數(shù),結(jié)果精度飆升,但如果別人問你,為什么這樣調(diào)參精度會飆升呢,你所設(shè)計的CNN到底學(xué)習(xí)到了什么牛逼的特征?(PS:之前領(lǐng)導(dǎo)一直鄙視我,要我解釋CNN的每一層到底學(xué)習(xí)到了什么特征,解答不上來,被鄙視了一番,最后才去學(xué)了這篇文獻)。
這篇文獻的目的,就是要通過特征可視化,告訴我們?nèi)绾瓮ㄟ^可視化的角度,查看你的精度確實提高了,你設(shè)計CNN學(xué)習(xí)到的特征確實比較牛逼。這篇文獻是經(jīng)典必讀文獻,才發(fā)表了一年多,引用次數(shù)就已經(jīng)達到了好幾百,學(xué)習(xí)這篇文獻,對于我們今后深入理解CNN,具有非常重要的意義。總之這篇文章,牛逼哄哄。
二、利用反卷積實現(xiàn)特征可視化
為了解釋卷積神經(jīng)網(wǎng)絡(luò)為什么work,我們就需要解釋CNN的每一層學(xué)習(xí)到了什么東西。為了理解網(wǎng)絡(luò)中間的每一層,提取到特征,paper通過反卷積的方法,進行可視化。反卷積網(wǎng)絡(luò)可以看成是卷積網(wǎng)絡(luò)的逆過程。反卷積網(wǎng)絡(luò)在文獻《Adaptive?deconvolutional?networks?for?mid?and?high?level?feature?learning》中被提出,是用于無監(jiān)督學(xué)習(xí)的。然而本文的反卷積過程并不具備學(xué)習(xí)的能力,僅僅是用于可視化一個已經(jīng)訓(xùn)練好的卷積網(wǎng)絡(luò)模型,沒有學(xué)習(xí)訓(xùn)練的過程。
反卷積可視化以各層得到的特征圖作為輸入,進行反卷積,得到反卷積結(jié)果,用以驗證顯示各層提取到的特征圖。舉個例子:假如你想要查看Alexnet?的conv5提取到了什么東西,我們就用conv5的特征圖后面接一個反卷積網(wǎng)絡(luò),然后通過:反池化、反激活、反卷積,這樣的一個過程,把本來一張13*13大小的特征圖(conv5大小為13*13),放大回去,最后得到一張與原始輸入圖片一樣大小的圖片(227*227)。
1、反池化過程
我們知道,池化是不可逆的過程,然而我們可以通過記錄池化過程中,最大激活值得坐標位置。然后在反池化的時候,只把池化過程中最大激活值所在的位置坐標的值激活,其它的值置為0,當然這個過程只是一種近似,因為我們在池化的過程中,除了最大值所在的位置,其它的值也是不為0的。剛好最近幾天看到文獻:《Stacked What-Where Auto-encoders》,里面有個反卷積示意圖畫的比較好,所有就截下圖,用這篇文獻的示意圖進行講解:
以上面的圖片為例,上面的圖片中左邊表示pooling過程,右邊表示unpooling過程。假設(shè)我們pooling塊的大小是3*3,采用max?pooling后,我們可以得到一個輸出神經(jīng)元其激活值為9,pooling是一個下采樣的過程,本來是3*3大小,經(jīng)過pooling后,就變成了1*1大小的圖片了。而upooling剛好與pooling過程相反,它是一個上采樣的過程,是pooling的一個反向運算,當我們由一個神經(jīng)元要擴展到3*3個神經(jīng)元的時候,我們需要借助于pooling過程中,記錄下最大值所在的位置坐標(0,1),然后在unpooling過程的時候,就把(0,1)這個像素點的位置填上去,其它的神經(jīng)元激活值全部為0。再來一個例子:
?
在max?pooling的時候,我們不僅要得到最大值,同時還要記錄下最大值得坐標(-1,-1),然后再unpooling的時候,就直接把(-1-1)這個點的值填上去,其它的激活值全部為0。
2、反激活
我們在Alexnet中,relu函數(shù)是用于保證每層輸出的激活值都是正數(shù),因此對于反向過程,我們同樣需要保證每層的特征圖為正值,也就是說這個反激活過程和激活過程沒有什么差別,都是直接采用relu函數(shù)。
3、反卷積
對于反卷積過程,采用卷積過程轉(zhuǎn)置后的濾波器(參數(shù)一樣,只不過把參數(shù)矩陣水平和垂直方向翻轉(zhuǎn)了一下),這一點我現(xiàn)在也不是很明白,估計要采用數(shù)學(xué)的相關(guān)理論進行證明。
最后可視化網(wǎng)絡(luò)結(jié)構(gòu)如下:
?
網(wǎng)絡(luò)的整個過程,從右邊開始:輸入圖片-》卷積-》Relu-》最大池化-》得到結(jié)果特征圖-》反池化-》Relu-》反卷積。到了這邊,可以說我們的算法已經(jīng)學(xué)習(xí)完畢了,其它部分是文獻要解釋理解CNN部分,可學(xué)可不學(xué)。
總的來說算法主要有兩個關(guān)鍵點:1、反池化 ?2、反卷積,這兩個源碼的實現(xiàn)方法,需要好好理解。
三、理解可視化
特征可視化:一旦我們的網(wǎng)絡(luò)訓(xùn)練完畢了,我們就可以進行可視化,查看學(xué)習(xí)到了什么東西。但是要怎么看?怎么理解,又是一回事了。我們利用上面的反卷積網(wǎng)絡(luò),對每一層的特征圖進行查看。
1、特征可視化結(jié)果:
總的來說,通過CNN學(xué)習(xí)后,我們學(xué)習(xí)到的特征,是具有辨別性的特征,比如要我們區(qū)分人臉和狗頭,那么通過CNN學(xué)習(xí)后,背景部位的激活度基本很少,我們通過可視化就可以看到我們提取到的特征忽視了背景,而是把關(guān)鍵的信息給提取出來了。從layer 1、layer 2學(xué)習(xí)到的特征基本上是顏色、邊緣等低層特征;layer 3則開始稍微變得復(fù)雜,學(xué)習(xí)到的是紋理特征,比如上面的一些網(wǎng)格紋理;layer 4學(xué)習(xí)到的則是比較有區(qū)別性的特征,比如狗頭;layer 5學(xué)習(xí)到的則是完整的,具有辨別性關(guān)鍵特征。
2、特征學(xué)習(xí)的過程。作者給我們顯示了,在網(wǎng)絡(luò)訓(xùn)練過程中,每一層學(xué)習(xí)到的特征是怎么變化的,上面每一整張圖片是網(wǎng)絡(luò)的某一層特征圖,然后每一行有8個小圖片,分別表示網(wǎng)絡(luò)epochs次數(shù)為:1、2、5、10、20、30、40、64的特征圖:
結(jié)果:(1)仔細看每一層,在迭代的過程中的變化,出現(xiàn)了sudden?jumps;(2)從層與層之間做比較,我們可以看到,低層在訓(xùn)練的過程中基本沒啥變化,比較容易收斂,高層的特征學(xué)習(xí)則變化很大。這解釋了低層網(wǎng)絡(luò)的從訓(xùn)練開始,基本上沒有太大的變化,因為梯度彌散嘛。(3)從高層網(wǎng)絡(luò)conv5的變化過程,我們可以看到,剛開始幾次的迭代,基本變化不是很大,但是到了40~50的迭代的時候,變化很大,因此我們以后在訓(xùn)練網(wǎng)絡(luò)的時候,不要著急看結(jié)果,看結(jié)果需要保證網(wǎng)絡(luò)收斂。
3、圖像變換。從文獻中的圖片5可視化結(jié)果,我們可以看到對于一張經(jīng)過縮放、平移等操作的圖片來說:對網(wǎng)絡(luò)的第一層影響比較大,到了后面幾層,基本上這些變換提取到的特征沒什么比較大的變化。
個人總結(jié):我個人感覺學(xué)習(xí)這篇文獻的算法,不在于可視化,而在于學(xué)習(xí)反卷積網(wǎng)絡(luò),如果懂得了反卷積網(wǎng)絡(luò),那么在以后的文獻中,你會經(jīng)常遇到這個算法。大部分CNN結(jié)構(gòu)中,如果網(wǎng)絡(luò)的輸出是一整張圖片的話,那么就需要使用到反卷積網(wǎng)絡(luò),比如圖片語義分割、圖片去模糊、可視化、圖片無監(jiān)督學(xué)習(xí)、圖片深度估計,像這種網(wǎng)絡(luò)的輸出是一整張圖片的任務(wù),很多都有相關(guān)的文獻,而且都是利用了反卷積網(wǎng)絡(luò),取得了牛逼哄哄的結(jié)果。所以我覺得我學(xué)習(xí)這篇文獻,更大的意義在于學(xué)習(xí)反卷積網(wǎng)絡(luò)。
參考文獻:
1、《Visualizing and Understanding Convolutional Networks》
2、《Adaptive?deconvolutional?networks?for?mid?and?high?level?feature?learning》
3、《Stacked What-Where Auto-encoders》
**********************作者:hjimce ? 時間:2016.1.10 ?聯(lián)系QQ:1393852684 ??原創(chuàng)文章,轉(zhuǎn)載請保留原文地址、作者等信息**************總結(jié)
以上是生活随笔為你收集整理的深度学习(二十七)可视化理解卷积神经网络(反池化 pooling unpooling)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv轮廓及点在轮廓内判断
- 下一篇: 关于图像语义分割的总结和感悟