1. 程式人生 > >【2017CS231n】第十二講:視覺化和理解卷積神經網路

【2017CS231n】第十二講:視覺化和理解卷積神經網路

一.特徵視覺化

1.1理解神將網路的層


    下面我們瞭解一下神經網路內部發生了什麼。

第一層:


第一個卷積層由一個卷積核組成
    在AlexNet中第一個卷積層由許多卷積核組成,每個卷積核的形狀是3*11*11,卷積核在影象上來回滑動,我們取影象塊和卷積核權重的內積,這就是第一個卷積層的輸出。AlexNet中有64個卷積核。
    在第一個卷積層中我們得到了卷積層權重與輸入影象畫素的內積,我們可以通過簡單地視覺化得到卷積核權重尋找的東西,來作為影象本身。所以在AlexNet中的3*11*11的卷積核可以看做有3通道的11*11的影象,並且給定紅藍綠值。因為有64個卷積核,所以我們把它看做64個小的3通道的11*11影象組成的大影象。
    右邊的三幅圖展示了卷積核在尋找的東西,他們在尋找有向邊,明暗線條,從不同角度和位置觀察輸入影象。這些就是學習到的第一個卷積層的權值。
    視覺化卷積核權重是為了觀察卷積核在尋找什麼,這個直覺來源於模板匹配和內積。

中間層:


    對中間的卷積層做相同的視覺化,他們的可解釋性就會差很多。
    經過第一層之後會有一些ReLU和其他一些非線性啟用函式。

    第一層輸出是16*3*7*7,第二層接收了16個輸入,使用20個16*7*7尺寸的卷積核,所以此時不能直接視覺化。因為第二層輸入影象的深度是16維,我們的卷積核尺寸是16*7*7並且沿著整個深度延伸,我們有20個相同的卷積核來產生下一層的輸出。對於一個16*7*7的卷積核,我們把16*7*7的卷積核平面展開成16*7*7的灰度影象,上面的圖展示了第二層某個卷積核的權重。

最後一層:


    在最後一層之前有一個全連線層,AlexNet為例,我們有4096維的特徵向量來表示我們的影象,然後將其輸入到最後一層來預測分類得分。

    通過我們訓練的卷積神經網路提取一些資料集來檢測一些影象,併為每一個影象標記對應的4096維的向量,並嘗試視覺化最後一個隱層。


    最鄰近方法,左邊的影象,我們在第二講中通過最近鄰,在畫素空間來尋找近鄰(左邊的是CIFAR 10資料集中的影象)。
    下面我們在神經網路的4096維向量中計算近鄰。
    右邊影象的第一列是分類資料集,後面的幾列影象是網路輸出的4096維向量計算的近鄰得出的結果。這跟根據畫素空間確定近鄰的方法得到的結果非常不同。
    查詢一頭站在左邊的大象,能查到一頭站在右邊的大象,他們在畫素空間上非常不同,所以用畫素最近鄰可能判斷不出來,但是神經網路學習到這兩個影象彼此之間非常相近。
    我們把影象輸入網路,在網路的最後一個隱層,寫出影象的4096維向量,計算影象與網路得到的4096維向量之間的鄰近。

降維:

    類似PCA,將4096維向量壓縮到二維空間,觀察特徵空間。
    t-SNE(t分佈鄰域嵌入)在深度學習常用的視覺化特徵的非線性降維方法。
    t-SNE的思想:
    有一張圖片,得到了關於圖片的三個不同資訊,影象的畫素,影象對應的4096維向量,然後使用t-SNE降維,將4096維向量轉化成2維向量,取影象原始畫素,把他們放在二維座標,對應4096維向量的降維版本。    

