天天看點

利用Python實作卷積神經網絡的可視化(附Python代碼)

對于深度學習這種端到端模型來說,如何說明和了解其中的訓練過程是大多數研究者關注熱點之一,這個問題對于那種高風險行業顯得尤為重視,比如醫療、軍事等。在深度學習中,這個問題被稱作“黑匣子(Black Box)”。如果不能解釋模型的工作過程,我們怎麼能夠就輕易相信模型的輸出結果呢?

以深度學習模型檢測癌症惡性良性腫瘤為例,該模型告訴你它能夠檢測出癌症的準确率高達99%,但它并沒有告訴你它是如何工作并給出判斷結果的。那麼該模型是在核磁共振掃描片子中發現了重要線索嗎?或者僅僅是将掃描結果上的污點錯誤地認為是惡性良性腫瘤呢?模型的輸出結果關系到病人的生死問題及治療方案,醫生是不能承擔起這種錯誤的。

利用Python實作卷積神經網絡的可視化(附Python代碼)

在本文中,将探讨如何可視化卷積神經網絡(CNN),該網絡在計算機視覺中使用最為廣泛。首先了解CNN模型可視化的重要性,其次介紹可視化的幾種方法,同時以一個用例幫助讀者更好地了解模型可視化這一概念。

<b>1.卷積神經網絡模型可視化的重要性</b>

正如上文中介紹的癌症惡性良性腫瘤診斷案例所看到的,研究人員需要對所設計模型的工作原理及其功能掌握清楚,這點至關重要。一般而言,一名深度學習研究者應該記住以下幾點:

<b>1. 了解模型是如何工作的</b>

<b>2. 調整模型的參數</b>

<b>3. 找出模型失敗的原因</b>

<b>4. 向消費者/終端使用者或業務主管解釋模型做出的決定</b>

曾幾何時,美國陸軍希望使用神經網絡自動檢測僞裝的敵方坦克。研究人員使用50張迷彩坦克照片及50張樹林照片來訓練一個神經網絡。使用有監督學習方法來訓練模型,當研究人員訓練好網絡的參數後,網絡模型能夠對訓練集做出正确的判斷——50張迷彩坦克全都輸出“Yes”,50張樹林照片全都輸出“No”。但是這并不能保證模型對于新的樣本也能正确分類。聰明的是,研究人員最初拍攝了200張照片,其中包含了100張迷彩坦克照片、100張樹木照片。從中分别選取50張照片合計100張照片作為訓練集,剩餘的100張照片作為測試集。結果發現,模型對測試集也能正确分類。是以,研究人員覺得模型沒有問題了,就将最終成果傳遞給軍方。原以為軍方會很滿意這份研究成果,結果軍方做出的回報是他們進行測試後發現效果并不好。

<b></b>

利用Python實作卷積神經網絡的可視化(附Python代碼)

研究人員感覺此事有點蹊跷,為什麼之前測試時百分百準确,而軍方測試的時候又掉鍊子了呢?最後終于發現,原來是研究者的資料集出現了問題,采集迷彩坦克的時候是陰天,而采集樹林的時候是晴天,神經網絡最終學會的是區分晴天和陰天,而不是區分迷彩坦克和樹林。這真是令人哭笑不得啊,那造成這個問題的主要原因還是沒有弄清楚模型的具體的工作原理及其功能。

<b>2.可視化CNN模型的方法</b>

根據其内部的工作原理,大體上可以将CNN可視化方法分為以下三類:

<b>1. 初步方法:一種顯示訓練模型整體結構的簡單方法</b>

<b>2. 基于激活的方法:對單個或一組神經元的激活狀态進行破譯以了解其工作過程</b>

<b>3. 基于梯度的方法:在訓練過程中操作前向傳播和後向傳播形成的梯度</b>

<b>1初步方法</b>

<b>1.1 繪制模型結構圖</b>

研究者能做的最簡單的事情就是繪制出模型結構圖,此外還可以标注神經網絡中每層的形狀及參數。在keras中,可以使用如下指令完成模型結構圖的繪制:

還可以用一個更富有創造力和表現力的方式呈現模型結構框圖,可以使用keras.utils.vis_utils函數完成模型體系結構圖的繪制。

利用Python實作卷積神經網絡的可視化(附Python代碼)

<b>1.2 可視化濾波器</b>

另一種方法是繪制訓練模型的過濾器,這樣就可以了解這些過濾器的表現形式。例如,第一層的第一個過濾器看起來像:

<code></code>

利用Python實作卷積神經網絡的可視化(附Python代碼)

一般來說,神經網絡的底層主要是作為邊緣檢測器,當層數變深時,過濾器能夠捕捉更加抽象的概念,比如人臉等。

利用Python實作卷積神經網絡的可視化(附Python代碼)

<b>2.激活方法</b>

<b>2.1 最大化激活</b>

為了了解神經網絡的工作過程,可以在輸入圖像上應用過濾器,然後繪制其卷積後的輸出,這使得我們能夠了解一個過濾器其特定的激活模式是什麼。比如,下圖是一個人臉過濾器,當輸入圖像是人臉圖像時候,它就會被激活。

利用Python實作卷積神經網絡的可視化(附Python代碼)

同理,可以将這個想法應用于所有的類别,并檢查它們的模式會是什麼樣子。

<b>2.2 圖像遮擋</b>

在圖像分類問題中,可能會遇到目标物體被遮擋,有時候隻有物體的一小部分可見的情況。基于圖像遮擋的方法是通過一個灰色正方形系統地輸入圖像的不同部分并監視分類器的輸出。這些例子清楚地表明模型在場景中定位對象時,若對象被遮擋,其分類正确的機率顯著降低。

利用Python實作卷積神經網絡的可視化(附Python代碼)

為了了解這一概念,可以從資料集中随機抽取圖像,并嘗試繪制該圖的熱圖(heatmap)。這使得我們直覺地了解圖像的哪些部分對于該模型而言的重要性,以便對實際類别進行明确的區分。

利用Python實作卷積神經網絡的可視化(附Python代碼)

<b>3. 基于梯度的方法</b>

<b>3.1 顯著圖</b>

使用顯著圖的概念相當直接——計算輸出類别相對于輸入圖像的梯度。這應該告訴我們輸出類别值對于輸入圖像像素中的微小變化是怎樣變化的。梯度中的所有正值告訴我們,像素的一個小變化會增加輸出值。是以,将這些梯度可視化可以提供一些直覺的資訊,這種方法突出了對輸出貢獻最大的顯著圖像區域。

利用Python實作卷積神經網絡的可視化(附Python代碼)

<b>3.2 基于梯度的類别激活映射</b>

類别激活映射(CAM)或grad-CAM是另外一種可視化模型的方法,這種方法使用的不是梯度的輸出值,而是使用倒數第二個卷積層的輸出,這樣做是為了利用存儲在倒數第二層的空間資訊。

利用Python實作卷積神經網絡的可視化(附Python代碼)

<b>總結</b>

本文簡單說明了CNN模型可視化的重要性,以及介紹了一些可視化CNN網絡模型的方法,希望對讀者有所幫助,使其能夠在後續深度學習應用中建構更好的模型。

<b>作者資訊</b>

Faizan Shaikh,專注于深度學習、資料科學