梯度上升可視化卷積神經網絡

2020-12-11 雷鋒網

雷鋒網 AI科技評論按:本文作者陳仲銘,雷鋒網 AI科技評論獲其授權發布。

為什麼我的CNN網絡模型訓練出來的東西總是過度擬合?已經改了很多次參數都不行,到底是樣本有問題還是網絡模型定義有問題?問題在哪來?

CNN網絡模型中的每一層學習的是些什麼特徵?為什麼有的人說第一層卷積核提取的是邊緣信息特徵,有的人卻說第一層卷積核提取的是顏色特徵?到底是兩者都有還是什麼回事?

CNN網絡可不可以減掉幾層然後保持相同的精度和損失率呢?減掉幾層可以減少網絡參數,本來我的GPU顯存不是很大,太大的網絡塞不下,不想重新買GPU只能減層,有沒有大神可以教教我怎麼操作啊?

很多時候我們會遇到上面的問題,然後道聽途說地開始給別人瞎粑粑吹吹牛皮。在這之前,連我自己都不知道VGG16網絡最後兩層block5 conv2,block5 conv3訓練到最後幾乎沒有太多的紋理特徵。你知道嗎?不知道的話可以跟我一起學習學習,我也是個初學者,在國內CNN還沒有太流行起來之前就開始跳坑,到現在蹲坑已深。棄坑 ing。。。。

最近為自己所在的公司寫了一個工具來分析訓練出來的CNN網絡模型,如下圖所示:從第一張圖我們可以看到這張圖有一些goldfish金魚的模型,好像有很多條魚尾巴,然後中間有好多鱗片,一張很奇怪的圖像,但是別嫌棄這張圖像,因為假設你把這張圖像扔到經過ImageNet數據集訓練過的VGGNet模型,出來為goldfish的概率絕對是99%的,你多試100次看是不是都為goldfish。

同理,第2張圖,第3張圖,都是這樣的結果,連我學文科的妹紙看到這些圖就yaya叫,這是什麼,好噁心,怎麼第3張有點像鳥但是有不是鳥的呢。對,我們搞神經網絡的就喜歡這些噁心的圖片。越噁心特徵越明顯。

通過梯度上升獲得可視化卷積圖

假設人工合成的可視化卷積核圖為 x,我們希望這張合成圖 x 能夠使其對應的神經元(卷積核)具有最高的激活值。所得到的這張合成圖像就是該卷基層的卷積核「想要看到的」或者「正在尋找的紋理特徵」。也就是說我們希望找到一張圖像經過CNN網絡,傳播到指定的卷積核的時候,這張圖片可以使得該卷積核的得分最高。

為了合成這一張圖片,我們開始從一張帶有隨機噪聲的圖像開始,每個像素值隨機選取一種顏色。

接下來,我們使用這張噪聲圖作為CNN網絡的輸入向前傳播,然後取得其在網絡中第 i 層 j 個卷積核的激活 a_ij(x),然後做一個反向傳播計算 delta a_i(x)/delta x 的梯度,最後我們把該噪聲圖的卷積核梯度來更新噪聲圖。目標是希望通過改變每個像素的顏色值以增加對該卷積核的激活,這裡就使用了梯度上升法:

其中 itselong 為梯度上升的學習率。不斷重複上述過程,直到圖像 x 能夠讓第 i 層第 j 個卷積核具有較高的激活值。

對於具體的實現我們需要定義一個損失函數,該損失函數將用於最大化某個指定卷積核的激活值。以該損失函數作為優化目標,我們可以了解到底什麼樣的圖片才可以使得這個卷積核取得更好的激活值。

現在我們使用Keras的後端來完成這個損失函數, gradients(loss, variables)為返回loss函數關於variables的梯度。

start_time = time.time() # The loss is the activation of the neuron for the chosen class loss = layer_output[0, class_index] # we compute the gradient of the input picture wrt this loss grads = K.gradients(loss, input_img)[0] # this function returns the loss and grads given the input picture # also add a flag to disable the learning phase (in our case dropout) iterate = K.function([input_img, K.learning_phase()], [loss, grads]) np.random.seed(1337) # for reproducibility # we start from a gray image with some random noise input_img_data = np.random.normal(0, 10, (1,) + model.input_shape[1:]) # (1,) for batch axis

注意這裡有個小小的trick——對計算出來的梯度進行了L2正則化操作,使得梯度不會過小或過大,其帶來的好處是使梯度上升的過程平滑進行。

後端函數function用傳遞來的參數實例化一個Keras的Function類返回。這相當於Function的對象當作函數來使用,相當於重載了括號運算符,如outputs = self.train_function(inputs)。

根據剛剛定義的損失函數iterate_fun,現在可以根據梯度上升對卷積核的激活值進行梯度上升計算。

