『cs231n』卷積神經網絡的可視化與進一步理解

cs231n的第18課理解起來很吃力,聽後又查了一些資料纔算是勉強弄懂,因此這裏貼一篇博文(根據本身理解有所修改)和原論文的翻譯加深加深理解,其中原論文翻譯比博文更容易理解,可是太長,而博文是業者而非學者所著,看着也更舒服一點。html

另,本文涉及了反向傳播的backpropagation算法,知乎上有個回答很不錯,備份到文章裏了,爲支持原做者,這裏給出知乎原文鏈接算法

 

可視化理解卷積神經網絡

 

這張PPT是本節課的核心,下面我來講說這張圖。網絡

可視化神經網絡的思想就是構建一個逆向的卷積神經網絡,可是不包括訓練過程,使用原網絡各個層的feature map看成輸入,逆向生成像素級圖片(各個層對應的具體逆操做實現方法下面的文獻中有介紹),目的是研究每一層中每個神經元對應的(或者說學習到的)特徵究竟是什麼樣的。數據結構

咱們首先獲取某一層的feature map,而後將除了想要研究的那個神經元以外全部神經元置零,做爲返卷積網絡的輸入(a圖所示),通過逆向重構後,獲得的圖片就反映了這個神經元學習到的特徵。ide

Relu層的逆處理獲得了特殊關注,向前傳播中,小於零的神經元直接置零(b1),若是按照計算梯度的反向傳播算法(backpropagation)的話那麼應該在向前傳播時置零的位置仍然置零(b2),而原論文按照deconvent的方法,至關於把Relu對稱化,直接對反向的特徵圖進行了標準的Relu,即小於零的神經元反向時也置零(b3),可是老師則採用了guided backpropagation結合了兩種方法,即知足上兩條的全都置零(b4),子圖c用表達式解釋了這一過程。函數

 

根據Feature Map尋找最優輸入

例如一個1000分類網絡,我想看看對於已經訓練好的模型,我但願輸出是[0,0,...,1,...0],什麼樣的圖片會最適合這個輸出?學習

思路是feed一張全0圖片,設定爲可訓練的變量(我按照本身對tensorflow的理解自行解釋的233),而其餘參數均不可訓練,而後設定一個如上圖的loss函數,去迭代優化它,好比下面(2,1)圖嘗試在整張圖片上畫滿鵝來提升分數(包括deep dreaming技術在內,我以爲大部分讓神經網絡本身畫圖的東西結果都挺反人類的):優化

 不過仔細想一想也不是很新奇,這個東西實際上和自編碼器是一個道理,都是提取特徵後使用特徵反推圖像的技術,不過自編碼器目的是原始圖像,這個更隨意一點,就是反推某個特徵值的可視化表達。ui

下面是根據全層神經元反推的結果,這直觀的表達了隨着卷積網絡的推演丟失了多少細節信息:編碼

 

 

 

附件1:可視化理解卷積神經網絡

原文地址

1、相關理論

本篇博文主要講解2014年ECCV上的一篇經典文獻:《Visualizing and Understanding Convolutional Networks》,能夠說是CNN領域可視化理解的開山之做,這篇文獻告訴咱們CNN的每一層到底學習到了什麼特徵,而後做者經過可視化進行調整網絡,提升了精度。最近兩年深層的卷積神經網絡,進展很是驚人,在計算機視覺方面,識別精度不斷的突破,CVPR上的關於CNN的文獻一大堆。然而不少學者都不明白,爲何經過某種調參、改動網絡結構等,精度會提升。可能某一天,咱們搞CNN某個項目任務的時候,你調整了某個參數,結果精度飆升,但若是別人問你,爲何這樣調參精度會飆升呢,你所設計的CNN到底學習到了什麼特徵?

這篇文獻的目的,就是要經過特徵可視化,告訴咱們如何經過可視化的角度,查看你的精度確實提升了,你設計CNN學習到的特徵確實比較牛逼。這篇文獻是經典必讀文獻,才發表了一年多,引用次數就已經達到了好幾百,學習這篇文獻,對於咱們從此深刻理解CNN,具備很是重要的意義。總之這篇文章,牛逼哄哄。

2、利用反捲積實現特徵可視化

爲了解釋卷積神經網絡爲何work,咱們就須要解釋CNN的每一層學習到了什麼東西。爲了理解網絡中間的每一層,提取到特徵,paper經過反捲積的方法,進行可視化。反捲積網絡能夠當作是卷積網絡的逆過程。反捲積網絡在文獻《Adaptive deconvolutional networks for mid and high level feature learning》中被提出,是用於無監督學習的。然而本文的反捲積過程並不具有學習的能力,僅僅是用於可視化一個已經訓練好的卷積網絡模型,沒有學習訓練的過程。