1.2最大啟用塊


    視覺化輸入影象中什麼型別的影象塊可以最大限度地啟用不同的特徵和不同的神經元,我們選取AlexNet的卷積層,記住AlexNet的每一個啟用量提供128*13*13的三維資料,我們選擇128通道中的一個,我們通過卷積神經網路執行很多影象,對每一個影象記錄他們的卷積特徵,可以觀察到特徵對映圖的部分已經被我們的影象資料集最大地啟用。
    卷積層中的每個神經元在輸入部分都有一些小的感受野,每個神經元的管轄部分並不是整個影象,他們只針對於這個影象的子集合,我們要做的是從這個龐大的影象資料集中,視覺化來自特定層,特定特徵的最大啟用影象塊,我們可以根據這些啟用塊在這些特定層的啟用程度來解決這個問題。
    右圖是啟用特定神經元的輸入影象塊的例項,這些是最大化啟用影象的視覺化,我們從神經網路的每一層選擇一個神將元,根據從大型資料集中提取的影象對這些神經元進行排序,這會使這個神經元被最大程度地啟用,

1.3遮擋實驗


    擋住影象的某個區域,把它替換成資料集的平均畫素,將被遮擋的影象輸入神經網路,記錄被遮擋影象的預測分類,將這個遮擋影象塊劃過輸入影象的每個位置,重複相同的過程。然後繪製圖像熱力圖,熱力圖顯示了什麼函式作為我們遮擋部分的預測概率輸出。
    思想:如果我們遮擋了影象的某個部分,並且導致了神經網路分值的急劇變化,那麼這個遮擋的輸入影象部分可能對分類決策起到非常重要的作用。

1.4顯著圖


    給一張狗的圖片和它對應的標籤,我們想知道影象的哪一些畫素對分類的結果影響最大。遮擋是一個方法,顯著圖從另一個角度來解決這個問題。
    計算機相對於影象畫素的預測類別分值,這將告訴我們在一階近似意義上對於輸入圖片的每個畫素如果我們進行小小的擾動,那麼相應分類的分值會有多大的變化。(輸入影象的哪一部分的畫素對分類會有較大影響)。
    當人們進行語義分割的時候也會運用顯著圖的方法。在沒有任何標籤的情況下可以運用顯著圖進行語義分割。

1.5引導式反向傳播

我們不使用類的分值,而是選取神經網路中間層的一些神經元,看影象中的哪些部分影響了神經網路內的神經元的分值。

二.梯度上升

    神經網路相當於一個函式告訴我們輸入影象的哪一部分影響了神經元的分值,問題是如果我們移除了影象上的這種依賴性後,什麼型別的輸入會啟用這個神經元。


    我們可以通過梯度上升法來解決這個問題,我們在訓練神經網路時總是用梯度下降來使函式損失最小,現在我們要修正訓練的卷積神經網路的權值,並且在影象的畫素上執行梯度上升來合成影象,嘗試最大化某些中間神將元和類的分值。在執行梯度上升過程中,我們不再優化神經網路中保持不變的權重,相反我們嘗試改變一些影象的畫素使這個神經元的值或這個類的分值最大化,我們還需要正則項來阻止我們生成的影象過擬合特定網路的特性。
    生成影象具備的屬性:一.最大程度地啟用一些分值或神經元的值,二. 我們希望這個生成的影象看起來是自然的。正則項強制生成的影象看起來是自然的影象。


    一個影象正則化的想法是懲罰生成影象的L2範數。
    除了新增L2範數的約束,還定期在優化過程中對影象進行高斯模糊處理,同時也將一些地梯度的小的畫素值修改為0,這是個投射梯度上升演算法,我們定期投射具備良好屬性的生成影象到更好的影象集中。例如影象在進行高斯模糊處理後獲得了平滑性,所以對圖形進行了高斯模糊後更容易獲得清晰的影象。
    有了更好的正則項,生成的影象會變得更逼真。

三.對抗樣本


愚弄網路。

選取一張大象的影象,告訴網路我們想要最大化這張圖中考拉的分值,然後我們要做的是改變這張圖中大象的形象讓神經網路將它歸為考拉。


    按照人類直覺來說,如果大象的圖片被歸為考拉,那麼大象的圖片將會被改變很多,起碼變得要像一個考拉。
    但是右邊的第二圖大象圖被歸為考拉,但是在我們看來這兩幅圖基本一致;同樣右邊的帆船被歸為ipod。