# we run gradient ascent for 1000 steps for i in range(1000): loss_value, grads_value = iterate([input_img_data, 0]) # 0 for test phase input_img_data += grads_value * learning_rate # Apply gradient to image print('Current loss value:', loss_value) # decode the resulting input image and add it to the list img = deprocess(input_img_data[0]) kept_images.append((img, loss_value)) end_time = time.time() print('Filter %d processed in %ds' % (class_index, end_time - start_time))

最後輸出的圖像如下圖所示,這是魚頭?還是羊頭?不看ImageNet的連接我也不知道是什麼頭。不過這樣的方法是我們讓輸入的圖像儘量與卷積核希望看到的東西一樣,通過該層卷積核的損失和梯度進行上升補充,對輸入的原圖進行填充細節,最後得到可視化卷積核圖。

可視化所有卷積核圖

可視化卷積核是本例子最有趣的部分,也是筆者最喜歡的部分。通過分析CNN網絡模型中的卷積核,我們將會看到每一層卷積核到底提取的是什麼樣的內容、紋理、特徵。當我們深入了解CNN模型提取特徵背後的意義,就可以有足夠信心去修改卷積神經網絡CNN的參數。

下面我們將會利用已經訓練好的VGG16網絡模型,來系統地可視化各個網絡層的各個卷積核,看看CNN是對輸入進行逐層分解提取特徵的到底都是些什麼。

最後的執行結果如下圖所示,Block1_Conv1的卷積核主要完成如顏色、方向等編碼,到了Block2_Conv2的卷積核明顯比Block1_Conv1多了更多的紋理和不同的紋理方向,所表達的顏色也更加豐富多樣,並且在邊緣處可以看到有部分凹凸表現。

隨著VGG16網絡模型繼續深入,這些顏色和方向與基本的紋理進行組合,逐漸生成特殊紋理。當進入Block3_Conv1後,方向和顏色的表現開始變少,開始出現更加複雜的紋理特徵(圓形、螺旋形、多邊形、波浪等形狀組合),到了Block5_Conv1後可以清晰看到其紋理更加特別,卷積核隨著網絡空間信息的增長而出現了更加精細和複雜的特徵。

卷積核變得越來越複雜,因為他們開始納入越來越大的空間範圍信息中,所呈現和表達的信息進一步豐富。

細心的讀者經過實際的嘗試之後或許會發現:在同一卷積層中會出現少量的可視化卷積核是空白或者相同,這意味著該卷積核對後續的操作並沒有產生實際的作用,可以通過Dropout這些卷積核以減少網絡的計算量和減少過度擬合的可能性。

另外,也會有部分可視化卷積核可以通過旋轉平移,獲得另外一個可視化卷積核。這是一個很有趣的研究方向,我們或許可以通過尋找一種旋轉不變性的方法來潛在地代替網絡層中的其他卷積核,從而壓縮卷積核的數量。驚訝的是即使對於級別相對高的濾波器,如Block4_Conv1中,通過旋轉、平移獲得相同的可視化卷積核仍然成立。

可是到了block5 conv3的最後,經過代碼實踐之後,我們會發現512個卷積核裡面只有65個卷積核loss不為0,也就是其餘的卷積核已經不能再繼續提取高維紋理特徵信息了,這是怎麼一回事?為什麼沒有了呢?這也是ResNet或者GoogleNet對於VGGNet的改進,可能有時候CNN網絡不是每一個卷積核(神經元)都能參與網絡的計算,發揮作用,提取到高維特徵。下圖為ResNet的跳層方式,因為VGG的block5 conv3、block5 conv2開始出現大量沒有用的卷積核,而block4 conv3卻有很多有用的信息可以向後傳遞。

有了對CNN網絡模型的可視化分析,我們更加深一步地理解卷積神經網絡CNN的具體操作過程,具體提取的是什麼樣的紋理特徵信息。如果你有精力,還可以自己動手指定dropout的神經元,查看自己的卷積神經網絡為什麼會過度擬合,可以怎麼修剪網絡。這是一個很有趣的過程,也是一個考驗人類耐心的過程。

CNN真的理解視覺嗎

卷積神經網絡CNN的兩個主要作用是:1)把輸入的視覺空間圖像,解耦成分層次的卷積核組合。2)通過分層次的卷積核把輸入的數據映射到不同的幾何空間。

有的人會宣稱卷積神經網絡CNN通過分層思想對輸入的圖像進行解耦,這一過程模擬了人類視覺皮層,因此才能獲得如此精妙的效果。可事實真的是這樣嗎?從科學的角度來看,這並不意味著我們真的在某種程度上解決了計算機視覺的問題,我們只是使用了數學的方法對輸入的圖像數據進行抽樣和幾何空間映射。即使科學是這麼解釋,但究其竟並沒有反駁視覺皮層不是這種工作方式。

