1. 程式人生 > 其它 >Visualizing and Understanding Convolutional Networks論文復現筆記

Visualizing and Understanding Convolutional Networks論文復現筆記

目錄

Visualizing and Understanding Convolutional Networks 論文復現筆記

Abstract

大型的卷積神經網路已經在影象分類上面取得了令人印象深刻的成果,但是現在對它是如何執行的,或者如何提升網路的效能還沒有一個清晰的理解。這篇論文對上面兩個問題提出了一些想法和方法。

Introduction

  • 使用了一個 Deconvolutional Network,把特徵啟用投影到畫素空間
  • 對CNN做遮掩的靈敏度分析,觀察影象的哪些部分對分類重要

Approach

Visualization with a Deconvnet

這是一個將特徵圖投影到畫素空間的方法。涉及到兩個概念,特徵圖是將輸入影象進行卷積,啟用,池化後得到的,畫素空間是將特徵圖輸入到Deconvnet得到的影象。更多細節可以可以參考原圖。

關於Deconvnet的實現

這個是另一篇論文中提出的方法,反捲積的相關數學運算過程參考了CSDN上的一篇博文

Max Unpooling用一個switches記錄最大值的位置,然後將輸入放置到擴大後的矩陣對應位置。

Convnet Visualization

對於一個給定的Feature map,論文中展示了最高的9個啟用,並把每個啟用投影到畫素空間,同時對於視覺化的畫素空間,論文同樣展示了相關的圖片區域。

一些闡述,對於layer 5, row 1, col 2,相關的圖片看起來沒有相關性,但是這個feature map對背景中的草地敏感,而不是前景中的物體。

同時說明layer2 -- layer5,feature map對影象的識別是從紋理逐漸到具體的物體。

這個地方挺有意思的,也可以算是一個啟發點,可以發現,layer比較小的feature map經過較少的epochs就可以收斂,而比較大的layer的feature map卻需要較大的 epochs才能收斂(layer 5需要40-50個epochs)
模型的優化
  1. 通過卷積核可視化可以看到alexNet模型中第一層和第二層(下圖中的a和c)存在一些問題,比如第一層有一些 dead features(偏灰色的那些小方塊),第二層有一些重疊和黑色的混亂。
  2. 通過把第一層的11x11卷積核變成7x7,然後stride從4變成2,得到的結果如圖c和e所示,得到了更多的獨特的特徵。
  3. 這樣的改動也提升了模型的效果。

為什麼標紅色的小方塊認為是 “dead features”

  • a中的灰色方塊,我們可以從卷積的數學運算來理解,由於這本質上是卷積核的視覺化,第一層的kernel size是(\(3 \times 11\times 11\))呈現為均勻的灰色說明在數值主要是128(RGB),當這個卷積核去進行卷積,實際上提取不出什麼特徵。因為這只是一個線性變換。
  • c中黑色方塊,黑色說明在RGB上的數值主要是0,卷積後也會使得大多數輸入神經元被置0,因此也提取不出什麼特徵。
遮擋敏感性
  1. b圖的定義是:首先確定在未遮擋的情況下,啟用最強的那個feature map的位置,然後這個feature map的值的和關於灰色遮擋位置的函式,由此形成了一個熱力圖。

  2. c圖的定義是:這一個feature map投影到畫素空間得到的照片,第一個是來自input image的投影,其餘是來自其它圖片。

  3. d圖是正確類別的概率關於關於灰色遮擋位置的函式。

  4. e圖是最有可能的類別關於遮擋位置的函式。

    當然第一個小狗的最好理解了,當小狗的臉被遮擋時,無論是最強feature map的值,還是預測為小狗的概率都明顯下降。從本質上看,這個最強的feature map能學到關於類似於小狗臉的一些特徵,當小狗臉被遮擋時,這個最強feature map得不到啟用。因此當小狗臉被遮擋時,關於那個 ball 的feature map 就 “凸顯”出來了,因此Tennis ball的概率變高。

    再來看第二張圖,這個最強feature map能學習到關於一些 “圖示文字的資訊”,但是真正影響car wheel概率的還是輪子的畫素位置。

    再來看第三張圖,這個最強feature map能學習到關於一些 “人臉”的資訊,但是真正影響預測為阿富汗獵犬概率的還是獵犬對應的那些畫素。

    那麼問題來了,第二張圖的正確 label 是 car wheel,第三張圖的正確 label 是afgan hound,那麼最強啟用的feature map為什麼不是有關car wheel或者afgan hound的紋理?

    這樣似乎形成了一個悖論,我們在layer 5 訓練結束後,將得到的feature map其展平,那麼進行矩陣相乘後的最大值位置應該是對應的最強feature map的位置相對應。

    關於這個地方的猜想和試驗,我會另外寫一篇部落格。

    我的猜想:(當然很有可能是錯的),的確,許多的feature map,能學到不同的資訊,比如有的對狗頭敏感,有的對人臉敏感,有的對一些文字資訊敏感,但是圖片的標籤不能保證最後一個卷積層的最強Feature map學習到的就是對應標籤的特徵,也有可能是別的,比如上圖的車子,最強的那個feature map反映的是一些文字資訊。但是這些資訊的綜合處理,是在最後面的全連線層實現的,也就是說,全連線層綜合 “考慮”了這些資訊。

