可视化

通过可视化,我们可以更好地了解CNN网络是如何学习输入图像的特征。

  • 热力图/得分图可视化
  • 特征图可视化
  • 权值可视化
  • 模型计算图可视化

热力图/得分图可视化

也叫得分图。用热力图的形式展示网络的决策依据。

对于深度卷积神经网络,通过多次卷积核池化之后,最后一层卷积层包含了最丰富的空间和语义信息。所以最后一层卷积层也许可以对卷积神经网络的解释起到作用。

CAM(Class Activation Mapping)

思路:通过替换全连接层为“GAP层”,重新训练得到“最后一层的特征图”和每个特征图对应的“权重”,对特征图进行“加权和”后“上采样”得到最终结果。

在最后一层卷积层之后进行GAP(Global average pooling:求每张特征图所有像素的均值)。

nin_gap

如图所示,经过GAP之后的特征图(实际上是softmax层)与输出层的连接关系。实质上是一个没有偏置项的全连接层。因此,对于每个类别C,都有K(特征图个数)个对应的权值W。

nin_gap fc

如图所示,把GAP之前的特征图进行加权和就可以得到CAM(由于特征图大小和原图不一致,需要将特征图上采样到原图大小)。

nin_gap cam

所以,该方法叫类别激活图(Class Activation Mapping)。

该方法的缺点:需要修改原模型的结构,导致需要重新训练该模型,大大限制了它的使用场景。

Grad-CAM

思路:和CAM基本一致,主要区别是得到特征图对应的权值的过程:用梯度的全局平均来计算权重。

事实上,经过严格的数学推导,Grad-CAM与CAM计算出来的权重是等价的。

权重可以通过下式计算,可理解为“梯度的全局平均”,表示特征图k对类别c的重要性。

grad_cam_weight

其中,Z是特征图的像素个数,y_c是对应的类别C的分数。A_ij_k为第k个特征图(i,j)位置处的值。微分表示类别c的得分对特征图的导数。

求得类别对所有特征图的权重后,对特征图进行“加权和”并使用ReLU激活后进行“上采样”就可以得到最终结果。

grad_cam_sum

Grad-CAM的不仅可以对图片分类进行解释。只要用到了CNN就可以用Grad-CAM进行解释,如图像描述(Image Captioning),视觉问答(Visual Question Answering)等,所需要做的只不过是把y_c换为对应模型中的值即可。

grad_cam_overview

项目

Github项目链接:Grad CAM

项目运行截图:

grad_cam_result

其它方法

  • 待补充

特征图可视化

得到指定层的特征图,输出成图片形式即可。

权值可视化

对训练后的网络权值进行可视化可以判断模型的优劣及是否欠(过)拟合。

经过良好训练的网络权值通常含有多个明显而平滑的卷积器,且没有任何干扰特征,表现为美观、光滑。

若在权重中观察到相关干扰特征,可能原因是网络未被充分训练,或是正则化强度较低导致了过拟合效应,表现为噪声图像,或者图案相关性太高(很规则的点和条纹),或者缺乏结构性,或有较多‘死’区域。

得到指定层的权值,输出成图片形式即可。

模型计算图可视化

计算图的可视化一般来说很简单。

Caffe

执行 draw_net.py 即可。

参见:caffe draw_net

Tensorflow

使用TensorBoard和summary。

参见:TensorBoard Summary

Reference

Network In Network

Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization

凭什么相信你,我的CNN模型?(篇一:CAM和Grad-CAM)