本節將使用 keras-vis,一個用於可視化 VGG 預建網絡學到的不同濾波器的 Keras 軟體包。基本思路是選擇一個特定的 ImageNet 類別並理解 VGG16 網絡如何來學習表示它。
第一步是選擇 ImageNet 上的一個特定類別來訓練 VGG16 網絡。比如,將下圖中的美國北鬥鳥類別設定為 20:
圖 1 北鬥鳥示意圖
ImageNet 類別在網站 https://gist.github.com/yrevar/6135f1bd8dcf2e0cc683 中可以找到,作為一個 Python 字典包,ImageNet 的 1000 個類別 ID 被處理為人類可讀的標籤。
導入 matplotlib 和 keras-vis 使用的模塊。另外還需要載入預建的 VGG16 模塊。Keras 可以輕鬆處理這個預建網絡:
通過使用 Keras 中包含的預構建圖層獲取 VGG16 網絡,並使用 ImageNet 權重進行訓練:
這是 VGG16 網絡的內部結構。許多卷積層與最大池化層交替。一個平坦(flatten)層連接著三個密集層。其中最後一層被稱為預測層,這個圖層應該能夠檢測高級特徵,比如面部特徵,在此例中,是鳥的形狀。請注意,頂層顯式的包含在網絡中,因為希望可視化它學到的東西:
網絡可以進一步抽象,如下圖所示:
圖 2 一個VGG16網絡
現在重點看一下最後的預測層是如何預測出 ID 類別序列為 20 的美國北鬥鳥的:
顯示給定特徵的特定圖層的生成圖像,並觀察網絡內部中的美國北鬥鳥的概念:
神經網絡內部就是這樣表示一隻鳥的。這是一種虛幻的形象,但這正是在沒有人為幹預的情況下該神經網絡自然學到的東西!
如果你還好奇還想了解更多,那麼,選擇一個網絡中更淺的層將其可視化,顯示美國北鬥鳥的前期訓練過程:
運行代碼的輸出如下:
正如預期的那樣,這個特定的層學習低層的特徵,如曲線。然而,卷積網絡的真正威力在於,模型中的網絡越深入,越能推斷出更複雜的特徵。
keras-vis 可視化密集層的關鍵思想是生成一個輸入圖像以最大化對應於鳥類的最終密集層輸出。所以實際上這個模塊做的是反轉這個過程。給定一個特定的訓練密集層與它的權重,生成一個新的最適合該層本身的合成圖像。
每個卷積濾波器都使用類似的思路。在這種情況下,第一個卷積層是可以通過簡單地將其權重可視化來解釋的,因為它在原始像素上進行操作。
隨後的卷積濾波器都對先前的卷積核的輸出進行操作,因此直接對它們進行可視化並不一定非常容易理解。但是,如果獨立考慮每一層,可以專注於生成最大化濾波器輸出的合成輸入圖像。
GitHub 中的 keras-vis 存儲庫提供了一系列關於如何檢查內部網絡的可視化示例,包括注意力顯著圖,其目標是在圖像中包含各種類別(例如,草)時檢測圖像的哪個部分對特定類別(例如,老虎)的訓練貢獻最大。典型文章有「Deep Inside Convolutional Networks:Visualising Image Classification Models and Saliency Maps」,其中一個 Git 庫中的圖片顯示如下,這個案例說明了在網絡中一個老虎的顯著圖樣本: