資源|Picasso:開源的CNN可視化工具

選自Medium

機器之心編譯

參與:侯韻楚、李澤南

神經網絡在圖像處理中應用廣泛,但經常面臨難以調整參數的問題。最近,來自 Merantix 的 Ryan Henderson(博士畢業於康奈爾大學)等人發佈了一個免費開源的卷積神經網絡可視化工具,讓我們可以方便地觀察神經網絡在圖像中的焦點,為模型優化提供了幫助。

  • Github(運行環境-Python3.5 或以上):https://github.com/merantix/picasso

  • arXiv-Picasso:https://arxiv.org/abs/1705.05627

今天,儘管定義與訓練深度神經網絡(DNNs)比以往任何時候都更加容易,但我們對學習過程的理解仍不甚透明。對訓練過程中的丟失或分類錯誤進行監控並不總能使你的模型避免學習錯誤信息或是形成預期的分類任務方法。請參考這則故事(很可能是虛構的)來理解這句話的涵義 [1]:

很久以前,美國陸軍想利用神經網絡來自動檢測偽裝的敵軍坦克。研究人員用 50 張躲在樹林中的偽裝坦克照片和 50 張沒有偽裝坦克的樹林照片訓練了一個神經網絡。

研究人員很有先見之明地拍攝了 200 張照片,這兩種各自拍攝了 100 張,而每種只有 50 張用於訓練集。研究人員用剩下的 100 張照片對神經網絡進行了測試,而它將它們全部進行了正確分類。成功了!他們將成果遞交至五角大樓,但不久後卻被退回,並被抱怨道,在他們進行測試時,神經網絡並未在區分照片中展現任何優勢。

事實證明,在研究人員的數據集中,偽裝坦克的照片是在陰天拍攝的,而樹林是在晴天拍攝的,所以神經網絡學會的是區分陰天與晴天,而不是區分樹林與樹林中的偽裝坦克。

資源|Picasso:開源的CNN可視化工具

這絕對是「現代」坦克在訓練集中的真實形象。來源:維基百科

拋開故事的真實性不談,機器學習的研究人員都熟知這一點:訓練指標並不總能涵蓋全部目的,而此時的風險卻比以往都要高:在深度學習越來越多地用於應用程序的今天,這種訓練錯誤可能會是致命的 [2]。

幸運的是,類似局部遮擋 [3] 與顯著圖 [4] 這樣的標準可視化提供了對學習過程的理性檢驗。用於標準神經網絡可視化的工具包 [5] 的確存在,它們與監視訓練過程的工具連在一起。如果沒有被模型特定化,它們通常會與深度學習框架密切相關。那麼,是否存在一個通用且易於設置的工具能夠用於生成標準可視化,來將這些研究人員從神經網絡區分晴天而非坦克的困境中拯救出來呢?

Picasso

Picasso 是一款免費的開源 DNN 可視化工具(遵循 Eclipse 公共許可證),它能夠讓你很輕鬆地獲得局部遮擋與顯著圖。我們在 Merantix 中使用了多種神經網絡架構,也開發了 Picasso,以便在各種垂直領域的模型中更易於查看標準可視化,包括在汽車中的應用(如瞭解道路分割或物體識別時的失敗)、在廣告中的應用(如瞭解某些廣告能夠獲得更高點擊率的原因)以及在醫學成像中的應用(如分析 CT 或 X 射線圖像中哪些區域具有不規則性)。

Picasso 是一個 Flask 應用程序,它能夠將深度學習框架與一組存在默認值且可被用戶定義的可視化內容結合在一起。你可以使用其內置的可視化功能,也可以輕鬆進行自定義添加。Picasso 被開發用於 Keras 和 Tensorflow 神經網絡的檢查點。若你想進行驗證卻苦於沒有經過訓練的模型,我們為你提供了 Tensorflow 和 Keras 的 MNIST 檢查點以及 Keras 的 VGG16 檢查點。

使用默認設置對應用程序流程進行概述。用戶已經加載了在 MNIST 數據集中經過訓練的 Keras 模型,並在幾張手寫數字的圖像上生成了局部遮擋可視化。有關遮擋圖的深入解釋參見下文。