反捲積可視化以各層獲得的特徵圖做爲輸入,進行反捲積,獲得反捲積結果,用以驗證顯示各層提取到的特徵圖。舉個例子:假如你想要查看Alexnet 的conv5提取到了什麼東西,咱們就用conv5的特徵圖後面接一個反捲積網絡,而後經過:反池化、反激活、反捲積,這樣的一個過程,把原本一張13*13大小的特徵圖(conv5大小爲13*13),放大回去,最後獲得一張與原始輸入圖片同樣大小的圖片(227*227)。

一、反池化過程

咱們知道,池化是不可逆的過程,然而咱們能夠經過記錄池化過程當中,最大激活值得座標位置。而後在反池化的時候,只把池化過程當中最大激活值所在的位置座標的值激活,其它的值置爲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。

二、反激活

咱們在Alexnet中,relu函數是用於保證每層輸出的激活值都是正數,所以對於反向過程,咱們一樣須要保證每層的特徵圖爲正值,也就是說這個反激活過程和激活過程沒有什麼差異,都是直接採用relu函數。

三、反捲積

對於反捲積過程,採用卷積過程轉置後的濾波器(參數同樣,只不過把參數矩陣水平和垂直方向翻轉了一下),這一點我如今也不是很明白,估計要採用數學的相關理論進行證實。

最後可視化網絡結構以下:

 

網絡的整個過程,從右邊開始:輸入圖片-》卷積-》Relu-》最大池化-》獲得結果特徵圖-》反池化-》Relu-》反捲積。到了這邊,能夠說咱們的算法已經學習完畢了,其它部分是文獻要解釋理解CNN部分,可學可不學。

總的來講算法主要有兩個關鍵點:一、反池化  二、反捲積,這兩個源碼的實現方法,須要好好理解。

3、理解可視化

特徵可視化:一旦咱們的網絡訓練完畢了,咱們就能夠進行可視化,查看學習到了什麼東西。可是要怎麼看?怎麼理解,又是一回事了。咱們利用上面的反捲積網絡,對每一層的特徵圖進行查看。

一、特徵可視化結果


總的來講,經過CNN學習後,咱們學習到的特徵,是具備辨別性的特徵,好比要咱們區分人臉和狗頭,那麼經過CNN學習後,背景部位的激活度基本不多,咱們經過可視化就能夠看到咱們提取到的特徵忽視了背景,而是把關鍵的信息給提取出來了。從layer 一、layer 2學習到的特徵基本上是顏色、邊緣等低層特徵;layer 3則開始稍微變得複雜,學習到的是紋理特徵,好比上面的一些網格紋理;layer 4學習到的則是比較有區別性的特徵,好比狗頭;layer 5學習到的則是完整的,具備辨別性關鍵特徵。

二、特徵學習的過程做者給咱們顯示了,在網絡訓練過程當中,每一層學習到的特徵是怎麼變化的,上面每一整張圖片是網絡的某一層特徵圖,而後每一行有8個小圖片,分別表示網絡epochs次數爲:1251020304064的特徵圖:


結果:(1)仔細看每一層,在迭代的過程當中的變化,出現了sudden jumps;(2)從層與層之間作比較,咱們能夠看到,低層在訓練的過程當中基本沒啥變化,比較容易收斂,高層的特徵學習則變化很大。這解釋了低層網絡的從訓練開始,基本上沒有太大的變化,由於梯度彌散嘛。(3)從高層網絡conv5的變化過程,咱們能夠看到,剛開始幾回的迭代,基本變化不是很大,可是到了40~50的迭代的時候,變化很大,所以咱們之後在訓練網絡的時候,不要着急看結果,看結果須要保證網絡收斂。

三、圖像變換。從文獻中的圖片5可視化結果,咱們能夠看到對於一張通過縮放、平移等操做的圖片來講:對網絡的第一層影響比較大,到了後面幾層,基本上這些變換提取到的特徵沒什麼比較大的變化。

我的總結:我我的感受學習這篇文獻的算法,不在於可視化,而在於學習反捲積網絡,若是懂得了反捲積網絡,那麼在之後的文獻中,你會常常遇到這個算法。大部分CNN結構中,若是網絡的輸出是一整張圖片的話,那麼就須要使用到反捲積網絡,好比圖片語義分割、圖片去模糊、可視化、圖片無監督學習、圖片深度估計,像這種網絡的輸出是一整張圖片的任務,不少都有相關的文獻,並且都是利用了反捲積網絡,取得了牛逼哄哄的結果。因此我以爲我學習這篇文獻,更大的意義在於學習反捲積網絡。

參考文獻:

一、《Visualizing and Understanding Convolutional Networks》

二、Adaptive deconvolutional networks for mid and high level feature learning》

三、《Stacked What-Where Auto-encoders》

 

 

附件二:Visualizing and Understanding Convolutional Networks

 

 

 

 

 

 

 ,

相關文章
相關標籤/搜索