四.DeepDream


    提取我們輸入的影象,通過神經網路執行到某一層,接著進行反向傳播並且設定該層的梯度等於啟用值,然後反向傳播到影象並且不斷更新影象。
    對於以上步驟的解釋:試圖放大神經網路在這張影象中檢測到的特徵,無論那一層上存在什麼樣的特徵,現在我們設定梯度等於特徵值,以使神經網路放大它在影象中所檢測到的特徵。

    這種方法同樣可用於最大化影象在該層的L2範數。


    計算梯度之前抖動影象,而不是通過神經網路執行完全和原圖相同的影象,這是一種正則化的方法,使得生成的影象更平滑。
除此之外也使用梯度的L1歸一化或者修改畫素值來進行正則化。


    做完這些以後,小的特徵得到了放大。

    出現的影象在向我們傳達神經網路訓練資料的情況,這是一個影象分類訓練的網路,有1000個分類,其中200個是狗,所以生成的影象中出現了很多狗(畫風很魔幻)。


       當我們在神經網路的其他層做相同的操作也會得到同樣的結果,這裡我們只選取神經網路的一個低層,之前的例子在神經網路的較高層,在計算邊時神經網路的低層具備可解釋性,當在神經網路較低層執行DeepDream這種情況很明顯。


    長時間執行DeepDream並且進行多尺度處理,首先用一個小的影象在DeepDream執行,影象變大後繼續在DeepDream執行,並且不斷重複地執行多尺度處理。

五.風格遷移

5.1特徵反演


    選取一張圖片,通過神經網路執行該圖片,記錄其中一個圖片的特徵值,根據它的特徵表示重構那個影象,觀察那個重構影象我們會發現一些在該特徵向量中捕獲的影象型別的資訊。
    我們可以通過梯度上升和正則化來做到。與其最大化某些分值,不如最小化捕捉到的特徵向量之間的距離,並且在生成影象的特徵之間嘗試合成一個新的與之前計算過的影象特徵相匹配的影象。

全變差正則化:

將左右相鄰畫素間的差異拼湊成上下相鄰,以嘗試增加生成影象中特殊的平滑度。


    最左邊是原始影象,右邊是使用特徵反演之後的效果。
    我們通過VGG-16神經網路執行這個影象,記錄這個神經網路某一層的特徵,然後嘗試生成一個與那一層記錄的特徵相匹配的新影象。這讓我們瞭解到這張影象在神經網路不同層的這些特徵的資訊儲存量。
    例如如果嘗試基於VGG-16神經網路的ReLU2_2特徵重構影象,可以看到影象被完美重構,即不會丟失該層原始畫素的很多資訊;但是當我們移動到神經網路的更深處,並且嘗試從ReLU4_3 ReLU5_1重構影象,可以看到影象的一般空間結構被保留了下來,仍可以分辨出大象,蘋果和香蕉。但是許多低層次的細節並不是原始影象的真正畫素值,並且紋理的顏色也和原先不同。這些低層次細節在神經網路的較高層更容易損失。
    我們注意到隨著影象在神經網路中層數的上升,可能會丟失影象真實畫素的低層次資訊,試圖保留下來影象的更多語義資訊。對於材質和顏色的小的變化它保持不變。

5.2紋理合成

5.2.1傳統方法


    給定一張紋理的輸入模組,尺寸很小。我們想構建某個模型,使其生成更大塊的相同的紋理影象。
    例如我們想生成更大塊的相同尺度的更大的影象。
    傳統方法:按照掃描線一次一個畫素地遍歷生成影象,根據已經生成的畫素檢視當前畫素周圍的鄰域,並在輸入影象的影象塊中計算近鄰,然後從輸入影象中複製畫素。
    但是當我們使用的是複雜紋理時,直接從輸入影象的影象塊複製畫素的方法可能會行不通。

5.2.2 神經網絡合成


    使用了gram矩陣,選取我們輸入的石頭的紋理,把它傳遞給卷積神經網路,抽取他們在卷積網路某層的卷積特徵,假設我們正在討論的卷積特徵體積是C*H*W,可以把它看成是H*W的空間網格,在網格上的每一點都有C維的特徵向量來描述影象在這點的外觀。
    我們將會使用啟用對映圖來計算輸入紋理影象的對映符,然後選取輸入特徵的兩個不同列,每個特徵列都是C維的向量,然後通過這兩個向量得到C*C的矩陣。這個C*C矩陣告訴我們兩個點代表的不同特徵的同現關係,如果C*C矩陣中位置索引為ij的元素值非常大,這意味著這兩個輸入向量的位置索引為i和j的元素值非常大。
    這以某種方式捕獲了一些二階統計量,即對映特徵圖中的哪些特徵傾向於在空間的不同位置一起啟用。

    我們將使用H*W網格中不同點所對應的特徵向量取他們的平均值,那麼我們會得到C*Cgram矩陣,然後使用這些描述符來描述輸入影象的紋理結構。
關於gram矩陣:
    它丟棄了特徵體積中的所有空間資訊,因為我們對影象中的每一點所對應的特徵向量取平均值,它只是捕獲特徵間的二階同現統計量,這最終是一個很好的紋理描述符。
並且gram的計算效率非常高,如果有C*H*W三維張量,可以對他們進行重新組合得到C*H*W,然後乘以它本身的轉置矩陣,這些計算都是一次性的。

    使用協方差矩陣同樣有效,但是計算成本要高。


    一旦我們有了紋理在神經網路上的描述符,我們可以通過梯度上升來合成與原始影象紋理相匹配的新的影象。這看起來跟我們之前說的特徵重構有些類似,但是這不是試圖重構輸入影象的全部特徵對映,而是嘗試重構輸入影象的gram矩陣紋理描述符。

    人們用紋理影象來訓練VGG網路,並計算網路不同層的gram矩陣,然後隨機初始化新的影象,接著使用梯度上升,即隨機選取    一張圖片,使他通過VGG,計算在各層上的gram矩陣,並且計算輸入影象紋理矩陣和生成影象紋理矩陣之間的L2範數損失,然後進行反向傳播,並計算生成影象的畫素值梯度,然後根據梯度上升一點點更新影象的畫素,不斷重複這個過程,即計算gram矩陣的L2範數損失,反向傳播影象梯度,最終會生成與紋理影象相匹配的紋理影象。


    頂部是原始影象,下面是生成的新的紋理影象,通過格拉姆矩陣匹配的紋理合成方法合成的新影象。即計算在前訓練卷積神經網路中不同層的gram矩陣,如果我們使用卷積神經網路的較低層,那麼通常會得到顏色的斑點,總體的結構並沒有被很好的保留下來,下面的影象即在神經網路的較深層計算gram矩陣,他們傾向於更大力度地重建輸入影象,這在合成新影象時可以很好地匹配輸入影象一般的空間統計量,但是他們在畫素上和真實的輸入影象本身有很大的差別。

5.3風格遷移


    通過增大gram矩陣做相同的紋理合成演算法,畢加索的星空圖作為紋理輸入影象,然後執行相同的紋理合成演算法。

    當把gram矩陣匹配紋理合成方法與特徵匹配的反演法結合起來,就形成了風格遷移演算法。


    兩張圖片作為輸入,選取其中一張作為內容影象,它將引導我們生成影象的主題,風格影象負責生成影象的紋理和風格。然後共同做特徵識別,通過最小化內容影象的特徵重構損失,以及風格影象的gram矩陣損失。


    選取內容影象和風格影象,使他們通過神經網路,計算gram矩陣和特徵,使用隨機噪聲初始化輸出影象,計算L2範數損失以及影象上的畫素梯度,重複這些步驟,在生成影象上執行梯度上升。經過一些迭代後會生成風格遷移後的影象。


5.4快速風格遷移

    之前討論的風格遷移需要很大的運算量。


    在一開始就修改我們想要遷移的風格,在這種情況下不是為我們想要合成的每個影象執行一個獨立的優化程式,而是訓練一個可以輸入內容影象的前饋網路,直接輸出風格遷移後的結果。訓練前饋神將網路的方法是在訓練期間計算相同內容影象和風格影象的損失,然後使用相同梯度來更新前饋神經網路的權重,一旦訓練完成,只需在訓練好的網路上進行單一的正向傳播。

總結:

    今天用了很多方法來理解CNN,基於近鄰,降維,最大化影象塊及遮擋影象的啟用法,以使在啟用值的基礎上理解這些特徵在尋找什麼,基於梯度的方法,使用梯度來合成新影象來理解特徵的意義,比如顯著圖,類的視覺化,愚弄影象,特徵反演。