李宏毅機器學習課程筆記-11.5基於PyTorch的Explainabe AI實戰

本文爲作者學習李宏毅機器學習課程時參照樣例完成homework5的記錄。

全部課程PPT、數據和代碼下載鏈接:

鏈接:https://pan.baidu.com/s/1n_N7aoaNxxwqO03EmV5Bjg 提取碼:tpmc

代碼倉庫:https://github.com/chouxianyu/LHY_ML2020_Codes

任務描述

在homework3中我們通過CNN實現了食物圖片分類,詳見我之前的文章《李宏毅機器學習課程筆記-7.4基於CNN和PyTorch的食物圖片分類》,這次作業的任務就是探究這個CNN的可解釋性,具體如下

  1. Saliency Map

    按照《Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps》,計算每個像素對最終分類結果的重要性。

    我們把一張圖片輸入到model,將model的輸出與label進行對比計算得到loss,因此與loss相關的變量有image、model parameter和label這3者。

    通常情況下,我們訓練模型時希望找到一組好的model parameter來擬合image和label,因此loss在backward時我們只在乎loss關於model parameter的梯度。但在數學上image本身也是continuous tensor,我們可以在model parameter和label都固定的情況下計算loss關於image的梯度,這個梯度代表稍微改變image的某個pixel value會對loss產生什麼影響,我們習慣把這個影響的程度解讀爲該pixel對於結果的重要性(每個pixel都有自己的梯度)

    因此將loss關於一張圖片中每個pixel的梯度計算並畫出來,就可以看出該圖中哪些像素是model在計算結果時的重要依據。那如何用代碼實現我們的這個想法呢?非常簡單,在一般訓練中我們都是在forward後計算模型輸出與標籤之間的loss,然後進行loss的backward,其實在PyTorch中這個backword計算的是loss對model parameter的梯度,因此我們只需要用一行代碼images.requires_grad_()使得image也要被計算梯度。

  2. Filter Visualization

    基於Gradient Ascent,實現Activation maximization,找到最能夠激活某個filter的圖片,以觀察模型學到了什麼。

    這裏我們想要知道某一個filter到底學習到了什麼,我們需要做兩件事情:①Filter Visualization:挑幾張圖片看看某個filter的輸出;②Filter Activation:看看什麼圖片可以最大程度地activate該filter

    在代碼實現方面,我們一般是直接把圖片輸入到model,然後直接forward,那要如何取出model中某層的輸出呢?雖然我們可以直接修改model的forward函數使其返回某層的輸出,但這樣比較麻煩,還可能會因此改動其它部分的代碼。因此PyTorch提供了方便的解決方法:hook

  3. LIME

    綠色代表一個component和結果正相關,紅色則代表該component和結果負相關。

    《"Why Should I Trust You?”: Explaining the predictions of Any Classifier》

    注:根據助教的示例,我遇到了一個BUGKeyError: 'Label not in explanation',暫未解決……

數據集描述

使用homework3使用的數據集以及訓練出的CNN模型。

其它

https://github.com/utkuozbulak/pytorch-cnn-visualizations


Github(github.com):@chouxianyu

Github Pages(github.io):@臭鹹魚

知乎(zhihu.com):@臭鹹魚

博客園(cnblogs.com):@臭鹹魚

B站(bilibili.com):@絕版臭鹹魚

微信公衆號:@臭鹹魚

轉載請註明出處,歡迎討論和交流!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章