使用神经网络进行预测时,一个明显的缺陷就是缺少可解释性,我们不能通过一些简单的方法来知道网络做出决策或者预测的理由,这在很多方面就使得它的应用受限。
虽然不能通过一些数学方法来证明模型的有效性,但我们仍能够通过一些可视化热力图的方法来观测一下原始数据中的哪些部分对我们网络影响较大。
实现热力图绘制的方法有很多,如:CAM, Grad-CAM, Contrastive EBP等。在热力图生成之后,因为没有原始数据信息,所以我们并不能很直观地观测到模型到底重点关注了图像的哪些区域。这时将热力图叠加到原始图像上的想法就会很自然的产生。这里存在的一个问题是原始图像的色域空间可能和产生的热力图的色域空间是不一致的,当二者叠加的时候,会产生颜色的遮挡。并且因为产生的热力图的尺寸应该与原始图像尺寸一致或者调整到与原始尺寸一致,这样当二者直接简单地叠加的话,产生的图像可能并不是我们想要的,因此,我们需要先对热力图数据进行一些简单的像素处理,然后在考虑与原始图像的融合。以下部分的安排为:1. 热力图的产生 2. 热力图与原始图的叠加 3. 热力图与原始图融合优化
1. 热力图产生
在这里使用3D-Grad-CAM的方法来实现热力图绘制的方法,使用的图像尺寸为144, 168, 152 代码如下:
def cam(img_path, model_path, relu=True, sigmoid=False):
# grad-cam
img_data = np.load(img_path)
img_data = img_data[np.newaxis, :, :, :, np.newaxis]
max_ = np.max(img_data)