深度學習雖然不能表達真正的智力,但毋庸置疑的是其預測效果如此驚人,以至於在近年來沒有其他算法可以比擬,甚至在某些情況下超過了人類的預測精度!我們不期待著算法學習我們的思考方式,而應去擁抱數學,用其特殊的方式去為人類服務,繼續發現、繼續創造、繼續在模擬數字領域領跑!

參考文獻:

Yosinski__2015__ICML_DL__Understanding_Neural_Networks_Through_Deep_Visualization

How convolutional neural networks see the world

地址:https://blog.keras.io/how-convolutional-neural-networks-see-the-world.html

雷鋒網 AI科技評論。

相關焦點

  • 使用Python可視化卷積神經網絡方法匯總
    在本文中,我們將探討如何可視化卷積神經網絡(CNN),這是一種深入學習的體系結構,被用於最先進的基於圖像的應用程式;我們將了解可視化CNN模型的重要性,以及可視化它們的方法;我們還將看一個用例,它將幫助你更好地理解這個概念。目錄CNN模型可視化的重要性正如我們在上面的癌症腫瘤例子中所看到的,我們知道我們的模型在做什麼,以及它如何對預測做出決定,這是絕對重要的。
  • 強化學習基礎-對偶梯度上升
    接下來,我們將應用梯度上升來更新 λ 以便最大化g。 g的梯度是: 在下面的步驟1中,我們根據當前的 λ 值找到最小x,然後我們對g進行梯度上升(步驟2和3)。 然後我們使用梯度上升來調整 λ(斜率),以獲得與 g(x)= 0 接觸G的最大值 f(x) 。
  • 最便捷的神經網絡可視化工具之一--Flashtorch
    但首先,我將簡要介紹一下特徵可視化的歷史,為你提供更好的背景信息。特徵可視化簡介特徵可視化是一個活躍的研究領域,旨在探索我們觀看"神經網絡看到的圖像"的方法來了解神經網絡如何感知圖像。它的出現和發展是為了響應人們越來越希望神經網絡能夠被人類解讀。最早的工作包括分析輸入圖像中神經網絡正在關注的內容。
  • CNN的一些可視化方法
    引言有一些同學認為深度學習、神經網絡什麼的就是一個黑盒子,沒辦法、也不需要分析其內部的工作方式。個人認為這種說法「謬之千裡」。其次,現在也已經有很多方法對神經網絡進行分析了,特別是一些可視化方法,可以很直觀的展示深度模型的特徵提取過程。
  • CNN 的一些可視化方法
    引言有一些同學認為深度學習、神經網絡什麼的就是一個黑盒子,沒辦法、也不需要分析其內部的工作方式。個人認為這種說法「謬之千裡」。其次,現在也已經有很多方法對神經網絡進行分析了,特別是一些可視化方法,可以很直觀的展示深度模型的特徵提取過程。
  • CNN的一些可視化方法!
    引言有一些同學認為深度學習、神經網絡什麼的就是一個黑盒子,沒辦法、也不需要分析其內部的工作方式。個人認為這種說法「謬之千裡」。其次,現在也已經有很多方法對神經網絡進行分析了,特別是一些可視化方法,可以很直觀的展示深度模型的特徵提取過程。
  • 卷積神經網絡CNN與深度學習常用框架的介紹與使用
    二、什麼是卷積神經網絡卷積神經網絡依舊是層級網絡, 但層的功能和形式做了變化。層級結構可參照下圖0,而我們是要要利用梯度取做優化的,這將導致無法完成權重的優化(5)全連接層 / FC layer兩層之間所有神經元都有權重連接,通常全連接層在卷積神經網絡尾部。
  • 卷積神經網絡學習路線(五)| 卷積神經網絡參數設置,提高泛化能力?
    test_iter:網絡的迭代測試次數。網絡一次測試batch_size張圖片,因為為了可以將驗證集中所有圖片都測試一次,這個參數乘以batch_size應該等於驗證集中的圖片數。test_interval:網絡迭代多少次進行一次測試。一次迭代即是將一個batch_size的圖片進行訓練。
  • 從零開始實現卷積神經網絡CNN
    而卷積神經網絡能夠應對這種問題,因為它有參數共享架構及平移不變特性,因此CNN又被稱為位移不變或者空間不變人工神經網絡(SIANN,Shift Invariant Artificial Neural Networks)。 本文將以圖像識別與分類為例,從零開始使用python實現一個卷積神經網絡,以加深大家對卷積神經網絡的理解。
  • 卷積神經網絡(CNN)新手指南
    以類似的方式計算機能夠進行圖像分類任務,通過尋找低層次的特徵如邊緣和曲線,然後運用一系列的卷積層建立一個更抽象的概念。這是卷積神經網絡應用的一個總體概述,接下來我們來探討下細節。生物聯繫首先要稍微普及下一點背景知識,當你第一次聽到卷積神經網絡這個詞時,你也許會想這是是不與神經科學或者生物學有關?恭喜你,猜對了一部分。
  • 深度學習入門:淺析卷積神經網絡
    至今已有數種深度學習方法,如卷積神經網絡(CNN)、自編碼神經網絡(包括Auto encoder和Sparse Coding)和深度置信網絡(DBN),並在各個領域中取得了極好的效果。CNN訓練結果的可視化,因此提前定義相應函數。
  • 卷積神經網絡數學原理解析
    事實上,我們每天都在使用計算機視覺——當我們用面部解鎖手機或在社交媒體上發照片前使用自動修圖。卷積神經網絡可能是這一巨大成功背後最關鍵的構建模塊。這一次,我們將加深理解神經網絡如何工作於CNNs。出於建議,這篇文章將包括相當複雜的數學方程,如果你不習慣線性代數和微分,請不要氣餒。我的目標不是讓你們記住這些公式,而是讓你們對下面發生的事情有一個直觀的認識。
  • 看懂這篇指南,包你掌握神經網絡的「黑匣子」
    終端用戶想要了解模型是如何得到最終結果時,僅用紙和筆來解釋深度神經網絡的工作機制是行不通的。那麼,如何讓神經網絡不再像「黑匣子」一樣神秘?可視化可以做到這一點——將神經網絡的不同特徵可視化能使一切變得清晰明了,也能更直觀地呈現卷積神經網絡(CNN) 成千上萬的圖像訓練結果。
  • 讓你的電腦擁有「視力」,用卷積神經網絡就可以!
    卷積神經網絡極大地提升了圖像識別模型的精度,在生活中也有很多的應用。在這篇文章中,我將描述它的工作原理、一些實際應用,以及如何用Python和Keras是實現一個卷積神經網絡。通過這個過程,一個神經網絡可以學習並提高預測的準確度。我不會講述反向傳播過程和損失函數,但是有許多很棒的資源介紹了它們,例如這一篇。卷積神經網絡(Convolutional Neural Networks)是神經網絡的一種特別的類型。它們在圖像數據集上表現的很好。
  • 卷積神經網絡模型發展及應用(中文版),20頁pdf
    1958 年到 1969 年為神經網絡模型發展的第一階段,稱為第一代神經網絡模型。在 1958 年 Rosenblatt 第一次在 MCP 模型上增加學習功能並應用於機器學習,發明了感知器算法[20],該算法使用 MCP 模型能夠採用梯度下降法從訓練樣本中自動學習並更新權值,並能對輸入的多維數據進行二分類,其理論與實踐的效果引起了神經網絡研究的第一次浪潮。
  • CNN卷積神經網絡
    CNN卷積神經網絡卷積神經網絡通常包含以下幾種層:卷積層(Convolutional layer),卷積神經網路中每層卷積層由若干卷積單元組成
  • 【深度學習系列】卷積神經網絡詳解(二)——自己手寫一個卷積神經網絡
    博客專欄:https://www.cnblogs.com/charlotte77/前文傳送門:【好書推薦&學習階段】三個月教你從零入門深度學習【深度學習系列】PaddlePaddle之手寫數字識別【深度學習系列】卷積神經網絡CNN原理詳解(一)——基本原理上篇文章中我們講解了卷積神經網絡的基本原理,包括幾個基本層的定義
  • CNN卷積神經網絡實例(基於pytorch)
    1.關於卷積神經網絡卷積神經網絡(Convolutional Neural Network,CNN) 是一種具有局部連接、權重共享等特徵的深層前饋神經網絡
  • 語義分割之dice loss深度分析(梯度可視化)
    梯度正負符號代表梯度的方向,網絡採用梯度下降法更新參數,當梯度為正時,參數更新變小,當梯度為負時參數更新變大。這裡為了討論正負樣本的梯度關係,所以取了絕對值操作。實際上,由於平滑係數的存在,該梯度不為0,而是一個非常小的值 。該值過於小,對網絡的貢獻也非常有限。
  • 人工智慧黑盒揭秘:深度神經網絡可視化技術
    深度神經網絡又是最為複雜的機器學習模型,其可解釋性與可視化性更加具有挑戰性。網絡模型為什麼起作用,它是否足夠好,圖像識別是如何抽象出「貓」這個概念的?本段分析了幾種典型深度神經網絡可視化技術,詳盡展示了前沿的可視化原理以及解釋性效果。