李宏毅机器学习课程笔记-11.5基于PyTorch的Explainabe AI实战
本文为作者学习李宏毅机器学习课程时参照样例完成homework5的记录。
代码仓库:chouxianyu/LHY_ML2020_Codes,里面除了代码还有数据、PPT、笔记等资源喔~
任务描述
在homework3中我们通过CNN实现了食物图片分类,详见我之前的文章《李宏毅机器学习课程笔记-7.4基于CNN和PyTorch的食物图片分类》,这次作业的任务就是探究这个CNN的可解释性,具体如下
-
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也要被计算梯度。 -
Filter Visualization
基于Gradient Ascent,实现Activation maximization,找到最能够激活某个filter的图片,以观察模型学到了什么。
这里我们想要知道某一个filter到底学习到了什么,我们需要做两件事情:①Filter Visualization:挑几张图片看看某个filter的输出;②Filter Activation:看看什么图片可以最大程度地activate该filter。
在代码实现方面,我们一般是直接把图片输入到model,然后直接forward,那要如何取出model中某层的输出呢?虽然我们可以直接修改model的forward函数使其返回某层的输出,但这样比较麻烦,还可能会因此改动其它部分的代码。因此PyTorch提供了方便的解决方法:hook。
-
LIME
绿色代表一个component和结果正相关,红色则代表该component和结果负相关。
《"Why Should I Trust You?”: Explaining the predictions of Any Classifier》
注:根据助教的示例,我遇到了一个BUG
KeyError: '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):@绝版臭咸鱼
微信公众号:@臭咸鱼
转载请注明出处,欢迎讨论和交流!