Experiments

基於視覺化後對AlexNet模型進行了修改,提升了表現,說明可以通過視覺化的技巧分析和改善模型。修改後的結構:

  • 模型結構調整
  1. 移除layer 6 layer 7,對模型的效能影響不大,儘管這兩層的引數是是整個模型中的大多數。

  2. 移除了兩個卷積層,對模型的整體效能影響也不大

  3. 但是當模型層數太少時,效能劇烈變壞。

  4. 增大中間卷積層的size使得模型效能變好,但是增加全連線層的size影響不大

    這幾個點相關的實驗以前做過了https://www.cnblogs.com/programmerwang/p/15129658.html

  • 5.2 模型的泛化能力

    ResNet在幾個資料集上的表現。論文中作者使用了一種特殊的訓練方式,即給定的每個class裡面分別有15,30,45,60張圖片,但是我直接使用了原資料集的所有資料。

    終於跑出來了,由於Caltech101,Caltech256和Pasca2012的資料集需要自己編寫Dataset類,但由於自己對pytorch還有一些影象基礎的相關知識不熟,遇到了很多奇怪的問題。

    • 一開始以為Caltech都是彩色圖,就當成彩色圖3通道處理的,然後報錯了。這篇博文解決了我的問題,https://blog.csdn.net/weixin_44012382/article/details/108190384

    • 由於是使用Resnet18做分類數不確定的分類問題,需要自行修改模型結構(Resnet預設是1000分類問題)。

      通過以下程式碼修改了ResNet的結構。

      def get_model():
      
          model = models.resnet18(pretrained=True)
      
          # 提取fc層中固定的引數
          fc_features = model.fc.in_features
          # 修改類別為102
          model.fc = nn.Linear(fc_features, 102)
      
          model.to(device)
          return model
    

    這是ResNet在相關資料集上的實驗記錄:

    資料集 訓練第一個epoch的準確率(訓練集,驗證集) 最高準確率(訓練集,驗證集,epoch)
    Caltech101 (85.41%, 85.60%) (95.37%,96.88%,8)
    Caltech256 (62.10%, 63.08%) (89.90%,94.72%,8)
    Pascal2012

    由於筆記本算力限制,未測試在Pascal2012資料集上的表現。

Summary

  1. 提出了一種視覺化CNN的方法,說明了內部特徵並不是隨機的,是可以解釋的。
    • Deconvolutional NetWork -> pixel space
    • 卷積核可視化
  2. 通過視覺化CNN瞭解到了一些直覺上的特性,比如隨著增加層數,類別的可區分度越高,特徵越有用。
  3. 通過視覺化CNN可以對模型進行分析和改善。具體可見Section Convnet Visualization
    • 高層的feature map需要40-50epochs才能顯現出來
    • 通過卷積核可視化修改模型結構
  4. 通過視覺化CNN的遮蔽實驗,發現模型對區域性結構是敏感的,並不是只用到了廣闊的場景資訊。
  5. 展示了ImageNet的預訓練模型可以很好地泛化到其它資料集。
  6. 通過實驗學習到了一點如何使用raw data訓練自己的網路的知識