利用Python實現卷積神經網絡的可視化
對于深度學習這種端到端模型來說,如何說明和理解其中的訓練過程是大多數研究者關注熱點之一,這個問題對于那種高風險行業顯得尤為重視,比如醫療、軍事等。在深度學習中,這個問題被稱作“黑匣子(Black Box)”。如果不能解釋模型的工作過程,我們怎么能夠就輕易相信模型的輸出結果呢?
以深度學習模型檢測癌癥腫瘤為例,該模型告訴你它能夠檢測出癌癥的準確率高達99%,但它并沒有告訴你它是如何工作并給出判斷結果的。那么該模型是在核磁共振掃描片子中發現了重要線索嗎?或者僅僅是將掃描結果上的污點錯誤地認為是腫瘤呢?模型的輸出結果關系到病人的生死問題及治療方案,醫生是不能承擔起這種錯誤的。
在本文中,將探討如何可視化卷積神經網絡(CNN),該網絡在計算機視覺中使用最為廣泛。首先了解CNN模型可視化的重要性,其次介紹可視化的幾種方法,同時以一個用例幫助讀者更好地理解模型可視化這一概念。
1.卷積神經網絡模型可視化的重要性
正如上文中介紹的癌癥腫瘤診斷案例所看到的,研究人員需要對所設計模型的工作原理及其功能掌握清楚,這點至關重要。一般而言,一名深度學習研究者應該記住以下幾點:
1. 理解模型是如何工作的
2. 調整模型的參數
3. 找出模型失敗的原因
4. 向消費者/終端用戶或業務主管解釋模型做出的決定
現在讓我們看一個例子,可視化一個神經網絡模型有助于理解其工作原理和提升模型性能。
曾幾何時,美國陸軍希望使用神經網絡自動檢測偽裝的敵方坦克。研究人員使用50張迷彩坦克照片及50張樹林照片來訓練一個神經網絡。使用有監督學習方法來訓練模型,當研究人員訓練好網絡的參數后,網絡模型能夠對訓練集做出正確的判斷——50張迷彩坦克全都輸出“Yes”,50張樹林照片全都輸出“No”。但是這并不能保證模型對于新的樣本也能正確分類。聰明的是,研究人員最初拍攝了200張照片,其中包含了100張迷彩坦克照片、100張樹木照片。從中分別選取50張照片合計100張照片作為訓練集,剩余的100張照片作為測試集。結果發現,模型對測試集也能正確分類。因此,研究人員覺得模型沒有問題了,就將最終成果交付給軍方。原以為軍方會很滿意這份研究成果,結果軍方做出的反饋是他們進行測試后發現效果并不好。
研究人員感覺此事有點蹊蹺,為什么之前測試時百分百準確,而軍方測試的時候又掉鏈子了呢?最后終于發現,原來是研究者的數據集出現了問題,采集迷彩坦克的時候是陰天,而采集樹林的時候是晴天,神經網絡最終學會的是區分晴天和陰天,而不是區分迷彩坦克和樹林。這真是令人哭笑不得啊,那造成這個問題的主要原因還是沒有弄清楚模型的具體的工作原理及其功能。
2.可視化CNN模型的方法
根據其內部的工作原理,大體上可以將CNN可視化方法分為以下三類:
1.初步方法:一種顯示訓練模型整體結構的簡單方法
2.基于激活的方法:對單個或一組神經元的激活狀態進行破譯以了解其工作過程
3.基于梯度的方法:在訓練過程中操作前向傳播和后向傳播形成的梯度
下面將具體介紹以上三種方法,所舉例子是使用Keras深度學習庫實現,另外本文使用的數據集是由“識別數字”競賽提供。因此,讀者想復現文中案例時,請確保安裝好Kears以及執行了這些步驟。
1初步方法
1.1 繪制模型結構圖
研究者能做的最簡單的事情就是繪制出模型結構圖,此外還可以標注神經網絡中每層的形狀及參數。在keras中,可以使用如下命令完成模型結構圖的繪制:
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 26, 26, 32) 320
_________________________________________________________________
conv2d_2 (Conv2D) (None, 24, 24, 64) 18496
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 12, 12, 64) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 12, 12, 64) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 9216) 0
_________________________________________________________________
dense_1 (Dense) (None, 128) 1179776
_________________________________________________________________
dropout_2 (Dropout) (None, 128) 0
_________________________________________________________________
preds (Dense) (None, 10) 1290
=================================================================
Total params: 1,199,882
Trainable params: 1,199,882
Non-trainable params: 0
還可以用一個更富有創造力和表現力的方式呈現模型結構框圖,可以使用keras.utils.vis_utils函數完成模型體系結構圖的繪制。
1.2 可視化濾波器
另一種方法是繪制訓練模型的過濾器,這樣就可以了解這些過濾器的表現形式。例如,第一層的第一個過濾器看起來像:
top_layer = model.layers[0]
plt.imshow(top_layer.get_weights()[0][:, :, :, 0].squeeze(), cmap='gray')
一般來說,神經網絡的底層主要是作為邊緣檢測器,當層數變深時,過濾器能夠捕捉更加抽象的概念,比如人臉等。
中國· 上海
CopyRight?2009-2019 上海谷谷網絡科技有限公司 All Rights Reserved. 滬ICP備11022482號-8
- top
- 在線咨詢
-
添加微信咨詢