CAM可视化卷积神经网络
CAM全称 Class Activation Mapping,分类热力图。目的帮助我们理解模型在预测时关注图像的哪些部分,验证模型的可解释性。
图像分类
回忆下,在CNN的最后一个卷积层之后,用全局平均池化(池化这个词不好,一看到这个我想到水池,化粪池,其实功能是粗采样,你们说对不对吧)得到每个通道的平均值,然后通过一个全连接层输出分类结果。
输入图像->卷积层->特征图->全局平均池化层->全连接层->分类得分
全连接层里是权重矩阵,对吧,就是一个分类有一个权重向量,每次反向更新。权重向量长度就是通道数。
我们算出得分是哪个分类,然后取那个分类的权重向量。那么我们将这些权重乘以原始的特征图,得到一个热力图,表示模型对图像不同区域的关注程度。
注意:这里是乘以特征图,并非原图。
【权重乘以所有通道的特征图后,怎么看】
比如通道512个,每个通道是一张28*28的图。权重向量shape是[512]。特征图本身啥看不出,
你要把特征图*权重后相加,再归一化,再叠加到原始图上,才能看出效果。我的最简单的,特征图还能看出苹果的噢。
【啥是热力图】
import cv2
import numpy as npsize=500
cam = np.zeros((size,size))center_x,center_y=200,200
radius=100for i in range(size):for j in range(size):distance = np.sqrt((i-center_x)**2 + (j-center_y)**2)if distance <= radius:cam[i,j] = np.exp(-distance**2/(2 * (radius/2)**2))
cam = np.uint8(255*cam)heatmap = cv2.applyColorMap(cam,cv2.COLORMAP_TURBO)img = cv2.imread("d:\\aaaa.jpg")overlay= cv2.addWeighted(heatmap,0.4,img,0.6,0)
cv2.imshow("overlay image",overlay)
cv2.waitKey(0)
cv2.destoryAllWindows()
图像分类