在 Merantix 中,我們尤其感興趣於卷積神經網絡(CNN),它們將圖像作為輸入並進行分類。我們根據這些參數開發了 Picasso,但這個框架十分靈活,足以用於所有其他模型中。儘管所包含的可視化應當在不同的神經網絡之間都足夠穩固,但如果你願意,仍然可以實現模型特定的可視化。

我們提供了幾個開箱即用的標準可視化:

1. 局部遮擋:對圖像的一部分進行了遮擋,以查看分類如何變化。

2. 顯著圖:計算輸入圖像的類型預測的導數。

3. 類型預測本身並非可視化,但它可以簡便地對學習過程進行檢查。

並且我們還有其他的成果!

應用於實踐中的 Picasso

我們來用 Picasso 的兩個內置可視化能力來處理本文開頭的坦克問題:局部遮擋與顯著圖。在這些例子中,我們將使用預訓練的 VGG16 模型進行分類。已知該模型很擅長進行坦克分類,所以能否使用這些可視化來查看模型是不是真正根據是否存在坦克,而非天空進行分類?

資源|Picasso:開源的CNN可視化工具

通過依次遮擋圖像的各個部分,我們可以判斷哪些區域在分類中更為重要。該圖像由 VGG16 模型進行分類,具有 94%的正確分類概率。圖像中較亮部分的分類概率更高。例如,天空那部分區域很亮,因為遮擋天空並不影響其被分類為存在坦克的概率。相反,坦克的胎面區域更暗,因為若這些區域不存在,模型將難以明確所看到的是否為坦克。

我們能看出這種可視化可能如何幫助軍隊:當「坦克性」的部分(如坦克的胎面)丟失時,模型將無法成功分類。而有趣的是,當一部分胎面被遮擋時,圖像更可能被分類為半履帶車。直觀而言,這麼分類存在一定的道理,因為半履帶車的前半部分是車輪。

資源|Picasso:開源的CNN可視化工具

除非你標出全部車輪,否則這個模型很肯定這就是半履帶車;除非你將車輪遮擋,否則它也會很肯定這不是坦克。圖像來源:維基百科

除了局部遮擋,我們還提供開箱即用的顯著圖。顯著圖可以通過反向傳播查看分類中輸入圖像的導數。在給定像素處的高導數值則意味著更改該像素能更大程度上影響分類結果。

資源|Picasso:開源的CNN可視化工具

坦克的顯著圖。更亮的像素表明該「坦克」圖像的輸入像素具有更高的導數值。而好的預兆是,最亮的像素似乎處於圖像的坦克區域。請注意,絕大多數非坦克區域都是暗的,僅有少數例外,這意味著改變這些像素不應改變圖像的「坦克性」。

添加可視化

資源|Picasso:開源的CNN可視化工具

我們希望新的可視化能夠很容易被整合。而你只需要將可視化代碼放在可視化文件夾中,再繪製一個 HTML 模板來顯示即可。

若想查看如何構建簡單的可視化示例,請參閱 ClassProbabilites 可視化教程。

系統給出的相對分類概率與你可做出的最簡單的可視化有關。

使用你自己的模型

當然,你將會使用已包含的可視化與經過訓練的神經網絡。我們已將其儘量簡化,但你至少應定義三種方法:

1. 預處理:告知可視化如何將上傳的圖像轉變為神經網絡輸入

2. 後處理:告知可視化如何將扁平的中間層變為圖像尺寸(這是在中間層操作的可視化所需的,例如顯著圖)

3. decode_prob:通過用類型名稱進行註釋,來告知可視化如何解釋原始輸出(通常為概率數組)

本教程詳細介紹瞭如何構建這些功能,而它們可以獨立於應用程序的源代碼之外進行指定。

顯著圖可視化的結果。這個應用程序正在使用具有 VGG16 模型的 Keras 框架。這個示例預包裝了代碼。由於顯著圖取決於輸入層中關於中間層的導數,因此必須告知可視化如何使用`decode_prob`重塑輸出張量並生成圖像。

貢獻

我們歡迎任何與改善構建此應用程序有關的建議。若你想要貢獻可視化功能或其他資料,那再好不過了!請查閱我們的 Github 存儲庫瞭解更多信息。我們遵循 EPL 來發布 Picasso,因為我們打算讓它歸入 Eclipse 基金會旗下。

相關推薦

推薦中...